Add missing typing

CURA-6983
This commit is contained in:
Jaime van Kessel 2020-01-15 16:47:58 +01:00
parent f12501aec4
commit 0f7f39745d
No known key found for this signature in database
GPG key ID: 3710727397403C91
8 changed files with 36 additions and 48 deletions

View file

@ -15,7 +15,6 @@ from plugins.Toolbox.src.CloudSync.SubscribedPackagesModel import SubscribedPack
class CloudPackageChecker(QObject): class CloudPackageChecker(QObject):
def __init__(self, application: CuraApplication) -> None: def __init__(self, application: CuraApplication) -> None:
super().__init__() super().__init__()
@ -37,7 +36,7 @@ class CloudPackageChecker(QObject):
# check again whenever the login state changes # check again whenever the login state changes
self._application.getCuraAPI().account.loginStateChanged.connect(self._fetchUserSubscribedPackages) self._application.getCuraAPI().account.loginStateChanged.connect(self._fetchUserSubscribedPackages)
def _fetchUserSubscribedPackages(self): def _fetchUserSubscribedPackages(self) -> None:
if self._application.getCuraAPI().account.isLoggedIn: if self._application.getCuraAPI().account.isLoggedIn:
self._getUserPackages() self._getUserPackages()
@ -57,7 +56,7 @@ class CloudPackageChecker(QObject):
if package_discrepancy: if package_discrepancy:
self._handlePackageDiscrepancies() self._handlePackageDiscrepancies()
def _handlePackageDiscrepancies(self): def _handlePackageDiscrepancies(self) -> None:
Logger.log("d", "Discrepancy found between Cloud subscribed packages and Cura installed packages") Logger.log("d", "Discrepancy found between Cloud subscribed packages and Cura installed packages")
sync_message = Message(self._i18n_catalog.i18nc( sync_message = Message(self._i18n_catalog.i18nc(
"@info:generic", "@info:generic",

View file

@ -6,12 +6,11 @@ from plugins.Toolbox.src.UltimakerCloudScope import UltimakerCloudScope
## Manages Cloud subscriptions. When a package is added to a user's account, the user is 'subscribed' to that package ## Manages Cloud subscriptions. When a package is added to a user's account, the user is 'subscribed' to that package
# Whenever the user logs in on another instance of Cura, these subscriptions can be used to sync the user's plugins # Whenever the user logs in on another instance of Cura, these subscriptions can be used to sync the user's plugins
class CloudPackageManager: class CloudPackageManager:
def __init__(self, app: CuraApplication) -> None:
def __init__(self, app: CuraApplication):
self._request_manager = app.getHttpRequestManager() self._request_manager = app.getHttpRequestManager()
self._scope = UltimakerCloudScope(app) self._scope = UltimakerCloudScope(app)
def subscribe(self, package_id: str): def subscribe(self, package_id: str) -> None:
data = "{\"data\": {\"package_id\": \"%s\", \"sdk_version\": \"%s\"}}" % (package_id, CloudApiModel.sdk_version) data = "{\"data\": {\"package_id\": \"%s\", \"sdk_version\": \"%s\"}}" % (package_id, CloudApiModel.sdk_version)
self._request_manager.put(url=CloudApiModel.api_url_user_packages, self._request_manager.put(url=CloudApiModel.api_url_user_packages,
data=data.encode(), data=data.encode(),

View file

@ -12,7 +12,7 @@ from plugins.Toolbox.src.CloudSync.SubscribedPackagesModel import SubscribedPack
# choices are emitted on the `packageMutations` Signal. # choices are emitted on the `packageMutations` Signal.
class DiscrepanciesPresenter(QObject): class DiscrepanciesPresenter(QObject):
def __init__(self, app: QtApplication): def __init__(self, app: QtApplication) -> None:
super().__init__(app) super().__init__(app)
self.packageMutations = Signal() # Emits SubscribedPackagesModel self.packageMutations = Signal() # Emits SubscribedPackagesModel
@ -22,18 +22,18 @@ class DiscrepanciesPresenter(QObject):
self._dialog = None # type: Optional[QObject] self._dialog = None # type: Optional[QObject]
self._compatibility_dialog_path = "resources/qml/dialogs/CompatibilityDialog.qml" self._compatibility_dialog_path = "resources/qml/dialogs/CompatibilityDialog.qml"
def present(self, plugin_path: str, model: SubscribedPackagesModel): def present(self, plugin_path: str, model: SubscribedPackagesModel) -> None:
path = os.path.join(plugin_path, self._compatibility_dialog_path) path = os.path.join(plugin_path, self._compatibility_dialog_path)
self._dialog = self._app.createQmlComponent(path, {"subscribedPackagesModel": model, "handler": self}) self._dialog = self._app.createQmlComponent(path, {"subscribedPackagesModel": model, "handler": self})
assert self._dialog assert self._dialog
self._dialog.accepted.connect(lambda: self._onConfirmClicked(model)) self._dialog.accepted.connect(lambda: self._onConfirmClicked(model))
@pyqtSlot("QVariant", str) @pyqtSlot("QVariant", str)
def dismissIncompatiblePackage(self, model: SubscribedPackagesModel, package_id: str): def dismissIncompatiblePackage(self, model: SubscribedPackagesModel, package_id: str) -> None:
model.dismissPackage(package_id) # update the model to update the view model.dismissPackage(package_id) # update the model to update the view
self._package_manager.dismissPackage(package_id) # adds this package_id as dismissed in the user config file self._package_manager.dismissPackage(package_id) # adds this package_id as dismissed in the user config file
def _onConfirmClicked(self, model: SubscribedPackagesModel): def _onConfirmClicked(self, model: SubscribedPackagesModel) -> None:
# For now, all compatible packages presented to the user should be installed. # For now, all compatible packages presented to the user should be installed.
# Later, we might remove items for which the user unselected the package # Later, we might remove items for which the user unselected the package
model.setItems(model.getCompatiblePackages()) model.setItems(model.getCompatiblePackages())

View file

@ -21,7 +21,7 @@ class DownloadPresenter:
DISK_WRITE_BUFFER_SIZE = 256 * 1024 # 256 KB DISK_WRITE_BUFFER_SIZE = 256 * 1024 # 256 KB
def __init__(self, app: CuraApplication): def __init__(self, app: CuraApplication) -> None:
# Emits (Dict[str, str], List[str]) # (success_items, error_items) # Emits (Dict[str, str], List[str]) # (success_items, error_items)
# Dict{success_package_id, temp_file_path} # Dict{success_package_id, temp_file_path}
# List[errored_package_id] # List[errored_package_id]
@ -35,7 +35,7 @@ class DownloadPresenter:
self._progress = {} # type: Dict[str, Dict[str, Any]] # package_id, Dict self._progress = {} # type: Dict[str, Dict[str, Any]] # package_id, Dict
self._error = [] # type: List[str] # package_id self._error = [] # type: List[str] # package_id
def download(self, model: SubscribedPackagesModel): def download(self, model: SubscribedPackagesModel) -> None:
if self._started: if self._started:
Logger.error("Download already started. Create a new %s instead", self.__class__.__name__) Logger.error("Download already started. Create a new %s instead", self.__class__.__name__)
return return
@ -70,13 +70,13 @@ class DownloadPresenter:
self._started = True self._started = True
self._progress_message.show() self._progress_message.show()
def abort(self): def abort(self) -> None:
manager = HttpRequestManager.getInstance() manager = HttpRequestManager.getInstance()
for item in self._progress.values(): for item in self._progress.values():
manager.abortRequest(item["request_data"]) manager.abortRequest(item["request_data"])
# Aborts all current operations and returns a copy with the same settings such as app and scope # Aborts all current operations and returns a copy with the same settings such as app and scope
def resetCopy(self): def resetCopy(self) -> "DownloadPresenter":
self.abort() self.abort()
self.done.disconnectAll() self.done.disconnectAll()
return DownloadPresenter(self._app) return DownloadPresenter(self._app)
@ -90,7 +90,7 @@ class DownloadPresenter:
progress = 0.0, progress = 0.0,
title = i18n_catalog.i18nc("@info:title", "Changes detected from your Ultimaker account", )) title = i18n_catalog.i18nc("@info:title", "Changes detected from your Ultimaker account", ))
def _onFinished(self, package_id: str, reply: QNetworkReply): def _onFinished(self, package_id: str, reply: QNetworkReply) -> None:
self._progress[package_id]["received"] = self._progress[package_id]["total"] self._progress[package_id]["received"] = self._progress[package_id]["total"]
try: try:
@ -108,7 +108,7 @@ class DownloadPresenter:
self._checkDone() self._checkDone()
def _onProgress(self, package_id: str, rx: int, rt: int): def _onProgress(self, package_id: str, rx: int, rt: int) -> None:
self._progress[package_id]["received"] = rx self._progress[package_id]["received"] = rx
self._progress[package_id]["total"] = rt self._progress[package_id]["total"] = rt

View file

@ -3,13 +3,14 @@ from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura") catalog = i18nCatalog("cura")
# Model for the ToolboxLicenseDialog # Model for the ToolboxLicenseDialog
class LicenseModel(QObject): class LicenseModel(QObject):
dialogTitleChanged = pyqtSignal() dialogTitleChanged = pyqtSignal()
headerChanged = pyqtSignal() headerChanged = pyqtSignal()
licenseTextChanged = pyqtSignal() licenseTextChanged = pyqtSignal()
def __init__(self): def __init__(self) -> None:
super().__init__() super().__init__()
self._current_page_idx = 0 self._current_page_idx = 0
@ -44,7 +45,7 @@ class LicenseModel(QObject):
self._current_page_idx = idx self._current_page_idx = idx
self._updateDialogTitle() self._updateDialogTitle()
def setPageCount(self, count: int): def setPageCount(self, count: int) -> None:
self._page_count = count self._page_count = count
self._updateDialogTitle() self._updateDialogTitle()

View file

@ -15,7 +15,7 @@ from plugins.Toolbox.src.CloudSync.LicenseModel import LicenseModel
# licenseAnswers emits a list of Dicts containing answers when the user has made a choice for all provided packages # licenseAnswers emits a list of Dicts containing answers when the user has made a choice for all provided packages
class LicensePresenter(QObject): class LicensePresenter(QObject):
def __init__(self, app: CuraApplication): def __init__(self, app: CuraApplication) -> None:
super().__init__() super().__init__()
self._dialog = None # type: Optional[QObject] self._dialog = None # type: Optional[QObject]
self._package_manager = app.getPackageManager() # type: PackageManager self._package_manager = app.getPackageManager() # type: PackageManager
@ -34,7 +34,7 @@ class LicensePresenter(QObject):
## Show a license dialog for multiple packages where users can read a license and accept or decline them ## Show a license dialog for multiple packages where users can read a license and accept or decline them
# \param plugin_path: Root directory of the Toolbox plugin # \param plugin_path: Root directory of the Toolbox plugin
# \param packages: Dict[package id, file path] # \param packages: Dict[package id, file path]
def present(self, plugin_path: str, packages: Dict[str, str]): def present(self, plugin_path: str, packages: Dict[str, str]) -> None:
path = os.path.join(plugin_path, self._compatibility_dialog_path) path = os.path.join(plugin_path, self._compatibility_dialog_path)
self._initState(packages) self._initState(packages)
@ -51,16 +51,16 @@ class LicensePresenter(QObject):
self._present_current_package() self._present_current_package()
@pyqtSlot() @pyqtSlot()
def onLicenseAccepted(self): def onLicenseAccepted(self) -> None:
self._package_models[self._current_package_idx]["accepted"] = True self._package_models[self._current_package_idx]["accepted"] = True
self._check_next_page() self._check_next_page()
@pyqtSlot() @pyqtSlot()
def onLicenseDeclined(self): def onLicenseDeclined(self) -> None:
self._package_models[self._current_package_idx]["accepted"] = False self._package_models[self._current_package_idx]["accepted"] = False
self._check_next_page() self._check_next_page()
def _initState(self, packages: Dict[str, str]): def _initState(self, packages: Dict[str, str]) -> None:
self._package_models = [ self._package_models = [
{ {
"package_id" : package_id, "package_id" : package_id,
@ -70,25 +70,26 @@ class LicensePresenter(QObject):
for package_id, package_path in packages.items() for package_id, package_path in packages.items()
] ]
def _present_current_package(self): def _present_current_package(self) -> None:
package_model = self._package_models[self._current_package_idx] package_model = self._package_models[self._current_package_idx]
license_content = self._package_manager.getPackageLicense(package_model["package_path"]) license_content = self._package_manager.getPackageLicense(package_model["package_path"])
if license_content is None: if license_content is None:
# implicitly accept when there is no license # Implicitly accept when there is no license
self.onLicenseAccepted() self.onLicenseAccepted()
return return
self._license_model.setCurrentPageIdx(self._current_package_idx) self._license_model.setCurrentPageIdx(self._current_package_idx)
self._license_model.setPackageName(package_model["package_id"]) self._license_model.setPackageName(package_model["package_id"])
self._license_model.setLicenseText(license_content) self._license_model.setLicenseText(license_content)
if self._dialog:
self._dialog.open() # Does nothing if already open
self._dialog.open() # does nothing if already open def _check_next_page(self) -> None:
def _check_next_page(self):
if self._current_package_idx + 1 < len(self._package_models): if self._current_package_idx + 1 < len(self._package_models):
self._current_package_idx += 1 self._current_package_idx += 1
self._present_current_package() self._present_current_package()
else: else:
if self._dialog:
self._dialog.close() self._dialog.close()
self.licenseAnswers.emit(self._package_models) self.licenseAnswers.emit(self._package_models)

View file

@ -18,17 +18,11 @@ from plugins.Toolbox.src.CloudSync.SubscribedPackagesModel import SubscribedPack
## Presents a dialog telling the user that a restart is required to apply changes ## Presents a dialog telling the user that a restart is required to apply changes
# Since we cannot restart Cura, the app is closed instead when the button is clicked # Since we cannot restart Cura, the app is closed instead when the button is clicked
class RestartApplicationPresenter: class RestartApplicationPresenter:
def __init__(self, app: CuraApplication) -> None:
def __init__(self, app: CuraApplication):
# Emits (Dict[str, str], List[str]) # (success_items, error_items)
# Dict{success_package_id, temp_file_path}
# List[errored_package_id]
self.done = Signal()
self._app = app self._app = app
self._i18n_catalog = i18nCatalog("cura") self._i18n_catalog = i18nCatalog("cura")
def present(self): def present(self) -> None:
app_name = self._app.getApplicationDisplayName() app_name = self._app.getApplicationDisplayName()
message = Message(self._i18n_catalog.i18nc( message = Message(self._i18n_catalog.i18nc(

View file

@ -30,7 +30,7 @@ from plugins.Toolbox.src.CloudSync.SubscribedPackagesModel import SubscribedPack
# - The RestartApplicationPresenter notifies the user that a restart is required for changes to take effect # - The RestartApplicationPresenter notifies the user that a restart is required for changes to take effect
class SyncOrchestrator(Extension): class SyncOrchestrator(Extension):
def __init__(self, app: CuraApplication): def __init__(self, app: CuraApplication) -> None:
super().__init__() super().__init__()
# Differentiate This PluginObject from the Toolbox. self.getId() includes _name. # Differentiate This PluginObject from the Toolbox. self.getId() includes _name.
# getPluginId() will return the same value for The toolbox extension and this one # getPluginId() will return the same value for The toolbox extension and this one
@ -52,11 +52,11 @@ class SyncOrchestrator(Extension):
self._restart_presenter = RestartApplicationPresenter(app) self._restart_presenter = RestartApplicationPresenter(app)
def _onDiscrepancies(self, model: SubscribedPackagesModel): def _onDiscrepancies(self, model: SubscribedPackagesModel) -> None:
plugin_path = PluginRegistry.getInstance().getPluginPath(self.getPluginId()) plugin_path = PluginRegistry.getInstance().getPluginPath(self.getPluginId())
self._discrepancies_presenter.present(plugin_path, model) self._discrepancies_presenter.present(plugin_path, model)
def _onPackageMutations(self, mutations: SubscribedPackagesModel): def _onPackageMutations(self, mutations: SubscribedPackagesModel) -> None:
self._download_presenter = self._download_presenter.resetCopy() self._download_presenter = self._download_presenter.resetCopy()
self._download_presenter.done.connect(self._onDownloadFinished) self._download_presenter.done.connect(self._onDownloadFinished)
self._download_presenter.download(mutations) self._download_presenter.download(mutations)
@ -64,13 +64,13 @@ class SyncOrchestrator(Extension):
## Called when a set of packages have finished downloading ## Called when a set of packages have finished downloading
# \param success_items: Dict[package_id, file_path] # \param success_items: Dict[package_id, file_path]
# \param error_items: List[package_id] # \param error_items: List[package_id]
def _onDownloadFinished(self, success_items: Dict[str, str], error_items: List[str]): def _onDownloadFinished(self, success_items: Dict[str, str], error_items: List[str]) -> None:
# todo handle error items # todo handle error items
plugin_path = PluginRegistry.getInstance().getPluginPath(self.getPluginId()) plugin_path = PluginRegistry.getInstance().getPluginPath(self.getPluginId())
self._license_presenter.present(plugin_path, success_items) self._license_presenter.present(plugin_path, success_items)
# Called when user has accepted / declined all licenses for the downloaded packages # Called when user has accepted / declined all licenses for the downloaded packages
def _onLicenseAnswers(self, answers: List[Dict[str, Any]]): def _onLicenseAnswers(self, answers: List[Dict[str, Any]]) -> None:
Logger.debug("Got license answers: {}", answers) Logger.debug("Got license answers: {}", answers)
has_changes = False # True when at least one package is installed has_changes = False # True when at least one package is installed
@ -91,9 +91,3 @@ class SyncOrchestrator(Extension):
if has_changes: if has_changes:
self._restart_presenter.present() self._restart_presenter.present()