From c6524d02ea16951703c9557d70182d290ed6e269 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 14 Feb 2024 23:22:43 +0100 Subject: [PATCH] Delete the old updates dialog --- novelwriter/dialogs/updates.py | 172 ------------------------- novelwriter/gui/mainmenu.py | 7 - novelwriter/guimain.py | 12 -- tests/test_dialogs/test_dlg_dialogs.py | 41 +----- 4 files changed, 1 insertion(+), 231 deletions(-) delete mode 100644 novelwriter/dialogs/updates.py diff --git a/novelwriter/dialogs/updates.py b/novelwriter/dialogs/updates.py deleted file mode 100644 index ef0b0c1f..00000000 --- a/novelwriter/dialogs/updates.py +++ /dev/null @@ -1,172 +0,0 @@ -""" -novelWriter – GUI Updates -========================= - -File History: -Created: 2021-08-21 [1.5b1] GuiUpdates - -This file is a part of novelWriter -Copyright 2018–2024, Veronica Berglyd Olsen - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -""" -from __future__ import annotations - -import json -import logging - -from datetime import datetime -from urllib.request import Request, urlopen - -from PyQt5.QtGui import QCloseEvent, QCursor -from PyQt5.QtCore import Qt -from PyQt5.QtWidgets import ( - QWidget, qApp, QDialog, QHBoxLayout, QVBoxLayout, QDialogButtonBox, QLabel -) - -from novelwriter import CONFIG, SHARED, __version__, __date__ -from novelwriter.common import logException -from novelwriter.constants import nwConst - -logger = logging.getLogger(__name__) - - -class GuiUpdates(QDialog): - - def __init__(self, parent: QWidget) -> None: - super().__init__(parent=parent) - - logger.debug("Create: GuiUpdates") - self.setObjectName("GuiUpdates") - self.setWindowTitle(self.tr("Check for Updates")) - - nPx = CONFIG.pxInt(96) - sPx = CONFIG.pxInt(16) - tPx = CONFIG.pxInt(8) - mPx = CONFIG.pxInt(4) - - # Left Box - self.nwIcon = QLabel() - self.nwIcon.setPixmap(SHARED.theme.getPixmap("novelwriter", (nPx, nPx))) - - self.leftBox = QVBoxLayout() - self.leftBox.addWidget(self.nwIcon) - self.leftBox.addStretch(1) - - # Right Box - self.currentLabel = QLabel(self.tr("Current Release")) - self.currentValue = QLabel(self.tr( - "novelWriter {0} released on {1}" - ).format( - "v%s" % __version__, - datetime.strptime(__date__, "%Y-%m-%d").strftime("%x")) - ) - - self.latestLabel = QLabel(self.tr("Latest Release")) - self.latestValue = QLabel(self.tr("Checking ...")) - self.latestLink = QLabel("") - self.latestLink.setOpenExternalLinks(True) - - self.rightBox = QVBoxLayout() - self.rightBox.addWidget(self.currentLabel) - self.rightBox.addWidget(self.currentValue) - self.rightBox.addSpacing(tPx) - self.rightBox.addWidget(self.latestLabel) - self.rightBox.addWidget(self.latestValue) - self.rightBox.addSpacing(tPx) - self.rightBox.addWidget(self.latestLink) - self.rightBox.setSpacing(mPx) - - hFont = self.currentLabel.font() - hFont.setBold(True) - self.currentLabel.setFont(hFont) - self.latestLabel.setFont(hFont) - - # Buttons - self.buttonBox = QDialogButtonBox(QDialogButtonBox.Close) - self.buttonBox.rejected.connect(self.close) - - # Assemble - self.innerBox = QHBoxLayout() - self.innerBox.addLayout(self.leftBox) - self.innerBox.addLayout(self.rightBox) - self.innerBox.setSpacing(sPx) - - self.outerBox = QVBoxLayout() - self.outerBox.addLayout(self.innerBox) - self.outerBox.addWidget(self.buttonBox) - self.outerBox.setSpacing(sPx) - - self.setLayout(self.outerBox) - - logger.debug("Ready: GuiUpdates") - - return - - def __del__(self) -> None: # pragma: no cover - logger.debug("Delete: GuiUpdates") - return - - def checkLatest(self) -> None: - """Check for latest release.""" - qApp.setOverrideCursor(QCursor(Qt.WaitCursor)) - - urlReq = Request("https://api.github.com/repos/vkbo/novelwriter/releases/latest") - urlReq.add_header("User-Agent", nwConst.USER_AGENT) - urlReq.add_header("Accept", "application/vnd.github.v3+json") - - rawData = {} - try: - urlData = urlopen(urlReq, timeout=10) - rawData = json.loads(urlData.read().decode()) - except Exception: - logger.error("Failed to contact GitHub API") - logException() - - relVersion = rawData.get("tag_name", "Unknown") - relDate = rawData.get("created_at", "") - - try: - relDate = datetime.strptime(relDate[:10], "%Y-%m-%d").strftime("%x") - except Exception: - relDate = "Unknown" - logException() - - self.latestValue.setText(self.tr( - "novelWriter {0} released on {1}" - ).format( - relVersion, relDate - )) - - self.latestLink.setText(self.tr( - "Download: {0}" - ).format( - f'{nwConst.URL_WEB}' - )) - - qApp.restoreOverrideCursor() - - return - - ## - # Events - ## - - def closeEvent(self, event: QCloseEvent) -> None: - """Capture the user closing the window.""" - event.accept() - self.deleteLater() - return - -# END Class GuiUpdates diff --git a/novelwriter/gui/mainmenu.py b/novelwriter/gui/mainmenu.py index 0465bed5..ae99f6c2 100644 --- a/novelwriter/gui/mainmenu.py +++ b/novelwriter/gui/mainmenu.py @@ -964,13 +964,6 @@ class GuiMainMenu(QMenuBar): self.aWebsite = self.helpMenu.addAction(self.tr("The novelWriter Website")) self.aWebsite.triggered.connect(lambda: self._openWebsite(nwConst.URL_WEB)) - # Help > Separator - self.helpMenu.addSeparator() - - # Document > Check for Updates - self.aUpdates = self.helpMenu.addAction(self.tr("Check for New Release")) - self.aUpdates.triggered.connect(self.mainGui.showUpdatesDialog) - return # END Class GuiMainMenu diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index c14b7576..2f99ed86 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -51,7 +51,6 @@ from novelwriter.gui.statusbar import GuiMainStatus from novelwriter.gui.itemdetails import GuiItemDetails from novelwriter.gui.docviewerpanel import GuiDocViewerPanel from novelwriter.dialogs.about import GuiAbout -from novelwriter.dialogs.updates import GuiUpdates from novelwriter.dialogs.wordlist import GuiWordList from novelwriter.dialogs.preferences import GuiPreferences from novelwriter.dialogs.projectsettings import GuiProjectSettings @@ -884,17 +883,6 @@ class GuiMain(QMainWindow): msgBox.aboutQt(self, "About Qt") return - @pyqtSlot() - def showUpdatesDialog(self) -> None: - """Show the check for updates dialog.""" - dialog = GuiUpdates(self) - dialog.setModal(True) - dialog.show() - dialog.raise_() - qApp.processEvents() - dialog.checkLatest() - return - @pyqtSlot() def showDictionariesDialog(self) -> None: """Show the download dictionaries dialog.""" diff --git a/tests/test_dialogs/test_dlg_dialogs.py b/tests/test_dialogs/test_dlg_dialogs.py index 94d488ed..7cf9d9f6 100644 --- a/tests/test_dialogs/test_dlg_dialogs.py +++ b/tests/test_dialogs/test_dlg_dialogs.py @@ -23,10 +23,9 @@ from __future__ import annotations import pytest from PyQt5.QtCore import QItemSelectionModel -from PyQt5.QtWidgets import QAction, QListWidgetItem, QDialog +from PyQt5.QtWidgets import QListWidgetItem, QDialog from novelwriter.dialogs.quotes import GuiQuoteSelect -from novelwriter.dialogs.updates import GuiUpdates from novelwriter.dialogs.editlabel import GuiEditLabel @@ -66,44 +65,6 @@ def testDlgOther_QuoteSelect(qtbot, monkeypatch, nwGUI): # END Test testDlgOther_QuoteSelect -@pytest.mark.gui -def testDlgOther_Updates(qtbot, monkeypatch, nwGUI): - """Test the check for updates dialog.""" - nwUpdate = GuiUpdates(nwGUI) - nwUpdate.show() - - class mockData: - def decode(self): - return '{"tag_name": "v1.0", "created_at": "2021-01-01T12:00:00Z"}' - - class mockPayload: - def read(self): - return mockData() - - def mockUrlopenA(*a, **k): - return None - - def mockUrlopenB(*a, **k): - return mockPayload() - - # Faulty Return - monkeypatch.setattr("novelwriter.dialogs.updates.urlopen", mockUrlopenA) - nwUpdate.checkLatest() - - # Valid Return - monkeypatch.setattr("novelwriter.dialogs.updates.urlopen", mockUrlopenB) - nwUpdate.checkLatest() - assert nwUpdate.latestValue.text().startswith("novelWriter v1.0") - - # Trigger from Menu - nwGUI.mainMenu.aUpdates.activate(QAction.Trigger) - - # qtbot.stop() - nwUpdate.close() - -# END Test testDlgOther_Updates - - @pytest.mark.gui def testDlgOther_EditLabel(qtbot, monkeypatch): """Test the label editor dialog."""