Addon Manager: Cleanup
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user