Tue, 30 Jul 2024 17:45:46 +0200
Implemented actions to show the dependencies of a package and upgrade them using 'runpip' because 'pipx' doesn't upgrade them when upgrading the package.
--- a/PKGLIST Mon Jul 29 11:58:31 2024 +0200 +++ b/PKGLIST Tue Jul 30 17:45:46 2024 +0200 @@ -6,6 +6,8 @@ PipxInterface/Pipx.py PipxInterface/PipxAppStartDialog.py PipxInterface/PipxAppStartDialog.ui +PipxInterface/PipxDependenciesDialog.py +PipxInterface/PipxDependenciesDialog.ui PipxInterface/PipxExecDialog.py PipxInterface/PipxExecDialog.ui PipxInterface/PipxInterpretersDialog.py @@ -19,6 +21,7 @@ PipxInterface/PipxWidget.py PipxInterface/PipxWidget.ui PipxInterface/Ui_PipxAppStartDialog.py +PipxInterface/Ui_PipxDependenciesDialog.py PipxInterface/Ui_PipxExecDialog.py PipxInterface/Ui_PipxInterpretersDialog.py PipxInterface/Ui_PipxPackagesInputDialog.py
--- a/PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.Pipx.html Mon Jul 29 11:58:31 2024 +0200 +++ b/PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.Pipx.html Tue Jul 30 17:45:46 2024 +0200 @@ -56,6 +56,10 @@ <td>Constructor</td> </tr> <tr> +<td><a href="#Pipx.__getPackageDependencies">__getPackageDependencies</a></td> +<td>Private method to get a list of dependencies of a given package.</td> +</tr> +<tr> <td><a href="#Pipx.__getPipxExecutable">__getPipxExecutable</a></td> <td>Private method to get the path name of the pipx executable.</td> </tr> @@ -76,10 +80,18 @@ <td>Public method to ensure that the directory where pipx stores apps is in your PATH environment variable.</td> </tr> <tr> +<td><a href="#Pipx.getAllPackageDependencies">getAllPackageDependencies</a></td> +<td>Public method to get the list of package dependencies.</td> +</tr> +<tr> <td><a href="#Pipx.getInstalledPackages">getInstalledPackages</a></td> <td>Public method to get the installed packages.</td> </tr> <tr> +<td><a href="#Pipx.getOutdatedPackageDependencies">getOutdatedPackageDependencies</a></td> +<td>Public method to get the list of outdated package dependencies.</td> +</tr> +<tr> <td><a href="#Pipx.getPipxInterpretersList">getPipxInterpretersList</a></td> <td>Public method returning a list all standalone interpreters.</td> </tr> @@ -100,6 +112,10 @@ <td>Public method to get the version tuple of the installed pipx package.</td> </tr> <tr> +<td><a href="#Pipx.getUptodatePackageDependencies">getUptodatePackageDependencies</a></td> +<td>Public method to get the list of up-to-date package dependencies.</td> +</tr> +<tr> <td><a href="#Pipx.installAllPackages">installAllPackages</a></td> <td>Public method to install all packages define by a given spec metadata file with given options.</td> </tr> @@ -144,6 +160,10 @@ <td>Public method to upgrade the given package.</td> </tr> <tr> +<td><a href="#Pipx.upgradePackageDependencies">upgradePackageDependencies</a></td> +<td>Public method to upgrade the dependencies of the given package.</td> +</tr> +<tr> <td><a href="#Pipx.upgradeSharedLibraries">upgradeSharedLibraries</a></td> <td>Public method to upgrade shared libraries.</td> </tr> @@ -169,6 +189,40 @@ reference to the user interface object </dd> </dl> +<a NAME="Pipx.__getPackageDependencies" ID="Pipx.__getPackageDependencies"></a> +<h4>Pipx.__getPackageDependencies</h4> +<b>__getPackageDependencies</b>(<i>package, uptodate=False, outdated=False</i>) +<p> + Private method to get a list of dependencies of a given package. +</p> + +<dl> + +<dt><i>package</i> (str)</dt> +<dd> +name of the package +</dd> +<dt><i>uptodate</i> (TYPE (optional))</dt> +<dd> +DESCRIPTION (defaults to False) +</dd> +<dt><i>outdated</i> (TYPE (optional))</dt> +<dd> +DESCRIPTION (defaults to False) +</dd> +</dl> +<dl> +<dt>Return:</dt> +<dd> +list of dictionaries as returned by 'pip' +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +list[dict[str: str]] +</dd> +</dl> <a NAME="Pipx.__getPipxExecutable" ID="Pipx.__getPipxExecutable"></a> <h4>Pipx.__getPipxExecutable</h4> <b>__getPipxExecutable</b>(<i></i>) @@ -277,6 +331,32 @@ in your PATH environment variable. </p> +<a NAME="Pipx.getAllPackageDependencies" ID="Pipx.getAllPackageDependencies"></a> +<h4>Pipx.getAllPackageDependencies</h4> +<b>getAllPackageDependencies</b>(<i>package</i>) +<p> + Public method to get the list of package dependencies. +</p> + +<dl> + +<dt><i>package</i> (str)</dt> +<dd> +name of the package +</dd> +</dl> +<dl> +<dt>Return:</dt> +<dd> +list of tuples containing the dependency name and version +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +list of tuple of (str, str) +</dd> +</dl> <a NAME="Pipx.getInstalledPackages" ID="Pipx.getInstalledPackages"></a> <h4>Pipx.getInstalledPackages</h4> <b>getInstalledPackages</b>(<i></i>) @@ -296,6 +376,33 @@ list of dict[str, str | list] </dd> </dl> +<a NAME="Pipx.getOutdatedPackageDependencies" ID="Pipx.getOutdatedPackageDependencies"></a> +<h4>Pipx.getOutdatedPackageDependencies</h4> +<b>getOutdatedPackageDependencies</b>(<i>package</i>) +<p> + Public method to get the list of outdated package dependencies. +</p> + +<dl> + +<dt><i>package</i> (str)</dt> +<dd> +name of the package +</dd> +</dl> +<dl> +<dt>Return:</dt> +<dd> +list of tuples containing the dependency name, version and latest + version +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +list of tuple of (str, str, str) +</dd> +</dl> <a NAME="Pipx.getPipxInterpretersList" ID="Pipx.getPipxInterpretersList"></a> <h4>Pipx.getPipxInterpretersList</h4> <b>getPipxInterpretersList</b>(<i></i>) @@ -393,6 +500,32 @@ tuple of (int, int, int) </dd> </dl> +<a NAME="Pipx.getUptodatePackageDependencies" ID="Pipx.getUptodatePackageDependencies"></a> +<h4>Pipx.getUptodatePackageDependencies</h4> +<b>getUptodatePackageDependencies</b>(<i>package</i>) +<p> + Public method to get the list of up-to-date package dependencies. +</p> + +<dl> + +<dt><i>package</i> (str)</dt> +<dd> +name of the package +</dd> +</dl> +<dl> +<dt>Return:</dt> +<dd> +list of tuples containing the dependency name and version +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +list of tuple of (str, str) +</dd> +</dl> <a NAME="Pipx.installAllPackages" ID="Pipx.installAllPackages"></a> <h4>Pipx.installAllPackages</h4> <b>installAllPackages</b>(<i>specFile, interpreterVersion="", fetchMissingInterpreter=False, forceVenvModification=False, systemSitePackages=False, </i>) @@ -609,6 +742,20 @@ name of the package </dd> </dl> +<a NAME="Pipx.upgradePackageDependencies" ID="Pipx.upgradePackageDependencies"></a> +<h4>Pipx.upgradePackageDependencies</h4> +<b>upgradePackageDependencies</b>(<i>package</i>) +<p> + Public method to upgrade the dependencies of the given package. +</p> + +<dl> + +<dt><i>package</i> (str)</dt> +<dd> +name of the package +</dd> +</dl> <a NAME="Pipx.upgradeSharedLibraries" ID="Pipx.upgradeSharedLibraries"></a> <h4>Pipx.upgradeSharedLibraries</h4> <b>upgradeSharedLibraries</b>(<i></i>)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.PipxDependenciesDialog.html Tue Jul 30 17:45:46 2024 +0200 @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<html><head> +<title>Plugin_Pipx_Interface.PipxInterface.PipxDependenciesDialog</title> +<meta charset="UTF-8"> +<link rel="stylesheet" href="styles.css"> +</head> +<body> +<a NAME="top" ID="top"></a> +<h1>Plugin_Pipx_Interface.PipxInterface.PipxDependenciesDialog</h1> +<p> +Module implementing a dialog to show the package dependencies. +</p> + +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> + +<h3>Classes</h3> +<table> +<tr> +<td><a href="#PipxDependenciesDialog">PipxDependenciesDialog</a></td> +<td>Class implementing a dialog to show the package dependencies.</td> +</tr> +</table> + +<h3>Functions</h3> +<table> +<tr><td>None</td></tr> +</table> + +<hr /> +<hr /> +<a NAME="PipxDependenciesDialog" ID="PipxDependenciesDialog"></a> +<h2>PipxDependenciesDialog</h2> +<p> + Class implementing a dialog to show the package dependencies. +</p> + +<h3>Derived from</h3> +QDialog, Ui_PipxDependenciesDialog +<h3>Class Attributes</h3> +<table> +<tr><td>AllMode</td></tr> +<tr><td>AvailableVersionColumn</td></tr> +<tr><td>DependencyColumn</td></tr> +<tr><td>InstalledVersionColumn</td></tr> +<tr><td>OutdatedMode</td></tr> +<tr><td>UptodateMode</td></tr> +</table> + +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> + +<h3>Methods</h3> +<table> +<tr> +<td><a href="#PipxDependenciesDialog.__init__">PipxDependenciesDialog</a></td> +<td>Constructor</td> +</tr> +<tr> +<td><a href="#PipxDependenciesDialog.__resizeColumns">__resizeColumns</a></td> +<td>Private method to resize the columns of the dependencies list.</td> +</tr> +</table> + +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> + + +<a NAME="PipxDependenciesDialog.__init__" ID="PipxDependenciesDialog.__init__"></a> +<h4>PipxDependenciesDialog (Constructor)</h4> +<b>PipxDependenciesDialog</b>(<i>package, dependencies, mode, parent=None</i>) +<p> + Constructor +</p> + +<dl> + +<dt><i>package</i> (str)</dt> +<dd> +name of the package +</dd> +<dt><i>dependencies</i> (list of tuple of (str, str, str) or list of tuple of (str, str))</dt> +<dd> +list of package dependency data +</dd> +<dt><i>mode</i> (int)</dt> +<dd> +dialog mode +</dd> +<dt><i>parent</i> (QWidget (optional))</dt> +<dd> +reference to the parent widget (defaults to None) +</dd> +</dl> +<a NAME="PipxDependenciesDialog.__resizeColumns" ID="PipxDependenciesDialog.__resizeColumns"></a> +<h4>PipxDependenciesDialog.__resizeColumns</h4> +<b>__resizeColumns</b>(<i></i>) +<p> + Private method to resize the columns of the dependencies list. +</p> + +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html>
--- a/PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.PipxWidget.html Mon Jul 29 11:58:31 2024 +0200 +++ b/PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.PipxWidget.html Tue Jul 30 17:45:46 2024 +0200 @@ -142,14 +142,26 @@ <td>Private method to determine the list of selected packages.</td> </tr> <tr> +<td><a href="#PipxWidget.__showDependencies">__showDependencies</a></td> +<td>Private slot to show a dialog with the dependencies of the selected package.</td> +</tr> +<tr> <td><a href="#PipxWidget.__showInterpreters">__showInterpreters</a></td> <td>Private slot to show a list of standalone Python interpreters.</td> </tr> <tr> +<td><a href="#PipxWidget.__showOutdatedDependencies">__showOutdatedDependencies</a></td> +<td>Private slot to show a dialog with the outdated dependencies of the selected package.</td> +</tr> +<tr> <td><a href="#PipxWidget.__showPipxVersion">__showPipxVersion</a></td> <td>Private method to show the pipx version in the widget header.</td> </tr> <tr> +<td><a href="#PipxWidget.__showUptodateDependencies">__showUptodateDependencies</a></td> +<td>Private slot to show a dialog with the up-to-date dependencies of the selected package.</td> +</tr> +<tr> <td><a href="#PipxWidget.__uninstallAllPackages">__uninstallAllPackages</a></td> <td>Private slot to uninstall all packages.</td> </tr> @@ -162,6 +174,10 @@ <td>Private slot to upgrade all packages.</td> </tr> <tr> +<td><a href="#PipxWidget.__upgradeDependencies">__upgradeDependencies</a></td> +<td>Private slot to upgrade the outdated dependencies of the selected package.</td> +</tr> +<tr> <td><a href="#PipxWidget.__upgradePackage">__upgradePackage</a></td> <td>Private slot to upgrade the selected package.</td> </tr> @@ -459,6 +475,13 @@ list of str </dd> </dl> +<a NAME="PipxWidget.__showDependencies" ID="PipxWidget.__showDependencies"></a> +<h4>PipxWidget.__showDependencies</h4> +<b>__showDependencies</b>(<i></i>) +<p> + Private slot to show a dialog with the dependencies of the selected package. +</p> + <a NAME="PipxWidget.__showInterpreters" ID="PipxWidget.__showInterpreters"></a> <h4>PipxWidget.__showInterpreters</h4> <b>__showInterpreters</b>(<i></i>) @@ -466,6 +489,14 @@ Private slot to show a list of standalone Python interpreters. </p> +<a NAME="PipxWidget.__showOutdatedDependencies" ID="PipxWidget.__showOutdatedDependencies"></a> +<h4>PipxWidget.__showOutdatedDependencies</h4> +<b>__showOutdatedDependencies</b>(<i></i>) +<p> + Private slot to show a dialog with the outdated dependencies of the selected + package. +</p> + <a NAME="PipxWidget.__showPipxVersion" ID="PipxWidget.__showPipxVersion"></a> <h4>PipxWidget.__showPipxVersion</h4> <b>__showPipxVersion</b>(<i></i>) @@ -473,6 +504,14 @@ Private method to show the pipx version in the widget header. </p> +<a NAME="PipxWidget.__showUptodateDependencies" ID="PipxWidget.__showUptodateDependencies"></a> +<h4>PipxWidget.__showUptodateDependencies</h4> +<b>__showUptodateDependencies</b>(<i></i>) +<p> + Private slot to show a dialog with the up-to-date dependencies of the selected + package. +</p> + <a NAME="PipxWidget.__uninstallAllPackages" ID="PipxWidget.__uninstallAllPackages"></a> <h4>PipxWidget.__uninstallAllPackages</h4> <b>__uninstallAllPackages</b>(<i></i>) @@ -494,6 +533,13 @@ Private slot to upgrade all packages. </p> +<a NAME="PipxWidget.__upgradeDependencies" ID="PipxWidget.__upgradeDependencies"></a> +<h4>PipxWidget.__upgradeDependencies</h4> +<b>__upgradeDependencies</b>(<i></i>) +<p> + Private slot to upgrade the outdated dependencies of the selected package. +</p> + <a NAME="PipxWidget.__upgradePackage" ID="PipxWidget.__upgradePackage"></a> <h4>PipxWidget.__upgradePackage</h4> <b>__upgradePackage</b>(<i></i>)
--- a/PipxInterface/Documentation/Source/index-Plugin_Pipx_Interface.PipxInterface.html Mon Jul 29 11:58:31 2024 +0200 +++ b/PipxInterface/Documentation/Source/index-Plugin_Pipx_Interface.PipxInterface.html Tue Jul 30 17:45:46 2024 +0200 @@ -32,6 +32,10 @@ <td>Module implementing a dialog to enter the application command line parameters and to execute the app.</td> </tr> <tr> +<td><a href="Plugin_Pipx_Interface.PipxInterface.PipxDependenciesDialog.html">PipxDependenciesDialog</a></td> +<td>Module implementing a dialog to show the package dependencies.</td> +</tr> +<tr> <td><a href="Plugin_Pipx_Interface.PipxInterface.PipxExecDialog.html">PipxExecDialog</a></td> <td>Module implementing a dialog showing the output of a pip command.</td> </tr>
--- a/PipxInterface/Pipx.py Mon Jul 29 11:58:31 2024 +0200 +++ b/PipxInterface/Pipx.py Tue Jul 30 17:45:46 2024 +0200 @@ -435,40 +435,6 @@ if res: dia.exec() - def checkPackageOutdated(self, package): - """ - Public method to check, if a given package is outdated. - - @param package name of the package - @type str - @return tuple containing the latest version in case the package is outdated - or None otherwise and a flag indicating any outdated dependencies - @rtype tuple of (str or None, bool) - """ - args = ["runpip", package, "list", "--outdated", "--format", "json"] - if Preferences.getPip("PipSearchIndex"): - indexUrl = Preferences.getPip("PipSearchIndex") + "/simple" - args += ["--index-url", indexUrl] - ok, output = self.runPipxProcess(args) - if not ok: - EricMessageBox.information( - None, - self.tr("Check Outdated Package"), - self.tr( - "<p>The status of package <b>{0}</b> could not be determined.</p>" - "<p>Reason: {1}</p>" - ).format(package, output), - ) - return None, False - - outdatedList = json.loads(output) - # check if the main package is in the list - for outdatedPackage in outdatedList: - if outdatedPackage["name"] == package: - return outdatedPackage["latest_version"], len(outdatedList) > 1 - - return None, bool(outdatedList) - def upgradePackage(self, package): """ Public method to upgrade the given package. @@ -543,3 +509,143 @@ res = dia.startProcess(self.__getPipxExecutable(), args) if res: dia.exec() + + ############################################################################ + ## Special methods based on 'runpip' + ############################################################################ + + def checkPackageOutdated(self, package): + """ + Public method to check, if a given package is outdated. + + @param package name of the package + @type str + @return tuple containing the latest version in case the package is outdated + or None otherwise and a flag indicating any outdated dependencies + @rtype tuple of (str or None, bool) + """ + args = ["runpip", package, "list", "--outdated", "--format", "json"] + if Preferences.getPip("PipSearchIndex"): + indexUrl = Preferences.getPip("PipSearchIndex") + "/simple" + args += ["--index-url", indexUrl] + ok, output = self.runPipxProcess(args) + if not ok: + EricMessageBox.information( + None, + self.tr("Check Outdated Package"), + self.tr( + "<p>The status of package <b>{0}</b> could not be determined.</p>" + "<p>Reason: {1}</p>" + ).format(package, output), + ) + return None, False + + outdatedList = json.loads(output) + # check if the main package is in the list + for outdatedPackage in outdatedList: + if outdatedPackage["name"] == package: + return outdatedPackage["latest_version"], len(outdatedList) > 1 + + return None, bool(outdatedList) + + def __getPackageDependencies(self, package, uptodate=False, outdated=False): + """ + Private method to get a list of dependencies of a given package. + + @param package name of the package + @type str + @param uptodate DESCRIPTION (defaults to False) + @type TYPE (optional) + @param outdated DESCRIPTION (defaults to False) + @type TYPE (optional) + @return list of dictionaries as returned by 'pip' + @rtype list[dict[str: str]] + """ + if outdated: + args = ["runpip", package, "list", "--format", "json", "--outdated"] + elif uptodate: + args = ["runpip", package, "list", "--format", "json", "--uptodate"] + else: + args = ["runpip", package, "list", "--format", "json"] + if Preferences.getPip("PipSearchIndex"): + indexUrl = Preferences.getPip("PipSearchIndex") + "/simple" + args += ["--index-url", indexUrl] + ok, output = self.runPipxProcess(args) + if not ok: + EricMessageBox.information( + None, + self.tr("Get Package Dependencies"), + self.tr( + "<p>The status of dependencies of package <b>{0}</b> could not" + " be determined.</p><p>Reason: {1}</p>" + ).format(package, output), + ) + return [] + + return json.loads(output) + + def getOutdatedPackageDependencies(self, package): + """ + Public method to get the list of outdated package dependencies. + + @param package name of the package + @type str + @return list of tuples containing the dependency name, version and latest + version + @rtype list of tuple of (str, str, str) + """ + outdatedList = self.__getPackageDependencies(package=package, outdated=True) + return [ + (d["name"], d["version"], d["latest_version"]) + for d in outdatedList + if d["name"] != package + ] + + def getUptodatePackageDependencies(self, package): + """ + Public method to get the list of up-to-date package dependencies. + + @param package name of the package + @type str + @return list of tuples containing the dependency name and version + @rtype list of tuple of (str, str) + """ + uptodateList = self.__getPackageDependencies(package=package, uptodate=True) + return [(d["name"], d["version"]) for d in uptodateList if d["name"] != package] + + def getAllPackageDependencies(self, package): + """ + Public method to get the list of package dependencies. + + @param package name of the package + @type str + @return list of tuples containing the dependency name and version + @rtype list of tuple of (str, str) + """ + dependenciesList = self.__getPackageDependencies(package=package) + return [ + (d["name"], d["version"]) for d in dependenciesList if d["name"] != package + ] + + def upgradePackageDependencies(self, package): + """ + Public method to upgrade the dependencies of the given package. + + @param package name of the package + @type str + """ + outdatedDependencies = [ + d[0] for d in self.getOutdatedPackageDependencies(package=package) + ] + args = [ + "runpip", + package, + "install", + "--upgrade", + "--prefer-binary", + ] + outdatedDependencies + + dia = PipxExecDialog(self.tr("Upgrade Dependencies")) + res = dia.startProcess(self.__getPipxExecutable(), args) + if res: + dia.exec()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PipxInterface/PipxDependenciesDialog.py Tue Jul 30 17:45:46 2024 +0200 @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2024 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog to show the package dependencies. +""" + +from PyQt6.QtCore import Qt +from PyQt6.QtWidgets import QDialog, QTreeWidgetItem + +from .Ui_PipxDependenciesDialog import Ui_PipxDependenciesDialog + + +class PipxDependenciesDialog(QDialog, Ui_PipxDependenciesDialog): + """ + Class implementing a dialog to show the package dependencies. + """ + + AllMode = 0 + UptodateMode = 1 + OutdatedMode = 2 + + DependencyColumn = 0 + InstalledVersionColumn = 1 + AvailableVersionColumn = 2 + + def __init__(self, package, dependencies, mode, parent=None): + """ + Constructor + + @param package name of the package + @type str + @param dependencies list of package dependency data + @type list of tuple of (str, str, str) or list of tuple of (str, str) + @param mode dialog mode + @type int + @param parent reference to the parent widget (defaults to None) + @type QWidget (optional) + """ + super().__init__(parent) + self.setupUi(self) + + if mode != PipxDependenciesDialog.OutdatedMode: + self.dependenciesList.hideColumn( + PipxDependenciesDialog.AvailableVersionColumn + ) + + if mode == PipxDependenciesDialog.OutdatedMode: + headerMsg = self.tr("Outdated Dependencies of package <b>{0}</b>") + elif mode == PipxDependenciesDialog.UptodateMode: + headerMsg = self.tr("Up-to-date Dependencies of package <b>{0}</b>") + else: + headerMsg = self.tr("Dependencies of package <b>{0}</b>") + self.headerLabel.setText(headerMsg.format(package)) + + for dependency in dependencies: + QTreeWidgetItem(self.dependenciesList, list(dependency)) + + self.dependenciesList.sortItems( + PipxDependenciesDialog.DependencyColumn, Qt.SortOrder.AscendingOrder + ) + self.__resizeColumns() + + def __resizeColumns(self): + """ + Private method to resize the columns of the dependencies list. + """ + self.dependenciesList.header().setStretchLastSection(True) + self.dependenciesList.resizeColumnToContents( + PipxDependenciesDialog.DependencyColumn + ) + self.dependenciesList.resizeColumnToContents( + PipxDependenciesDialog.InstalledVersionColumn + ) + self.dependenciesList.resizeColumnToContents( + PipxDependenciesDialog.AvailableVersionColumn + )
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PipxInterface/PipxDependenciesDialog.ui Tue Jul 30 17:45:46 2024 +0200 @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>PipxDependenciesDialog</class> + <widget class="QDialog" name="PipxDependenciesDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>498</width> + <height>700</height> + </rect> + </property> + <property name="windowTitle"> + <string>Package Dependencies</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="headerLabel"> + <property name="text"> + <string notr="true">Header</string> + </property> + </widget> + </item> + <item> + <widget class="QTreeWidget" name="dependenciesList"> + <property name="editTriggers"> + <set>QAbstractItemView::NoEditTriggers</set> + </property> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::NoSelection</enum> + </property> + <property name="rootIsDecorated"> + <bool>false</bool> + </property> + <property name="itemsExpandable"> + <bool>false</bool> + </property> + <property name="allColumnsShowFocus"> + <bool>true</bool> + </property> + <column> + <property name="text"> + <string>Dependency</string> + </property> + </column> + <column> + <property name="text"> + <string>Installed Version</string> + </property> + </column> + <column> + <property name="text"> + <string>Available Version</string> + </property> + </column> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Close</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>PipxDependenciesDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>PipxDependenciesDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui>
--- a/PipxInterface/PipxWidget.py Mon Jul 29 11:58:31 2024 +0200 +++ b/PipxInterface/PipxWidget.py Tue Jul 30 17:45:46 2024 +0200 @@ -23,6 +23,7 @@ from .Pipx import Pipx from .PipxAppStartDialog import PipxAppStartDialog +from .PipxDependenciesDialog import PipxDependenciesDialog from .Ui_PipxWidget import Ui_PipxWidget @@ -146,7 +147,7 @@ ) ################################################################### - ## Menu with upinstall related actions + ## Menu with uninstall related actions ################################################################### self.__uninstallSubmenu = QMenu(self.tr("Uninstall")) @@ -158,6 +159,25 @@ ) ################################################################### + ## Menu with dependencies related actions + ################################################################### + + self.__dependenciseSubmenu = QMenu(self.tr("Dependencies")) + self.__showDependenciesAct = self.__dependenciseSubmenu.addAction( + self.tr("Show All Dependencies"), self.__showDependencies + ) + self.__showOutdatedDependenciesAct = self.__dependenciseSubmenu.addAction( + self.tr("Show Outdated Dependencies"), self.__showOutdatedDependencies + ) + self.__showUptodateDependenciesAct = self.__dependenciseSubmenu.addAction( + self.tr("Show Up-to-date Dependencies"), self.__showUptodateDependencies + ) + self.__dependenciseSubmenu.addSeparator() + self.__upgradeDependenciesAct = self.__dependenciseSubmenu.addAction( + self.tr("Upgrade Dependencies"), self.__upgradeDependencies + ) + + ################################################################### ## Main menu ################################################################### @@ -168,6 +188,10 @@ self.__pipxMenu.addSeparator() self.__uninstallSubmenuAct = self.__pipxMenu.addMenu(self.__uninstallSubmenu) self.__pipxMenu.addSeparator() + self.__dependenciseSubmenuAct = self.__pipxMenu.addMenu( + self.__dependenciseSubmenu + ) + self.__pipxMenu.addSeparator() self.__pipxMenu.addAction( self.tr("Standalone Interpreters"), self.__showInterpreters ) @@ -467,6 +491,62 @@ """ self.__pipx.ensurePath() + @pyqtSlot() + def __showDependencies(self): + """ + Private slot to show a dialog with the dependencies of the selected package. + """ + package = self.__selectedPackages()[0] + dependencies = self.__pipx.getAllPackageDependencies(package=package) + + dlg = PipxDependenciesDialog( + package=package, + dependencies=dependencies, + mode=PipxDependenciesDialog.AllMode, + ) + dlg.exec() + + @pyqtSlot() + def __showOutdatedDependencies(self): + """ + Private slot to show a dialog with the outdated dependencies of the selected + package. + """ + package = self.__selectedPackages()[0] + dependencies = self.__pipx.getOutdatedPackageDependencies(package=package) + + dlg = PipxDependenciesDialog( + package=package, + dependencies=dependencies, + mode=PipxDependenciesDialog.OutdatedMode, + ) + dlg.exec() + + @pyqtSlot() + def __showUptodateDependencies(self): + """ + Private slot to show a dialog with the up-to-date dependencies of the selected + package. + """ + package = self.__selectedPackages()[0] + dependencies = self.__pipx.getUptodatePackageDependencies(package=package) + + dlg = PipxDependenciesDialog( + package=package, + dependencies=dependencies, + mode=PipxDependenciesDialog.UptodateMode, + ) + dlg.exec() + + @pyqtSlot() + def __upgradeDependencies(self): + """ + Private slot to upgrade the outdated dependencies of the selected package. + """ + package = self.__selectedPackages()[0] + self.__pipx.upgradePackageDependencies(package=package) + self.on_refreshButton_clicked() + ####################################################################### ## Main widget related methods below ####################################################################### @@ -632,10 +712,25 @@ 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.__upgradeDependenciesAct.setEnabled( + len(selectedPackages) == 1 + and bool( + selectedPackageItems[0].data(0, PipxWidget.OutdatedDependenciesRole) + ) + ) + def __selectedPackages(self): """ Private method to determine the list of selected packages.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PipxInterface/Ui_PipxDependenciesDialog.py Tue Jul 30 17:45:46 2024 +0200 @@ -0,0 +1,48 @@ +# Form implementation generated from reading ui file 'PipxInterface/PipxDependenciesDialog.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_PipxDependenciesDialog(object): + def setupUi(self, PipxDependenciesDialog): + PipxDependenciesDialog.setObjectName("PipxDependenciesDialog") + PipxDependenciesDialog.resize(498, 700) + PipxDependenciesDialog.setSizeGripEnabled(True) + self.verticalLayout = QtWidgets.QVBoxLayout(PipxDependenciesDialog) + self.verticalLayout.setObjectName("verticalLayout") + self.headerLabel = QtWidgets.QLabel(parent=PipxDependenciesDialog) + self.headerLabel.setText("Header") + self.headerLabel.setObjectName("headerLabel") + self.verticalLayout.addWidget(self.headerLabel) + self.dependenciesList = QtWidgets.QTreeWidget(parent=PipxDependenciesDialog) + self.dependenciesList.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.dependenciesList.setAlternatingRowColors(True) + self.dependenciesList.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.NoSelection) + self.dependenciesList.setRootIsDecorated(False) + self.dependenciesList.setItemsExpandable(False) + self.dependenciesList.setAllColumnsShowFocus(True) + self.dependenciesList.setObjectName("dependenciesList") + self.verticalLayout.addWidget(self.dependenciesList) + self.buttonBox = QtWidgets.QDialogButtonBox(parent=PipxDependenciesDialog) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Close) + self.buttonBox.setObjectName("buttonBox") + self.verticalLayout.addWidget(self.buttonBox) + + self.retranslateUi(PipxDependenciesDialog) + self.buttonBox.accepted.connect(PipxDependenciesDialog.accept) # type: ignore + self.buttonBox.rejected.connect(PipxDependenciesDialog.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(PipxDependenciesDialog) + + def retranslateUi(self, PipxDependenciesDialog): + _translate = QtCore.QCoreApplication.translate + PipxDependenciesDialog.setWindowTitle(_translate("PipxDependenciesDialog", "Package Dependencies")) + self.dependenciesList.headerItem().setText(0, _translate("PipxDependenciesDialog", "Dependency")) + self.dependenciesList.headerItem().setText(1, _translate("PipxDependenciesDialog", "Installed Version")) + self.dependenciesList.headerItem().setText(2, _translate("PipxDependenciesDialog", "Available Version"))
--- a/PipxInterface/i18n/pipx_de.ts Mon Jul 29 11:58:31 2024 +0200 +++ b/PipxInterface/i18n/pipx_de.ts Tue Jul 30 17:45:46 2024 +0200 @@ -54,45 +54,60 @@ <translation>Alle Pakete deinstallieren</translation> </message> <message> - <location filename="../Pipx.py" line="456" /> - <source>Check Outdated Package</source> - <translation>Prüfe veraltete Pakete</translation> - </message> - <message> - <location filename="../Pipx.py" line="457" /> - <source><p>The status of package <b>{0}</b> could not be determined.</p><p>Reason: {1}</p></source> - <translation><p>Der Status des Paketes <b>{0}</b> konnte nicht bestimmt werden.</p><p>Ursache: {1}</p></translation> - </message> - <message> - <location filename="../Pipx.py" line="484" /> + <location filename="../Pipx.py" line="450" /> <source>Upgrade Package</source> <translation>Paket aktualisieren</translation> </message> <message> - <location filename="../Pipx.py" line="494" /> + <location filename="../Pipx.py" line="460" /> <source>Upgrade All Packages</source> <translation>Alle Pakete aktualisieren</translation> </message> <message> - <location filename="../Pipx.py" line="504" /> + <location filename="../Pipx.py" line="470" /> <source>Upgrade Shared Libraries</source> <translation>Gemeinsame Bibliotheken aktualisieren</translation> </message> <message> - <location filename="../Pipx.py" line="518" /> + <location filename="../Pipx.py" line="484" /> <source>Upgrade Interpreters</source> <translation>Interpreter aktualisieren</translation> </message> <message> - <location filename="../Pipx.py" line="531" /> + <location filename="../Pipx.py" line="497" /> <source>Prune Unused Interpreters</source> <translation>Ungenutzte Interpreter entfernen</translation> </message> <message> - <location filename="../Pipx.py" line="542" /> + <location filename="../Pipx.py" line="508" /> <source>Ensure PATH Modifications</source> <translation>PATH-Änderungen sicherstellen</translation> </message> + <message> + <location filename="../Pipx.py" line="535" /> + <source>Check Outdated Package</source> + <translation>Prüfe veraltete Pakete</translation> + </message> + <message> + <location filename="../Pipx.py" line="536" /> + <source><p>The status of package <b>{0}</b> could not be determined.</p><p>Reason: {1}</p></source> + <translation><p>Der Status des Paketes <b>{0}</b> konnte nicht bestimmt werden.</p><p>Ursache: {1}</p></translation> + </message> + <message> + <location filename="../Pipx.py" line="577" /> + <source>Get Package Dependencies</source> + <translation>Paketabhängigkeiten abrufen</translation> + </message> + <message> + <location filename="../Pipx.py" line="578" /> + <source><p>The status of dependencies of package <b>{0}</b> could not be determined.</p><p>Reason: {1}</p></source> + <translation><p>Der Status der Abhängigkeiten des Pakets <b>{0}</b> konnte nicht ermittelt werden.</p><p>Ursache: {1}</p></translation> + </message> + <message> + <location filename="../Pipx.py" line="648" /> + <source>Upgrade Dependencies</source> + <translation>Abhängigkeiten aktualisieren</translation> + </message> </context> <context> <name>PipxAppStartDialog</name> @@ -148,6 +163,44 @@ </message> </context> <context> + <name>PipxDependenciesDialog</name> + <message> + <location filename="../PipxDependenciesDialog.py" line="50" /> + <source>Outdated Dependencies of package <b>{0}</b></source> + <translation>Veraltete Abhängigkeiten des Pakets <b>{0}</b></translation> + </message> + <message> + <location filename="../PipxDependenciesDialog.py" line="52" /> + <source>Up-to-date Dependencies of package <b>{0}</b></source> + <translation>Aktuelle Abhängigkeiten des Pakets <b>{0}</b></translation> + </message> + <message> + <location filename="../PipxDependenciesDialog.py" line="54" /> + <source>Dependencies of package <b>{0}</b></source> + <translation>Abhängigkeiten des Pakets <b>{0}</b></translation> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Package Dependencies</source> + <translation>Paketabhängigkeiten</translation> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Dependency</source> + <translation>Abhängigkeit</translation> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Installed Version</source> + <translation>Installierte Version</translation> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Available Version</source> + <translation>Verfügbare Version</translation> + </message> + </context> + <context> <name>PipxExecDialog</name> <message> <location filename="../PipxExecDialog.ui" line="0" /> @@ -459,184 +512,209 @@ <context> <name>PipxWidget</name> <message> - <location filename="../PipxWidget.py" line="108" /> + <location filename="../PipxWidget.py" line="110" /> <source>Install</source> <translation>Installieren</translation> </message> <message> - <location filename="../PipxWidget.py" line="202" /> - <location filename="../PipxWidget.py" line="110" /> + <location filename="../PipxWidget.py" line="227" /> + <location filename="../PipxWidget.py" line="112" /> <source>Install Packages</source> <translation>Pakete installieren</translation> </message> <message> - <location filename="../PipxWidget.py" line="221" /> - <location filename="../PipxWidget.py" line="113" /> + <location filename="../PipxWidget.py" line="246" /> + <location filename="../PipxWidget.py" line="115" /> <source>Install All Packages</source> <translation>Alle Pakete installieren</translation> </message> <message> - <location filename="../PipxWidget.py" line="117" /> + <location filename="../PipxWidget.py" line="119" /> <source>Re-Install Selected Package</source> <translation>Ausgewähltes Paket neu installieren</translation> </message> <message> - <location filename="../PipxWidget.py" line="319" /> - <location filename="../PipxWidget.py" line="120" /> + <location filename="../PipxWidget.py" line="344" /> + <location filename="../PipxWidget.py" line="122" /> <source>Re-Install All Packages</source> <translation>Alle Pakete neu installieren</translation> </message> <message> - <location filename="../PipxWidget.py" line="277" /> - <location filename="../PipxWidget.py" line="268" /> - <location filename="../PipxWidget.py" line="256" /> - <location filename="../PipxWidget.py" line="240" /> - <location filename="../PipxWidget.py" line="124" /> + <location filename="../PipxWidget.py" line="302" /> + <location filename="../PipxWidget.py" line="293" /> + <location filename="../PipxWidget.py" line="281" /> + <location filename="../PipxWidget.py" line="265" /> + <location filename="../PipxWidget.py" line="126" /> <source>Create Spec Metadata File</source> <translation>Erzeuge Spec-Metadaten-Datei</translation> </message> <message> - <location filename="../PipxWidget.py" line="131" /> + <location filename="../PipxWidget.py" line="133" /> <source>Upgrade</source> <translation>Aktualisieren</translation> </message> <message> - <location filename="../PipxWidget.py" line="133" /> + <location filename="../PipxWidget.py" line="135" /> <source>Check Outdated Packages</source> <translation>Prüfe veraltete Pakete</translation> </message> <message> - <location filename="../PipxWidget.py" line="364" /> - <location filename="../PipxWidget.py" line="137" /> + <location filename="../PipxWidget.py" line="398" /> + <location filename="../PipxWidget.py" line="139" /> <source>Upgrade Selected Package</source> <translation>Ausgewähltes Paket aktualisieren</translation> </message> <message> - <location filename="../PipxWidget.py" line="385" /> - <location filename="../PipxWidget.py" line="140" /> + <location filename="../PipxWidget.py" line="419" /> + <location filename="../PipxWidget.py" line="142" /> <source>Upgrade All Packages</source> <translation>Alle Pakete aktualisieren</translation> </message> <message> - <location filename="../PipxWidget.py" line="144" /> + <location filename="../PipxWidget.py" line="146" /> <source>Upgrade Shared Libraries</source> <translation>Gemeinsame Bibliotheken aktualisieren</translation> </message> <message> - <location filename="../PipxWidget.py" line="151" /> + <location filename="../PipxWidget.py" line="153" /> <source>Uninstall</source> <translation>Deinstallieren</translation> </message> <message> - <location filename="../PipxWidget.py" line="153" /> + <location filename="../PipxWidget.py" line="155" /> <source>Uninstall Selected Package</source> <translation>Ausgewähltes Paket deinstallieren</translation> </message> <message> - <location filename="../PipxWidget.py" line="427" /> - <location filename="../PipxWidget.py" line="156" /> + <location filename="../PipxWidget.py" line="462" /> + <location filename="../PipxWidget.py" line="158" /> <source>Uninstall All Packages</source> <translation>Alle Pakete deinstallieren</translation> </message> <message> - <location filename="../PipxWidget.py" line="171" /> + <location filename="../PipxWidget.py" line="165" /> + <source>Dependencies</source> + <translation>Abhängigkeiten</translation> + </message> + <message> + <location filename="../PipxWidget.py" line="167" /> + <source>Show All Dependencies</source> + <translation>Zeige Alle Abhängigkeiten</translation> + </message> + <message> + <location filename="../PipxWidget.py" line="170" /> + <source>Show Outdated Dependencies</source> + <translation>Zeige Veraltete Abhängigkeiten</translation> + </message> + <message> + <location filename="../PipxWidget.py" line="173" /> + <source>Show Up-to-date Dependencies</source> + <translation>Zeige Aktuelle Abhängigkeiten</translation> + </message> + <message> + <location filename="../PipxWidget.py" line="177" /> + <source>Upgrade Dependencies</source> + <translation>Abhängigkeiten aktualisieren</translation> + </message> + <message> + <location filename="../PipxWidget.py" line="196" /> <source>Standalone Interpreters</source> <translation>Eigenständige Interpreter</translation> </message> <message> - <location filename="../PipxWidget.py" line="175" /> + <location filename="../PipxWidget.py" line="200" /> <source>Ensure PATH Modifications</source> <translation>PATH-Änderungen sicherstellen</translation> </message> <message> - <location filename="../PipxWidget.py" line="178" /> + <location filename="../PipxWidget.py" line="203" /> <source>Configure...</source> <translation>Einstellungen...</translation> </message> <message> - <location filename="../PipxWidget.py" line="242" /> + <location filename="../PipxWidget.py" line="267" /> <source>JSON Files (*.json);;All Files (*)</source> <translation>JSON Dateien (*.json);;Alle Dateien (*)</translation> </message> <message> - <location filename="../PipxWidget.py" line="243" /> + <location filename="../PipxWidget.py" line="268" /> <source>JSON Files (*.json)</source> <translation>JSON-Dateien (*.json)</translation> </message> <message> - <location filename="../PipxWidget.py" line="257" /> + <location filename="../PipxWidget.py" line="282" /> <source><p>The file <b>{0}</b> exists already. Overwrite it?</p></source> <translation><p>Die Datei <b>{0}</b> existiert bereits. Überschreiben?</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="269" /> + <location filename="../PipxWidget.py" line="294" /> <source><p>The spec metadata file <b>{0}</b> was created successfully.</p></source> <translation><p>Die Spec-Metadaten-Datei <b>{0}</b> wurde erfolgreich erzeugt.</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="278" /> + <location filename="../PipxWidget.py" line="303" /> <source><p>The spec metadata file <b>{0}</b> could not be created.</p><p>Reason: {1}</p></source> <translation><p>Die Spec-Metadaten-Datei <b>{0}</b> konnte nicht erzeugt werden.</p><p>Ursache: {1}</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="294" /> + <location filename="../PipxWidget.py" line="319" /> <source>Re-Install Package</source> <translation>Paket neu installieren</translation> </message> <message> - <location filename="../PipxWidget.py" line="295" /> + <location filename="../PipxWidget.py" line="320" /> <source><p>Shall the package <b>{0}</b> really be reinstalled?</p></source> <translation><p>Soll das Paket <b>{0}</b> wirklich neu installiert werden?</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="320" /> + <location filename="../PipxWidget.py" line="345" /> <source>Do you really want to reinstall all packages?</source> <translation>Sollen wirklich alle Pakete neu installiert werden?</translation> </message> <message> - <location filename="../PipxWidget.py" line="365" /> + <location filename="../PipxWidget.py" line="399" /> <source><p>The selected package cannot be upgraded because some of its apps are running.</p><ul><li>{0}</li></ul><p>Stop these apps and try again.</p></source> <translation><p>Das ausgewählte Paket kann nicht aktualisiert werden, da einige seiner Anwendungen ausgeführt werden.</p><ul><li>{0}</li></ul><p>Beende diese Anwendungen und versuche es erneut.</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="386" /> + <location filename="../PipxWidget.py" line="420" /> <source><p>The packages cannot be upgraded because some of their apps are running.</p><ul><li>{0}</li></ul><p>Stop these apps and try again.</p></source> <translation><p>Die Pakete können nicht aktualisiert werden, da einige ihrer Anwendungen ausgeführt werden.</p><ul><li>{0}</li></ul><p>Beende diese Anwendungen und versuche es erneut.</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="411" /> + <location filename="../PipxWidget.py" line="446" /> <source>Uninstall Package</source> <translation>Paket deinstallieren</translation> </message> <message> - <location filename="../PipxWidget.py" line="412" /> + <location filename="../PipxWidget.py" line="447" /> <source><p>Shall the package <b>{0}</b> really be uninstalled?</p></source> <translation><p>Soll das Paket <b>{0}</b> wirklich deinstalliert werden?</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="428" /> + <location filename="../PipxWidget.py" line="463" /> <source><p>Do you really want to uninstall <b>ALL</b> packages?</p></source> <translation><p>Sollen wirklich <b>ALLE</b> Pakete deinstalliert werden?</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="468" /> + <location filename="../PipxWidget.py" line="559" /> <source><b>pipx Version {0}</b></source> <translation><b>pipx Version {0}</b></translation> </message> <message> - <location filename="../PipxWidget.py" line="494" /> + <location filename="../PipxWidget.py" line="588" /> <source>{0} ({1})</source> <comment>current version, latest version</comment> <translation>{0} ({1})</translation> </message> <message> - <location filename="../PipxWidget.py" line="523" /> + <location filename="../PipxWidget.py" line="631" /> <source>{0}{1}</source> <comment>Python version, standalone indicator</comment> <translation>{0}{1}</translation> </message> <message> - <location filename="../PipxWidget.py" line="525" /> + <location filename="../PipxWidget.py" line="633" /> <source> (standalone)</source> <translation> (eigenständig)</translation> </message>
--- a/PipxInterface/i18n/pipx_empty.ts Mon Jul 29 11:58:31 2024 +0200 +++ b/PipxInterface/i18n/pipx_empty.ts Tue Jul 30 17:45:46 2024 +0200 @@ -54,45 +54,60 @@ <translation type="unfinished" /> </message> <message> - <location filename="../Pipx.py" line="456" /> - <source>Check Outdated Package</source> - <translation type="unfinished" /> - </message> - <message> - <location filename="../Pipx.py" line="457" /> - <source><p>The status of package <b>{0}</b> could not be determined.</p><p>Reason: {1}</p></source> - <translation type="unfinished" /> - </message> - <message> - <location filename="../Pipx.py" line="484" /> + <location filename="../Pipx.py" line="450" /> <source>Upgrade Package</source> <translation type="unfinished" /> </message> <message> - <location filename="../Pipx.py" line="494" /> + <location filename="../Pipx.py" line="460" /> <source>Upgrade All Packages</source> <translation type="unfinished" /> </message> <message> - <location filename="../Pipx.py" line="504" /> + <location filename="../Pipx.py" line="470" /> <source>Upgrade Shared Libraries</source> <translation type="unfinished" /> </message> <message> - <location filename="../Pipx.py" line="518" /> + <location filename="../Pipx.py" line="484" /> <source>Upgrade Interpreters</source> <translation type="unfinished" /> </message> <message> - <location filename="../Pipx.py" line="531" /> + <location filename="../Pipx.py" line="497" /> <source>Prune Unused Interpreters</source> <translation type="unfinished" /> </message> <message> - <location filename="../Pipx.py" line="542" /> + <location filename="../Pipx.py" line="508" /> <source>Ensure PATH Modifications</source> <translation type="unfinished" /> </message> + <message> + <location filename="../Pipx.py" line="535" /> + <source>Check Outdated Package</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../Pipx.py" line="536" /> + <source><p>The status of package <b>{0}</b> could not be determined.</p><p>Reason: {1}</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../Pipx.py" line="577" /> + <source>Get Package Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../Pipx.py" line="578" /> + <source><p>The status of dependencies of package <b>{0}</b> could not be determined.</p><p>Reason: {1}</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../Pipx.py" line="648" /> + <source>Upgrade Dependencies</source> + <translation type="unfinished" /> + </message> </context> <context> <name>PipxAppStartDialog</name> @@ -148,6 +163,44 @@ </message> </context> <context> + <name>PipxDependenciesDialog</name> + <message> + <location filename="../PipxDependenciesDialog.py" line="50" /> + <source>Outdated Dependencies of package <b>{0}</b></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.py" line="52" /> + <source>Up-to-date Dependencies of package <b>{0}</b></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.py" line="54" /> + <source>Dependencies of package <b>{0}</b></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Package Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Dependency</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Installed Version</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Available Version</source> + <translation type="unfinished" /> + </message> + </context> + <context> <name>PipxExecDialog</name> <message> <location filename="../PipxExecDialog.ui" line="0" /> @@ -459,184 +512,209 @@ <context> <name>PipxWidget</name> <message> - <location filename="../PipxWidget.py" line="108" /> + <location filename="../PipxWidget.py" line="110" /> <source>Install</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="202" /> - <location filename="../PipxWidget.py" line="110" /> + <location filename="../PipxWidget.py" line="227" /> + <location filename="../PipxWidget.py" line="112" /> <source>Install Packages</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="221" /> - <location filename="../PipxWidget.py" line="113" /> + <location filename="../PipxWidget.py" line="246" /> + <location filename="../PipxWidget.py" line="115" /> <source>Install All Packages</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="117" /> + <location filename="../PipxWidget.py" line="119" /> <source>Re-Install Selected Package</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="319" /> - <location filename="../PipxWidget.py" line="120" /> + <location filename="../PipxWidget.py" line="344" /> + <location filename="../PipxWidget.py" line="122" /> <source>Re-Install All Packages</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="277" /> - <location filename="../PipxWidget.py" line="268" /> - <location filename="../PipxWidget.py" line="256" /> - <location filename="../PipxWidget.py" line="240" /> - <location filename="../PipxWidget.py" line="124" /> + <location filename="../PipxWidget.py" line="302" /> + <location filename="../PipxWidget.py" line="293" /> + <location filename="../PipxWidget.py" line="281" /> + <location filename="../PipxWidget.py" line="265" /> + <location filename="../PipxWidget.py" line="126" /> <source>Create Spec Metadata File</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="131" /> + <location filename="../PipxWidget.py" line="133" /> <source>Upgrade</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="133" /> + <location filename="../PipxWidget.py" line="135" /> <source>Check Outdated Packages</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="364" /> - <location filename="../PipxWidget.py" line="137" /> + <location filename="../PipxWidget.py" line="398" /> + <location filename="../PipxWidget.py" line="139" /> <source>Upgrade Selected Package</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="385" /> - <location filename="../PipxWidget.py" line="140" /> + <location filename="../PipxWidget.py" line="419" /> + <location filename="../PipxWidget.py" line="142" /> <source>Upgrade All Packages</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="144" /> + <location filename="../PipxWidget.py" line="146" /> <source>Upgrade Shared Libraries</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="151" /> + <location filename="../PipxWidget.py" line="153" /> <source>Uninstall</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="153" /> + <location filename="../PipxWidget.py" line="155" /> <source>Uninstall Selected Package</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="427" /> - <location filename="../PipxWidget.py" line="156" /> + <location filename="../PipxWidget.py" line="462" /> + <location filename="../PipxWidget.py" line="158" /> <source>Uninstall All Packages</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="171" /> + <location filename="../PipxWidget.py" line="165" /> + <source>Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="167" /> + <source>Show All Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="170" /> + <source>Show Outdated Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="173" /> + <source>Show Up-to-date Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="177" /> + <source>Upgrade Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="196" /> <source>Standalone Interpreters</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="175" /> + <location filename="../PipxWidget.py" line="200" /> <source>Ensure PATH Modifications</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="178" /> + <location filename="../PipxWidget.py" line="203" /> <source>Configure...</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="242" /> + <location filename="../PipxWidget.py" line="267" /> <source>JSON Files (*.json);;All Files (*)</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="243" /> + <location filename="../PipxWidget.py" line="268" /> <source>JSON Files (*.json)</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="257" /> + <location filename="../PipxWidget.py" line="282" /> <source><p>The file <b>{0}</b> exists already. Overwrite it?</p></source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="269" /> - <source><p>The spec metadata file <b>{0}</b> was created successfully.</p></source> - <translation type="unfinished" /> - </message> - <message> - <location filename="../PipxWidget.py" line="278" /> - <source><p>The spec metadata file <b>{0}</b> could not be created.</p><p>Reason: {1}</p></source> - <translation type="unfinished" /> - </message> - <message> <location filename="../PipxWidget.py" line="294" /> + <source><p>The spec metadata file <b>{0}</b> was created successfully.</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="303" /> + <source><p>The spec metadata file <b>{0}</b> could not be created.</p><p>Reason: {1}</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="319" /> <source>Re-Install Package</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="295" /> + <location filename="../PipxWidget.py" line="320" /> <source><p>Shall the package <b>{0}</b> really be reinstalled?</p></source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="320" /> + <location filename="../PipxWidget.py" line="345" /> <source>Do you really want to reinstall all packages?</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="365" /> + <location filename="../PipxWidget.py" line="399" /> <source><p>The selected package cannot be upgraded because some of its apps are running.</p><ul><li>{0}</li></ul><p>Stop these apps and try again.</p></source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="386" /> + <location filename="../PipxWidget.py" line="420" /> <source><p>The packages cannot be upgraded because some of their apps are running.</p><ul><li>{0}</li></ul><p>Stop these apps and try again.</p></source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="411" /> + <location filename="../PipxWidget.py" line="446" /> <source>Uninstall Package</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="412" /> + <location filename="../PipxWidget.py" line="447" /> <source><p>Shall the package <b>{0}</b> really be uninstalled?</p></source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="428" /> + <location filename="../PipxWidget.py" line="463" /> <source><p>Do you really want to uninstall <b>ALL</b> packages?</p></source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="468" /> + <location filename="../PipxWidget.py" line="559" /> <source><b>pipx Version {0}</b></source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="494" /> + <location filename="../PipxWidget.py" line="588" /> <source>{0} ({1})</source> <comment>current version, latest version</comment> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="523" /> + <location filename="../PipxWidget.py" line="631" /> <source>{0}{1}</source> <comment>Python version, standalone indicator</comment> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="525" /> + <location filename="../PipxWidget.py" line="633" /> <source> (standalone)</source> <translation type="unfinished" /> </message>
--- a/PipxInterface/i18n/pipx_en.ts Mon Jul 29 11:58:31 2024 +0200 +++ b/PipxInterface/i18n/pipx_en.ts Tue Jul 30 17:45:46 2024 +0200 @@ -54,45 +54,60 @@ <translation type="unfinished" /> </message> <message> - <location filename="../Pipx.py" line="456" /> - <source>Check Outdated Package</source> - <translation type="unfinished" /> - </message> - <message> - <location filename="../Pipx.py" line="457" /> - <source><p>The status of package <b>{0}</b> could not be determined.</p><p>Reason: {1}</p></source> - <translation type="unfinished" /> - </message> - <message> - <location filename="../Pipx.py" line="484" /> + <location filename="../Pipx.py" line="450" /> <source>Upgrade Package</source> <translation type="unfinished" /> </message> <message> - <location filename="../Pipx.py" line="494" /> + <location filename="../Pipx.py" line="460" /> <source>Upgrade All Packages</source> <translation type="unfinished" /> </message> <message> - <location filename="../Pipx.py" line="504" /> + <location filename="../Pipx.py" line="470" /> <source>Upgrade Shared Libraries</source> <translation type="unfinished" /> </message> <message> - <location filename="../Pipx.py" line="518" /> + <location filename="../Pipx.py" line="484" /> <source>Upgrade Interpreters</source> <translation type="unfinished" /> </message> <message> - <location filename="../Pipx.py" line="531" /> + <location filename="../Pipx.py" line="497" /> <source>Prune Unused Interpreters</source> <translation type="unfinished" /> </message> <message> - <location filename="../Pipx.py" line="542" /> + <location filename="../Pipx.py" line="508" /> <source>Ensure PATH Modifications</source> <translation type="unfinished" /> </message> + <message> + <location filename="../Pipx.py" line="535" /> + <source>Check Outdated Package</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../Pipx.py" line="536" /> + <source><p>The status of package <b>{0}</b> could not be determined.</p><p>Reason: {1}</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../Pipx.py" line="577" /> + <source>Get Package Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../Pipx.py" line="578" /> + <source><p>The status of dependencies of package <b>{0}</b> could not be determined.</p><p>Reason: {1}</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../Pipx.py" line="648" /> + <source>Upgrade Dependencies</source> + <translation type="unfinished" /> + </message> </context> <context> <name>PipxAppStartDialog</name> @@ -148,6 +163,44 @@ </message> </context> <context> + <name>PipxDependenciesDialog</name> + <message> + <location filename="../PipxDependenciesDialog.py" line="50" /> + <source>Outdated Dependencies of package <b>{0}</b></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.py" line="52" /> + <source>Up-to-date Dependencies of package <b>{0}</b></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.py" line="54" /> + <source>Dependencies of package <b>{0}</b></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Package Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Dependency</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Installed Version</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Available Version</source> + <translation type="unfinished" /> + </message> + </context> + <context> <name>PipxExecDialog</name> <message> <location filename="../PipxExecDialog.ui" line="0" /> @@ -459,184 +512,209 @@ <context> <name>PipxWidget</name> <message> - <location filename="../PipxWidget.py" line="108" /> + <location filename="../PipxWidget.py" line="110" /> <source>Install</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="202" /> - <location filename="../PipxWidget.py" line="110" /> + <location filename="../PipxWidget.py" line="227" /> + <location filename="../PipxWidget.py" line="112" /> <source>Install Packages</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="221" /> - <location filename="../PipxWidget.py" line="113" /> + <location filename="../PipxWidget.py" line="246" /> + <location filename="../PipxWidget.py" line="115" /> <source>Install All Packages</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="117" /> + <location filename="../PipxWidget.py" line="119" /> <source>Re-Install Selected Package</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="319" /> - <location filename="../PipxWidget.py" line="120" /> + <location filename="../PipxWidget.py" line="344" /> + <location filename="../PipxWidget.py" line="122" /> <source>Re-Install All Packages</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="277" /> - <location filename="../PipxWidget.py" line="268" /> - <location filename="../PipxWidget.py" line="256" /> - <location filename="../PipxWidget.py" line="240" /> - <location filename="../PipxWidget.py" line="124" /> + <location filename="../PipxWidget.py" line="302" /> + <location filename="../PipxWidget.py" line="293" /> + <location filename="../PipxWidget.py" line="281" /> + <location filename="../PipxWidget.py" line="265" /> + <location filename="../PipxWidget.py" line="126" /> <source>Create Spec Metadata File</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="131" /> + <location filename="../PipxWidget.py" line="133" /> <source>Upgrade</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="133" /> + <location filename="../PipxWidget.py" line="135" /> <source>Check Outdated Packages</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="364" /> - <location filename="../PipxWidget.py" line="137" /> + <location filename="../PipxWidget.py" line="398" /> + <location filename="../PipxWidget.py" line="139" /> <source>Upgrade Selected Package</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="385" /> - <location filename="../PipxWidget.py" line="140" /> + <location filename="../PipxWidget.py" line="419" /> + <location filename="../PipxWidget.py" line="142" /> <source>Upgrade All Packages</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="144" /> + <location filename="../PipxWidget.py" line="146" /> <source>Upgrade Shared Libraries</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="151" /> + <location filename="../PipxWidget.py" line="153" /> <source>Uninstall</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="153" /> + <location filename="../PipxWidget.py" line="155" /> <source>Uninstall Selected Package</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="427" /> - <location filename="../PipxWidget.py" line="156" /> + <location filename="../PipxWidget.py" line="462" /> + <location filename="../PipxWidget.py" line="158" /> <source>Uninstall All Packages</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="171" /> + <location filename="../PipxWidget.py" line="165" /> + <source>Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="167" /> + <source>Show All Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="170" /> + <source>Show Outdated Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="173" /> + <source>Show Up-to-date Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="177" /> + <source>Upgrade Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="196" /> <source>Standalone Interpreters</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="175" /> + <location filename="../PipxWidget.py" line="200" /> <source>Ensure PATH Modifications</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="178" /> + <location filename="../PipxWidget.py" line="203" /> <source>Configure...</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="242" /> + <location filename="../PipxWidget.py" line="267" /> <source>JSON Files (*.json);;All Files (*)</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="243" /> + <location filename="../PipxWidget.py" line="268" /> <source>JSON Files (*.json)</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="257" /> + <location filename="../PipxWidget.py" line="282" /> <source><p>The file <b>{0}</b> exists already. Overwrite it?</p></source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="269" /> - <source><p>The spec metadata file <b>{0}</b> was created successfully.</p></source> - <translation type="unfinished" /> - </message> - <message> - <location filename="../PipxWidget.py" line="278" /> - <source><p>The spec metadata file <b>{0}</b> could not be created.</p><p>Reason: {1}</p></source> - <translation type="unfinished" /> - </message> - <message> <location filename="../PipxWidget.py" line="294" /> + <source><p>The spec metadata file <b>{0}</b> was created successfully.</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="303" /> + <source><p>The spec metadata file <b>{0}</b> could not be created.</p><p>Reason: {1}</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="319" /> <source>Re-Install Package</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="295" /> + <location filename="../PipxWidget.py" line="320" /> <source><p>Shall the package <b>{0}</b> really be reinstalled?</p></source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="320" /> + <location filename="../PipxWidget.py" line="345" /> <source>Do you really want to reinstall all packages?</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="365" /> + <location filename="../PipxWidget.py" line="399" /> <source><p>The selected package cannot be upgraded because some of its apps are running.</p><ul><li>{0}</li></ul><p>Stop these apps and try again.</p></source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="386" /> + <location filename="../PipxWidget.py" line="420" /> <source><p>The packages cannot be upgraded because some of their apps are running.</p><ul><li>{0}</li></ul><p>Stop these apps and try again.</p></source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="411" /> + <location filename="../PipxWidget.py" line="446" /> <source>Uninstall Package</source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="412" /> + <location filename="../PipxWidget.py" line="447" /> <source><p>Shall the package <b>{0}</b> really be uninstalled?</p></source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="428" /> + <location filename="../PipxWidget.py" line="463" /> <source><p>Do you really want to uninstall <b>ALL</b> packages?</p></source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="468" /> + <location filename="../PipxWidget.py" line="559" /> <source><b>pipx Version {0}</b></source> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="494" /> + <location filename="../PipxWidget.py" line="588" /> <source>{0} ({1})</source> <comment>current version, latest version</comment> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="523" /> + <location filename="../PipxWidget.py" line="631" /> <source>{0}{1}</source> <comment>Python version, standalone indicator</comment> <translation type="unfinished" /> </message> <message> - <location filename="../PipxWidget.py" line="525" /> + <location filename="../PipxWidget.py" line="633" /> <source> (standalone)</source> <translation type="unfinished" /> </message>
--- a/PipxInterface/i18n/pipx_es.ts Mon Jul 29 11:58:31 2024 +0200 +++ b/PipxInterface/i18n/pipx_es.ts Tue Jul 30 17:45:46 2024 +0200 @@ -54,45 +54,60 @@ <translation>Desinstalar Todos los Packages</translation> </message> <message> - <location filename="../Pipx.py" line="456" /> - <source>Check Outdated Package</source> - <translation>Comprobar Package Desactualizado</translation> - </message> - <message> - <location filename="../Pipx.py" line="457" /> - <source><p>The status of package <b>{0}</b> could not be determined.</p><p>Reason: {1}</p></source> - <translation><p>El status del package <b>{0}</b> no se ha podido determinar.</p><p>Razón: {1}</p></translation> - </message> - <message> - <location filename="../Pipx.py" line="484" /> + <location filename="../Pipx.py" line="450" /> <source>Upgrade Package</source> <translation>Actualizar Package</translation> </message> <message> - <location filename="../Pipx.py" line="494" /> + <location filename="../Pipx.py" line="460" /> <source>Upgrade All Packages</source> <translation>Actualizar Todos los Packages</translation> </message> <message> - <location filename="../Pipx.py" line="504" /> + <location filename="../Pipx.py" line="470" /> <source>Upgrade Shared Libraries</source> <translation>Actualizar Bibliotecas Compartidas</translation> </message> <message> - <location filename="../Pipx.py" line="518" /> + <location filename="../Pipx.py" line="484" /> <source>Upgrade Interpreters</source> <translation>Actualizar Intérpretes</translation> </message> <message> - <location filename="../Pipx.py" line="531" /> + <location filename="../Pipx.py" line="497" /> <source>Prune Unused Interpreters</source> <translation>Limpiar Intérpretes no Utililizados</translation> </message> <message> - <location filename="../Pipx.py" line="542" /> + <location filename="../Pipx.py" line="508" /> <source>Ensure PATH Modifications</source> <translation>Asegurar modificaciones de PATH</translation> </message> + <message> + <location filename="../Pipx.py" line="535" /> + <source>Check Outdated Package</source> + <translation>Comprobar Package Desactualizado</translation> + </message> + <message> + <location filename="../Pipx.py" line="536" /> + <source><p>The status of package <b>{0}</b> could not be determined.</p><p>Reason: {1}</p></source> + <translation><p>El status del package <b>{0}</b> no se ha podido determinar.</p><p>Razón: {1}</p></translation> + </message> + <message> + <location filename="../Pipx.py" line="577" /> + <source>Get Package Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../Pipx.py" line="578" /> + <source><p>The status of dependencies of package <b>{0}</b> could not be determined.</p><p>Reason: {1}</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../Pipx.py" line="648" /> + <source>Upgrade Dependencies</source> + <translation type="unfinished" /> + </message> </context> <context> <name>PipxAppStartDialog</name> @@ -148,6 +163,44 @@ </message> </context> <context> + <name>PipxDependenciesDialog</name> + <message> + <location filename="../PipxDependenciesDialog.py" line="50" /> + <source>Outdated Dependencies of package <b>{0}</b></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.py" line="52" /> + <source>Up-to-date Dependencies of package <b>{0}</b></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.py" line="54" /> + <source>Dependencies of package <b>{0}</b></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Package Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Dependency</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Installed Version</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Available Version</source> + <translation type="unfinished" /> + </message> + </context> + <context> <name>PipxExecDialog</name> <message> <location filename="../PipxExecDialog.ui" line="0" /> @@ -459,184 +512,209 @@ <context> <name>PipxWidget</name> <message> - <location filename="../PipxWidget.py" line="109" /> + <location filename="../PipxWidget.py" line="110" /> <source>Install</source> <translation>Instalar</translation> </message> <message> - <location filename="../PipxWidget.py" line="203" /> - <location filename="../PipxWidget.py" line="111" /> + <location filename="../PipxWidget.py" line="227" /> + <location filename="../PipxWidget.py" line="112" /> <source>Install Packages</source> <translation>Instalar Packages</translation> </message> <message> - <location filename="../PipxWidget.py" line="222" /> - <location filename="../PipxWidget.py" line="114" /> + <location filename="../PipxWidget.py" line="246" /> + <location filename="../PipxWidget.py" line="115" /> <source>Install All Packages</source> <translation>Instalar Todos los Packages</translation> </message> <message> - <location filename="../PipxWidget.py" line="118" /> + <location filename="../PipxWidget.py" line="119" /> <source>Re-Install Selected Package</source> <translation>Reinstalar Package Seleccionado</translation> </message> <message> - <location filename="../PipxWidget.py" line="320" /> - <location filename="../PipxWidget.py" line="121" /> + <location filename="../PipxWidget.py" line="344" /> + <location filename="../PipxWidget.py" line="122" /> <source>Re-Install All Packages</source> <translation>Reinstalar Todos los Packages</translation> </message> <message> - <location filename="../PipxWidget.py" line="278" /> - <location filename="../PipxWidget.py" line="269" /> - <location filename="../PipxWidget.py" line="257" /> - <location filename="../PipxWidget.py" line="241" /> - <location filename="../PipxWidget.py" line="125" /> + <location filename="../PipxWidget.py" line="302" /> + <location filename="../PipxWidget.py" line="293" /> + <location filename="../PipxWidget.py" line="281" /> + <location filename="../PipxWidget.py" line="265" /> + <location filename="../PipxWidget.py" line="126" /> <source>Create Spec Metadata File</source> <translation>Crear Archivo de Metadatos de Spec</translation> </message> <message> - <location filename="../PipxWidget.py" line="132" /> + <location filename="../PipxWidget.py" line="133" /> <source>Upgrade</source> <translation>Actualizar</translation> </message> <message> - <location filename="../PipxWidget.py" line="134" /> + <location filename="../PipxWidget.py" line="135" /> <source>Check Outdated Packages</source> <translation>Comprobar Packages Desactualizados</translation> </message> <message> - <location filename="../PipxWidget.py" line="367" /> - <location filename="../PipxWidget.py" line="138" /> + <location filename="../PipxWidget.py" line="398" /> + <location filename="../PipxWidget.py" line="139" /> <source>Upgrade Selected Package</source> <translation>Actualizar Package Seleccionado</translation> </message> <message> - <location filename="../PipxWidget.py" line="388" /> - <location filename="../PipxWidget.py" line="141" /> + <location filename="../PipxWidget.py" line="419" /> + <location filename="../PipxWidget.py" line="142" /> <source>Upgrade All Packages</source> <translation>Actualizar Todos los Packages</translation> </message> <message> - <location filename="../PipxWidget.py" line="145" /> + <location filename="../PipxWidget.py" line="146" /> <source>Upgrade Shared Libraries</source> <translation>Actualizar Bibliotecas Compartidas</translation> </message> <message> - <location filename="../PipxWidget.py" line="152" /> + <location filename="../PipxWidget.py" line="153" /> <source>Uninstall</source> <translation>Desinstalar</translation> </message> <message> - <location filename="../PipxWidget.py" line="154" /> + <location filename="../PipxWidget.py" line="155" /> <source>Uninstall Selected Package</source> <translation>Desinstalar Package Seleccionado</translation> </message> <message> - <location filename="../PipxWidget.py" line="431" /> - <location filename="../PipxWidget.py" line="157" /> + <location filename="../PipxWidget.py" line="462" /> + <location filename="../PipxWidget.py" line="158" /> <source>Uninstall All Packages</source> <translation>Desinstalar Todos los Packages</translation> </message> <message> - <location filename="../PipxWidget.py" line="172" /> + <location filename="../PipxWidget.py" line="165" /> + <source>Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="167" /> + <source>Show All Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="170" /> + <source>Show Outdated Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="173" /> + <source>Show Up-to-date Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="177" /> + <source>Upgrade Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="196" /> <source>Standalone Interpreters</source> <translation>Intérpretes Independientes</translation> </message> <message> - <location filename="../PipxWidget.py" line="176" /> + <location filename="../PipxWidget.py" line="200" /> <source>Ensure PATH Modifications</source> <translation>Asegurar modificaciones de PATH</translation> </message> <message> - <location filename="../PipxWidget.py" line="179" /> + <location filename="../PipxWidget.py" line="203" /> <source>Configure...</source> <translation>Configurar...</translation> </message> <message> - <location filename="../PipxWidget.py" line="243" /> + <location filename="../PipxWidget.py" line="267" /> <source>JSON Files (*.json);;All Files (*)</source> <translation>Archivos JSON (*.json);;Todos los Archivos (*)</translation> </message> <message> - <location filename="../PipxWidget.py" line="244" /> + <location filename="../PipxWidget.py" line="268" /> <source>JSON Files (*.json)</source> <translation>Archivos JSON (*.json)</translation> </message> <message> - <location filename="../PipxWidget.py" line="258" /> + <location filename="../PipxWidget.py" line="282" /> <source><p>The file <b>{0}</b> exists already. Overwrite it?</p></source> <translation><p>El archivo <b>{0}</b> ya existe. ¿Desea sobreescribirlo?</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="270" /> + <location filename="../PipxWidget.py" line="294" /> <source><p>The spec metadata file <b>{0}</b> was created successfully.</p></source> <translation><p>El archivo de metadatos de spec <b>{0}</b> se ha creado con éxito</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="279" /> + <location filename="../PipxWidget.py" line="303" /> <source><p>The spec metadata file <b>{0}</b> could not be created.</p><p>Reason: {1}</p></source> <translation><p>El archivo de metadatos de spec <b>{0}</b> no se ha podido crear.</p><p>Razón: {1}</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="295" /> + <location filename="../PipxWidget.py" line="319" /> <source>Re-Install Package</source> <translation>Reinstalar Package</translation> </message> <message> - <location filename="../PipxWidget.py" line="296" /> + <location filename="../PipxWidget.py" line="320" /> <source><p>Shall the package <b>{0}</b> really be reinstalled?</p></source> <translation><p>¿Debe ser el package <b>{0}</b> reinstalado seguro?</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="321" /> + <location filename="../PipxWidget.py" line="345" /> <source>Do you really want to reinstall all packages?</source> <translation>¿Desea seguro reinstalar todos los packages?</translation> </message> <message> - <location filename="../PipxWidget.py" line="368" /> + <location filename="../PipxWidget.py" line="399" /> <source><p>The selected package cannot be upgraded because some of its apps are running.</p><ul><li>{0}</li></ul><p>Stop these apps and try again.</p></source> <translation><p>El package seleccionado no se puede actualizar porque algunas de sus apps están en ejecución.</p><ul><li>{0}</li></ul><p>Detener estasapps e intentar de nuevo.</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="389" /> + <location filename="../PipxWidget.py" line="420" /> <source><p>The packages cannot be upgraded because some of their apps are running.</p><ul><li>{0}</li></ul><p>Stop these apps and try again.</p></source> <translation><p>Los packages no se pueden actualizar porque algunas de sus apps están en ejecución.</p><ul><li>{0}</li></ul><p>Detener estas apps e intentar de nuevo.</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="415" /> + <location filename="../PipxWidget.py" line="446" /> <source>Uninstall Package</source> <translation>Desinstalar Package</translation> </message> <message> - <location filename="../PipxWidget.py" line="416" /> + <location filename="../PipxWidget.py" line="447" /> <source><p>Shall the package <b>{0}</b> really be uninstalled?</p></source> <translation><p>¿Debe ser el package <b>{0}</b> desinstalado seguro?</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="432" /> + <location filename="../PipxWidget.py" line="463" /> <source><p>Do you really want to uninstall <b>ALL</b> packages?</p></source> <translation><p>¿Desea seguro desinstalar <b>TODOS</b> los packages?</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="472" /> + <location filename="../PipxWidget.py" line="559" /> <source><b>pipx Version {0}</b></source> <translation><b>pipx Versión {0}</b></translation> </message> <message> - <location filename="../PipxWidget.py" line="501" /> + <location filename="../PipxWidget.py" line="588" /> <source>{0} ({1})</source> <comment>current version, latest version</comment> <translation>{0} ({1})</translation> </message> <message> - <location filename="../PipxWidget.py" line="544" /> + <location filename="../PipxWidget.py" line="631" /> <source>{0}{1}</source> <comment>Python version, standalone indicator</comment> <translation>{0}{1}</translation> </message> <message> - <location filename="../PipxWidget.py" line="546" /> + <location filename="../PipxWidget.py" line="633" /> <source> (standalone)</source> <translation> (independiente)</translation> </message>
--- a/PipxInterface/i18n/pipx_ru.ts Mon Jul 29 11:58:31 2024 +0200 +++ b/PipxInterface/i18n/pipx_ru.ts Tue Jul 30 17:45:46 2024 +0200 @@ -54,45 +54,60 @@ <translation>Деинсталировать все пакеты</translation> </message> <message> - <location filename="../Pipx.py" line="456" /> - <source>Check Outdated Package</source> - <translation>Проверить устаревшие пакеты</translation> - </message> - <message> - <location filename="../Pipx.py" line="457" /> - <source><p>The status of package <b>{0}</b> could not be determined.</p><p>Reason: {1}</p></source> - <translation><p>Не удалось определить статус пакета <b>{0}</b>.</p><p>Причина: {1}</p></translation> - </message> - <message> - <location filename="../Pipx.py" line="484" /> + <location filename="../Pipx.py" line="450" /> <source>Upgrade Package</source> <translation>Обновить пакет</translation> </message> <message> - <location filename="../Pipx.py" line="494" /> + <location filename="../Pipx.py" line="460" /> <source>Upgrade All Packages</source> <translation>Обновить все пакеты</translation> </message> <message> - <location filename="../Pipx.py" line="504" /> + <location filename="../Pipx.py" line="470" /> <source>Upgrade Shared Libraries</source> <translation>Обновить общие библиотеки</translation> </message> <message> - <location filename="../Pipx.py" line="518" /> + <location filename="../Pipx.py" line="484" /> <source>Upgrade Interpreters</source> <translation>Обновить интерпретаторы</translation> </message> <message> - <location filename="../Pipx.py" line="531" /> + <location filename="../Pipx.py" line="497" /> <source>Prune Unused Interpreters</source> <translation>Удалить неиспользуемые интерпретаторы</translation> </message> <message> - <location filename="../Pipx.py" line="542" /> + <location filename="../Pipx.py" line="508" /> <source>Ensure PATH Modifications</source> <translation>Обеспечьте внесение изменений в ПУТЬ</translation> </message> + <message> + <location filename="../Pipx.py" line="535" /> + <source>Check Outdated Package</source> + <translation>Проверить устаревшие пакеты</translation> + </message> + <message> + <location filename="../Pipx.py" line="536" /> + <source><p>The status of package <b>{0}</b> could not be determined.</p><p>Reason: {1}</p></source> + <translation><p>Не удалось определить статус пакета <b>{0}</b>.</p><p>Причина: {1}</p></translation> + </message> + <message> + <location filename="../Pipx.py" line="577" /> + <source>Get Package Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../Pipx.py" line="578" /> + <source><p>The status of dependencies of package <b>{0}</b> could not be determined.</p><p>Reason: {1}</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../Pipx.py" line="648" /> + <source>Upgrade Dependencies</source> + <translation type="unfinished" /> + </message> </context> <context> <name>PipxAppStartDialog</name> @@ -148,6 +163,44 @@ </message> </context> <context> + <name>PipxDependenciesDialog</name> + <message> + <location filename="../PipxDependenciesDialog.py" line="50" /> + <source>Outdated Dependencies of package <b>{0}</b></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.py" line="52" /> + <source>Up-to-date Dependencies of package <b>{0}</b></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.py" line="54" /> + <source>Dependencies of package <b>{0}</b></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Package Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Dependency</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Installed Version</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxDependenciesDialog.ui" line="0" /> + <source>Available Version</source> + <translation type="unfinished" /> + </message> + </context> + <context> <name>PipxExecDialog</name> <message> <location filename="../PipxExecDialog.ui" line="0" /> @@ -459,184 +512,209 @@ <context> <name>PipxWidget</name> <message> - <location filename="../PipxWidget.py" line="108" /> + <location filename="../PipxWidget.py" line="110" /> <source>Install</source> <translation>Установить</translation> </message> <message> - <location filename="../PipxWidget.py" line="202" /> - <location filename="../PipxWidget.py" line="110" /> + <location filename="../PipxWidget.py" line="227" /> + <location filename="../PipxWidget.py" line="112" /> <source>Install Packages</source> <translation>Установить пакеты</translation> </message> <message> - <location filename="../PipxWidget.py" line="221" /> - <location filename="../PipxWidget.py" line="113" /> + <location filename="../PipxWidget.py" line="246" /> + <location filename="../PipxWidget.py" line="115" /> <source>Install All Packages</source> <translation>Установить все пакеты</translation> </message> <message> - <location filename="../PipxWidget.py" line="117" /> + <location filename="../PipxWidget.py" line="119" /> <source>Re-Install Selected Package</source> <translation>Переустановить выбранный пакет</translation> </message> <message> - <location filename="../PipxWidget.py" line="319" /> - <location filename="../PipxWidget.py" line="120" /> + <location filename="../PipxWidget.py" line="344" /> + <location filename="../PipxWidget.py" line="122" /> <source>Re-Install All Packages</source> <translation>Переустановить все пакеты</translation> </message> <message> - <location filename="../PipxWidget.py" line="277" /> - <location filename="../PipxWidget.py" line="268" /> - <location filename="../PipxWidget.py" line="256" /> - <location filename="../PipxWidget.py" line="240" /> - <location filename="../PipxWidget.py" line="124" /> + <location filename="../PipxWidget.py" line="302" /> + <location filename="../PipxWidget.py" line="293" /> + <location filename="../PipxWidget.py" line="281" /> + <location filename="../PipxWidget.py" line="265" /> + <location filename="../PipxWidget.py" line="126" /> <source>Create Spec Metadata File</source> <translation>Создайть файл метаданных спецификации</translation> </message> <message> - <location filename="../PipxWidget.py" line="131" /> + <location filename="../PipxWidget.py" line="133" /> <source>Upgrade</source> <translation>Обновлять</translation> </message> <message> - <location filename="../PipxWidget.py" line="133" /> + <location filename="../PipxWidget.py" line="135" /> <source>Check Outdated Packages</source> <translation>Проверить устаревшие пакеты</translation> </message> <message> - <location filename="../PipxWidget.py" line="373" /> - <location filename="../PipxWidget.py" line="137" /> + <location filename="../PipxWidget.py" line="398" /> + <location filename="../PipxWidget.py" line="139" /> <source>Upgrade Selected Package</source> <translation>Обновить выбранный пакет</translation> </message> <message> - <location filename="../PipxWidget.py" line="394" /> - <location filename="../PipxWidget.py" line="140" /> + <location filename="../PipxWidget.py" line="419" /> + <location filename="../PipxWidget.py" line="142" /> <source>Upgrade All Packages</source> <translation>Обновить все пакеты</translation> </message> <message> - <location filename="../PipxWidget.py" line="144" /> + <location filename="../PipxWidget.py" line="146" /> <source>Upgrade Shared Libraries</source> <translation>Обновить общие библиотеки</translation> </message> <message> - <location filename="../PipxWidget.py" line="151" /> + <location filename="../PipxWidget.py" line="153" /> <source>Uninstall</source> <translation>Деинсталировать</translation> </message> <message> - <location filename="../PipxWidget.py" line="153" /> + <location filename="../PipxWidget.py" line="155" /> <source>Uninstall Selected Package</source> <translation>Деинсталировать выбранный пакет</translation> </message> <message> - <location filename="../PipxWidget.py" line="437" /> - <location filename="../PipxWidget.py" line="156" /> + <location filename="../PipxWidget.py" line="462" /> + <location filename="../PipxWidget.py" line="158" /> <source>Uninstall All Packages</source> <translation>Деинсталировать все пакеты</translation> </message> <message> - <location filename="../PipxWidget.py" line="171" /> + <location filename="../PipxWidget.py" line="165" /> + <source>Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="167" /> + <source>Show All Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="170" /> + <source>Show Outdated Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="173" /> + <source>Show Up-to-date Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="177" /> + <source>Upgrade Dependencies</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../PipxWidget.py" line="196" /> <source>Standalone Interpreters</source> <translation>Автономные интерпретаторы</translation> </message> <message> - <location filename="../PipxWidget.py" line="175" /> + <location filename="../PipxWidget.py" line="200" /> <source>Ensure PATH Modifications</source> <translation>Обеспечьте внесение изменений в ПУТЬ</translation> </message> <message> - <location filename="../PipxWidget.py" line="178" /> + <location filename="../PipxWidget.py" line="203" /> <source>Configure...</source> <translation>Настроить...</translation> </message> <message> - <location filename="../PipxWidget.py" line="242" /> + <location filename="../PipxWidget.py" line="267" /> <source>JSON Files (*.json);;All Files (*)</source> <translation>Файлы JSON (*.json);;Все файлы (*)</translation> </message> <message> - <location filename="../PipxWidget.py" line="243" /> + <location filename="../PipxWidget.py" line="268" /> <source>JSON Files (*.json)</source> <translation>Файлы JSON (*.json)</translation> </message> <message> - <location filename="../PipxWidget.py" line="257" /> + <location filename="../PipxWidget.py" line="282" /> <source><p>The file <b>{0}</b> exists already. Overwrite it?</p></source> <translation><p>Файл <b>{0}</b> уже существует. Перезаписать?</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="269" /> + <location filename="../PipxWidget.py" line="294" /> <source><p>The spec metadata file <b>{0}</b> was created successfully.</p></source> <translation><p>Файл метаданных спецификации <b>{0}</b> был успешно создан.</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="278" /> + <location filename="../PipxWidget.py" line="303" /> <source><p>The spec metadata file <b>{0}</b> could not be created.</p><p>Reason: {1}</p></source> <translation><p>Не удалось создать файл метаданных спецификации <b>{0}</b>.</p><p>Причина: {1}</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="294" /> + <location filename="../PipxWidget.py" line="319" /> <source>Re-Install Package</source> <translation>Переустановить пакет</translation> </message> <message> - <location filename="../PipxWidget.py" line="295" /> + <location filename="../PipxWidget.py" line="320" /> <source><p>Shall the package <b>{0}</b> really be reinstalled?</p></source> <translation><p>Должен ли пакет <b>{0}</b> действительно быть переустановлен?</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="320" /> + <location filename="../PipxWidget.py" line="345" /> <source>Do you really want to reinstall all packages?</source> <translation>Вы действительно хотите переустановить все пакеты?</translation> </message> <message> - <location filename="../PipxWidget.py" line="374" /> + <location filename="../PipxWidget.py" line="399" /> <source><p>The selected package cannot be upgraded because some of its apps are running.</p><ul><li>{0}</li></ul><p>Stop these apps and try again.</p></source> <translation><p>Выбранный пакет не может быть обновлен, поскольку некоторые из его приложений запущены.</p><ul><li>{0}</li></ul><p>Остановите эти приложения и повторите попытку.</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="395" /> + <location filename="../PipxWidget.py" line="420" /> <source><p>The packages cannot be upgraded because some of their apps are running.</p><ul><li>{0}</li></ul><p>Stop these apps and try again.</p></source> <translation><p>Обновление пакетов невозможно, поскольку некоторые из их приложений запущены.</p><ul><li>{0}</li></ul><p>Остановите эти приложения и повторите попытку.</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="421" /> + <location filename="../PipxWidget.py" line="446" /> <source>Uninstall Package</source> <translation>Деинсталировать пакет</translation> </message> <message> - <location filename="../PipxWidget.py" line="422" /> + <location filename="../PipxWidget.py" line="447" /> <source><p>Shall the package <b>{0}</b> really be uninstalled?</p></source> <translation><p>Должен ли пакет <b>{0}</b> действительно быть удален?</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="438" /> + <location filename="../PipxWidget.py" line="463" /> <source><p>Do you really want to uninstall <b>ALL</b> packages?</p></source> <translation><p>Вы действительно хотите удалить ВСЕ </b> пакеты?</p></translation> </message> <message> - <location filename="../PipxWidget.py" line="478" /> + <location filename="../PipxWidget.py" line="559" /> <source><b>pipx Version {0}</b></source> <translation><b>Версия pipx {0}</b></translation> </message> <message> - <location filename="../PipxWidget.py" line="507" /> + <location filename="../PipxWidget.py" line="588" /> <source>{0} ({1})</source> <comment>current version, latest version</comment> <translation>{0} ({1})</translation> </message> <message> - <location filename="../PipxWidget.py" line="550" /> + <location filename="../PipxWidget.py" line="631" /> <source>{0}{1}</source> <comment>Python version, standalone indicator</comment> <translation /> </message> <message> - <location filename="../PipxWidget.py" line="552" /> + <location filename="../PipxWidget.py" line="633" /> <source> (standalone)</source> <translation> (автономный)</translation> </message>
--- a/PluginPipxInterface.epj Mon Jul 29 11:58:31 2024 +0200 +++ b/PluginPipxInterface.epj Tue Jul 30 17:45:46 2024 +0200 @@ -202,6 +202,7 @@ "FORMS": [ "PipxInterface/ConfigurationPage/PipxPage.ui", "PipxInterface/PipxAppStartDialog.ui", + "PipxInterface/PipxDependenciesDialog.ui", "PipxInterface/PipxExecDialog.ui", "PipxInterface/PipxInterpretersDialog.ui", "PipxInterface/PipxPackagesInputDialog.ui", @@ -236,6 +237,8 @@ "PipxInterface/icons/pipx22.svg", "PipxInterface/icons/pipx48.svg", "PipxInterface/icons/pipx96.svg", + "PipxInterface/icons/pipxOutdated22.svg", + "PipxInterface/icons/pipxOutdated96.svg", "PluginPipxInterface.epj", "PluginPipxInterface.zip", "changelog.md", @@ -299,6 +302,7 @@ "PipxInterface/ConfigurationPage/__init__.py", "PipxInterface/Pipx.py", "PipxInterface/PipxAppStartDialog.py", + "PipxInterface/PipxDependenciesDialog.py", "PipxInterface/PipxExecDialog.py", "PipxInterface/PipxInterpretersDialog.py", "PipxInterface/PipxPackagesInputDialog.py", @@ -306,6 +310,7 @@ "PipxInterface/PipxSpecInputDialog.py", "PipxInterface/PipxWidget.py", "PipxInterface/Ui_PipxAppStartDialog.py", + "PipxInterface/Ui_PipxDependenciesDialog.py", "PipxInterface/Ui_PipxExecDialog.py", "PipxInterface/Ui_PipxInterpretersDialog.py", "PipxInterface/Ui_PipxPackagesInputDialog.py",
--- a/PluginPipxInterface.py Mon Jul 29 11:58:31 2024 +0200 +++ b/PluginPipxInterface.py Tue Jul 30 17:45:46 2024 +0200 @@ -36,7 +36,7 @@ "author": "Detlev Offenbach <detlev@die-offenbachs.de>", "autoactivate": True, "deactivateable": True, - "version": "10.2.4", + "version": "10.3.0", "className": "PluginPipxInterface", "packageName": "PipxInterface", "shortDescription": "Graphical interface to the 'pipx' command.",
--- a/changelog.md Mon Jul 29 11:58:31 2024 +0200 +++ b/changelog.md Tue Jul 30 17:45:46 2024 +0200 @@ -1,6 +1,11 @@ ChangeLog --------- +__Version 10.3.0__ + +- Implemented actions to show the dependencies of a package and upgrade them + using 'runpip' because 'pipx' doesn't upgrade them when upgrading the package. + __Version 10.2.4__ - bug fixes