Addon Manager: Show package dependencies

This commit is contained in:
Chris Hennes
2022-09-21 14:44:35 -05:00
parent 321fb6693e
commit abd601a147
4 changed files with 56 additions and 8 deletions

View File

@@ -86,11 +86,21 @@ def call_pip(args) -> List[str]:
stderr=subprocess.PIPE,
shell=True,
check=True,
timeout=30,
)
if proc.returncode != 0:
pip_failed = True
except subprocess.CalledProcessError:
pip_failed = True
except subprocess.TimeoutExpired:
FreeCAD.Console.PrintWarning(
translate(
"AddonsInstaller",
"pip took longer than 30 seconds to return results, giving up on it",
)
)
FreeCAD.Console.PrintLog(" ".join(call_args))
pip_failed = True
else:
pip_failed = True
@@ -107,13 +117,14 @@ class PythonPackageManager:
"""A GUI-based pip interface allowing packages to be updated, either individually or all at once."""
def __init__(self):
def __init__(self, addons):
self.dlg = FreeCADGui.PySideUic.loadUi(
os.path.join(os.path.dirname(__file__), "PythonDependencyUpdateDialog.ui")
)
self.vendor_path = os.path.join(
FreeCAD.getUserAppDataDir(), "AdditionalPythonPackages"
)
self.addons = addons
def show(self):
"""Run the modal dialog"""
@@ -143,6 +154,13 @@ class PythonPackageManager:
update_counter = 0
self.dlg.tableWidget.setSortingEnabled(False)
for package_name, package_details in package_list.items():
dependent_addons = self._get_dependent_addons(package_name)
dependencies = []
for addon in dependent_addons:
if addon["optional"]:
dependencies.append(addon['name'] + "*")
else:
dependencies.append(addon['name'])
self.dlg.tableWidget.setItem(
counter, 0, QtWidgets.QTableWidgetItem(package_name)
)
@@ -156,6 +174,11 @@ class PythonPackageManager:
2,
QtWidgets.QTableWidgetItem(package_details["available_version"]),
)
self.dlg.tableWidget.setItem(
counter,
3,
QtWidgets.QTableWidgetItem(", ".join(dependencies)),
)
if len(package_details["available_version"]) > 0:
updateButtons.append(
QtWidgets.QPushButton(translate("AddonsInstaller", "Update"))
@@ -190,6 +213,16 @@ class PythonPackageManager:
else:
self.dlg.buttonUpdateAll.setEnabled(False)
def _get_dependent_addons(self, package):
dependent_addons = []
for addon in self.addons:
#if addon.installed_version is not None:
if package.lower() in addon.python_requires:
dependent_addons.append({"name":addon.name,"optional":False})
elif package.lower() in addon.python_optional:
dependent_addons.append({"name":addon.name,"optional":True})
return dependent_addons
def _parse_pip_list_output(
self, all_packages, outdated_packages
) -> Dict[str, Dict[str, str]]: