Addon Manager: Cleanup

This commit is contained in:
Chris Hennes
2022-07-27 10:48:29 -05:00
parent acbd4b1cd7
commit 514118192a
4 changed files with 180 additions and 96 deletions

View File

@@ -27,13 +27,13 @@ from typing import List, Dict
import os
import subprocess
from functools import partial, partialmethod
from functools import partial
translate = FreeCAD.Qt.translate
# For non-blocking update availability checking:
class CheckForPythonPackageUpdatesWorker(QtCore.QThread):
python_package_updates_available = QtCore.Signal()
def __init__(self):
@@ -44,12 +44,11 @@ class CheckForPythonPackageUpdatesWorker(QtCore.QThread):
if check_for_python_package_updates():
self.python_package_updates_available.emit()
def check_for_python_package_updates() -> bool:
vendor_path = os.path.join(
FreeCAD.getUserAppDataDir(), "AdditionalPythonPackages"
)
vendor_path = os.path.join(FreeCAD.getUserAppDataDir(), "AdditionalPythonPackages")
package_counter = 0
outdated_packages_stdout = call_pip(["list","-o","--path",vendor_path])
outdated_packages_stdout = call_pip(["list", "-o", "--path", vendor_path])
FreeCAD.Console.PrintLog("Output from pip -o:\n")
for line in outdated_packages_stdout:
if len(line) > 0:
@@ -57,6 +56,7 @@ def check_for_python_package_updates() -> bool:
FreeCAD.Console.PrintLog(f" {line}\n")
return package_counter > 0
def call_pip(args) -> List[str]:
python_exe = utils.get_python_exe()
pip_failed = False
@@ -64,7 +64,6 @@ def call_pip(args) -> List[str]:
try:
call_args = [python_exe, "-m", "pip", "--disable-pip-version-check"]
call_args.extend(args)
print(call_args)
proc = subprocess.run(
call_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True
)
@@ -80,13 +79,11 @@ def call_pip(args) -> List[str]:
data = proc.stdout.decode()
result = data.split("\n")
else:
print(proc.stderr.decode())
raise Exception(proc.stderr.decode())
return result
class PythonPackageManager:
def __init__(self):
self.dlg = FreeCADGui.PySideUic.loadUi(
os.path.join(os.path.dirname(__file__), "PythonDependencyUpdateDialog.ui")
@@ -103,43 +100,71 @@ class PythonPackageManager:
self.dlg.exec()
def _create_list_from_pip(self):
all_packages_stdout = call_pip(["list","--path",self.vendor_path])
outdated_packages_stdout = call_pip(["list","-o","--path",self.vendor_path])
package_list = self._parse_pip_list_output(all_packages_stdout, outdated_packages_stdout)
self.dlg.buttonUpdateAll.clicked.connect(partial(self._update_all_packages, package_list))
all_packages_stdout = call_pip(["list", "--path", self.vendor_path])
outdated_packages_stdout = call_pip(["list", "-o", "--path", self.vendor_path])
package_list = self._parse_pip_list_output(
all_packages_stdout, outdated_packages_stdout
)
self.dlg.buttonUpdateAll.clicked.connect(
partial(self._update_all_packages, package_list)
)
self.dlg.tableWidget.setRowCount(len(package_list))
updateButtons = list()
counter = 0
update_counter = 0
self.dlg.tableWidget.setSortingEnabled(False)
for package_name, package_details in package_list.items():
self.dlg.tableWidget.setItem(counter,0,QtWidgets.QTableWidgetItem(package_name))
self.dlg.tableWidget.setItem(counter,1,QtWidgets.QTableWidgetItem(package_details["installed_version"]))
self.dlg.tableWidget.setItem(counter,2,QtWidgets.QTableWidgetItem(package_details["available_version"]))
self.dlg.tableWidget.setItem(
counter, 0, QtWidgets.QTableWidgetItem(package_name)
)
self.dlg.tableWidget.setItem(
counter,
1,
QtWidgets.QTableWidgetItem(package_details["installed_version"]),
)
self.dlg.tableWidget.setItem(
counter,
2,
QtWidgets.QTableWidgetItem(package_details["available_version"]),
)
if len(package_details["available_version"]) > 0:
updateButtons.append(QtWidgets.QPushButton(translate("AddonsInstaller","Update")))
updateButtons.append(
QtWidgets.QPushButton(translate("AddonsInstaller", "Update"))
)
updateButtons[-1].setIcon(QtGui.QIcon(":/icons/button_up.svg"))
updateButtons[-1].clicked.connect(partial(self._update_package,package_name))
self.dlg.tableWidget.setCellWidget(counter,3,updateButtons[-1])
updateButtons[-1].clicked.connect(
partial(self._update_package, package_name)
)
self.dlg.tableWidget.setCellWidget(counter, 3, updateButtons[-1])
update_counter += 1
else:
self.dlg.tableWidget.removeCellWidget(counter,3)
self.dlg.tableWidget.removeCellWidget(counter, 3)
counter += 1
self.dlg.tableWidget.setSortingEnabled(True)
self.dlg.tableWidget.horizontalHeader().setStretchLastSection(False)
self.dlg.tableWidget.horizontalHeader().setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
self.dlg.tableWidget.horizontalHeader().setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents)
self.dlg.tableWidget.horizontalHeader().setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents)
self.dlg.tableWidget.horizontalHeader().setSectionResizeMode(3, QtWidgets.QHeaderView.ResizeToContents)
self.dlg.tableWidget.horizontalHeader().setSectionResizeMode(
0, QtWidgets.QHeaderView.Stretch
)
self.dlg.tableWidget.horizontalHeader().setSectionResizeMode(
1, QtWidgets.QHeaderView.ResizeToContents
)
self.dlg.tableWidget.horizontalHeader().setSectionResizeMode(
2, QtWidgets.QHeaderView.ResizeToContents
)
self.dlg.tableWidget.horizontalHeader().setSectionResizeMode(
3, QtWidgets.QHeaderView.ResizeToContents
)
if update_counter > 0:
self.dlg.buttonUpdateAll.setEnabled(True)
else:
self.dlg.buttonUpdateAll.setEnabled(False)
def _parse_pip_list_output(self, all_packages, outdated_packages) -> Dict[str,Dict[str,str]]:
def _parse_pip_list_output(
self, all_packages, outdated_packages
) -> Dict[str, Dict[str, str]]:
# All Packages output looks like this:
# Package Version
# ---------- -------
@@ -160,14 +185,13 @@ class PythonPackageManager:
skip_counter += 1
continue
entries = line.split()
if entries:
print(entries[0])
if len(entries) > 1:
package_name = entries[0]
installed_version = entries[1]
packages[package_name] = {"installed_version":installed_version,"available_version":""}
else:
print(line)
packages[package_name] = {
"installed_version": installed_version,
"available_version": "",
}
skip_counter = 0
for line in outdated_packages:
@@ -179,24 +203,35 @@ class PythonPackageManager:
package_name = entries[0]
installed_version = entries[1]
available_version = entries[2]
packages[package_name] = {"installed_version":installed_version,"available_version":available_version}
else:
print(line)
packages[package_name] = {
"installed_version": installed_version,
"available_version": available_version,
}
return packages
def _update_package(self, package_name) -> None:
for line in range(self.dlg.tableWidget.rowCount()):
if self.dlg.tableWidget.item(line,0).text() == package_name:
self.dlg.tableWidget.setItem(line,2,QtWidgets.QTableWidgetItem(translate("AddonsInstaller","Updating...")))
if self.dlg.tableWidget.item(line, 0).text() == package_name:
self.dlg.tableWidget.setItem(
line,
2,
QtWidgets.QTableWidgetItem(
translate("AddonsInstaller", "Updating...")
),
)
break
QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 50)
call_pip(["install","--upgrade",package_name,"--target",self.vendor_path])
call_pip(["install", "--upgrade", package_name, "--target", self.vendor_path])
self._create_list_from_pip()
QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 50)
def _update_all_packages(self, package_list) -> None:
for package_name, package_details in package_list.items():
if len(package_details["available_version"]) > 0 and package_details["available_version"] != package_details["installed_version"]:
self._update_package(package_name)
if (
len(package_details["available_version"]) > 0
and package_details["available_version"]
!= package_details["installed_version"]
):
self._update_package(package_name)