From e5257703321825d9ca488f7b60e18900b91fd869 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 6 Dec 2021 17:14:02 +0100 Subject: [PATCH 1/2] Cast result to list after _updateLocalPackages Because the _updateLocalPackages function guarantees it to be a list now, not None any more. Contributes to issue CURA-8587. --- cura/CuraPackageManager.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cura/CuraPackageManager.py b/cura/CuraPackageManager.py index 3ef24368fd..e3595ef4bb 100644 --- a/cura/CuraPackageManager.py +++ b/cura/CuraPackageManager.py @@ -1,7 +1,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import Any, Dict, List, Tuple, TYPE_CHECKING, Optional, Generator +from typing import Any, cast, Dict, List, Tuple, TYPE_CHECKING, Optional, Generator from cura.CuraApplication import CuraApplication #To find some resource types. from cura.Settings.GlobalStack import GlobalStack @@ -30,7 +30,9 @@ class CuraPackageManager(PackageManager): """locally installed packages, lazy execution""" if self._local_packages is None: self._updateLocalPackages() - return self._local_packages + # _updateLocalPackages always results in a list of packages, not None. + # It's guaranteed to be a list now. + return cast(List[Dict[str, Any]], self._local_packages) def initialize(self) -> None: self._installation_dirs_dict["materials"] = Resources.getStoragePath(CuraApplication.ResourceTypes.MaterialInstanceContainer) From aec643fd44157e3101040beb513405280e2e1c77 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 6 Dec 2021 17:22:07 +0100 Subject: [PATCH 2/2] Fix several typing issues Contributes to issue CURA-8587. --- plugins/Marketplace/PackageList.py | 7 ++++--- plugins/Marketplace/PackageModel.py | 6 ++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/plugins/Marketplace/PackageList.py b/plugins/Marketplace/PackageList.py index 6a931c1e4b..665451ba18 100644 --- a/plugins/Marketplace/PackageList.py +++ b/plugins/Marketplace/PackageList.py @@ -4,7 +4,7 @@ import tempfile import json from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, Qt -from typing import Dict, Optional, Set, TYPE_CHECKING +from typing import cast, Dict, Optional, Set, TYPE_CHECKING from UM.i18n import i18nCatalog from UM.Qt.ListModel import ListModel @@ -14,7 +14,7 @@ from UM.Logger import Logger from UM import PluginRegistry from cura.CuraApplication import CuraApplication -from cura import CuraPackageManager +from cura.CuraPackageManager import CuraPackageManager from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope # To make requests to the Ultimaker API with correct authorization. from .PackageModel import PackageModel @@ -22,6 +22,7 @@ from .Constants import USER_PACKAGES_URL if TYPE_CHECKING: from PyQt5.QtCore import QObject + from PyQt5.QtNetwork import QNetworkReply catalog = i18nCatalog("cura") @@ -35,7 +36,7 @@ class PackageList(ListModel): def __init__(self, parent: Optional["QObject"] = None) -> None: super().__init__(parent) - self._manager: CuraPackageManager = CuraApplication.getInstance().getPackageManager() + self._manager: CuraPackageManager = cast(CuraPackageManager, CuraApplication.getInstance().getPackageManager()) self._plugin_registry: PluginRegistry = CuraApplication.getInstance().getPluginRegistry() self._account = CuraApplication.getInstance().getCuraAPI().account self._error_message = "" diff --git a/plugins/Marketplace/PackageModel.py b/plugins/Marketplace/PackageModel.py index 92daf310a3..f7682340c9 100644 --- a/plugins/Marketplace/PackageModel.py +++ b/plugins/Marketplace/PackageModel.py @@ -71,11 +71,13 @@ class PackageModel(QObject): self.sdk_version = package_data.get("sdk_version_semver", "") # Note that there's a lot more info in the package_data than just these specified here. - def __eq__(self, other: Union[str, "PackageModel"]): + def __eq__(self, other: object): if isinstance(other, PackageModel): return other == self - else: + elif isinstance(other, str): return other == self._package_id + else: + return False def __repr__(self): return f"<{self._package_id} : {self._package_version} : {self._section_title}>"