diff --git a/novelwriter/common.py b/novelwriter/common.py index 5f8fedff..a325e604 100644 --- a/novelwriter/common.py +++ b/novelwriter/common.py @@ -209,8 +209,7 @@ def checkIntTuple(value: int, valid: tuple | list | set, default: int) -> int: # =============================================================================================== # def formatInt(value: int) -> str: - """Formats an integer with k, M, G etc. - """ + """Formats an integer with k, M, G etc.""" if not isinstance(value, int): return "ERR" diff --git a/novelwriter/core/project.py b/novelwriter/core/project.py index 51cc8955..20fb6dc2 100644 --- a/novelwriter/core/project.py +++ b/novelwriter/core/project.py @@ -46,7 +46,7 @@ from novelwriter.core.sessions import NWSessionLog from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLReadState from novelwriter.core.projectdata import NWProjectData from novelwriter.common import ( - checkStringNone, formatTimeStamp, hexToInt, makeFileNameSafe, minmax + checkStringNone, formatInt, formatTimeStamp, hexToInt, makeFileNameSafe, minmax ) if TYPE_CHECKING: # pragma: no cover @@ -446,14 +446,14 @@ class NWProject(QObject): ), nwAlert.ERROR, exception=exc) return False - archName = baseDir / self.tr( - "Backup from {0}" - ).format(formatTimeStamp(time(), fileSafe=True) + ".zip") + timeStamp = formatTimeStamp(time(), fileSafe=True) + archName = baseDir / f"{cleanName} {timeStamp}.zip" if self._storage.zipIt(archName, compression=2): + size = archName.stat().st_size if doNotify: self.mainGui.makeAlert(self.tr( - "Backup archive file written to: {0}" - ).format(str(archName), nwAlert.INFO)) + "Backup archive file written to: {0} [{1}B]" + ).format(str(archName), formatInt(size)), nwAlert.INFO) else: self.mainGui.makeAlert(self.tr( "Could not write backup archive." diff --git a/tests/test_core/test_core_project.py b/tests/test_core/test_core_project.py index 3e0e7b11..cf76b7f7 100644 --- a/tests/test_core/test_core_project.py +++ b/tests/test_core/test_core_project.py @@ -620,12 +620,12 @@ def testCoreProject_Backup(monkeypatch, mockGUI, fncPath, tstPaths): theFiles = list((tstPaths.tmpDir / "Test Minimal").iterdir()) assert len(theFiles) in (1, 2) # Sometimes 2 due to clock tick - theZip = theFiles[-1].name - assert theZip[:12] == "Backup from " - assert theZip[-4:] == ".zip" + theZip = theFiles[-1] + assert theZip.name.startswith("Test Minimal") + assert theZip.suffix == ".zip" # Extract the archive - with ZipFile(tstPaths.tmpDir / "Test Minimal" / theZip, mode="r") as inZip: + with ZipFile(tstPaths.tmpDir / "Test Minimal" / theZip.name, mode="r") as inZip: inZip.extractall(tstPaths.tmpDir / "extract") # Check that the main project file was restored