Clean up code style (#1859)

This commit is contained in:
Veronica Berglyd Olsen
2024-05-10 16:39:26 +02:00
committed by GitHub
129 changed files with 287 additions and 1205 deletions
+1 -1
View File
@@ -36,7 +36,7 @@ jobs:
- name: Run Tests - name: Run Tests
run: | run: |
export QT_QPA_PLATFORM=offscreen export QT_QPA_PLATFORM=offscreen
pytest -v --cov=novelwriter --timeout=60 python -m pytest -v --cov=novelwriter --timeout=60
- name: Upload to Codecov - name: Upload to Codecov
uses: codecov/codecov-action@v4 uses: codecov/codecov-action@v4
env: env:
+1 -1
View File
@@ -30,7 +30,7 @@ jobs:
- name: Run Tests - name: Run Tests
run: | run: |
export QT_QPA_PLATFORM=offscreen export QT_QPA_PLATFORM=offscreen
pytest -v --cov=novelwriter --timeout=60 python -m pytest -v --cov=novelwriter --timeout=60
- name: Upload to Codecov - name: Upload to Codecov
uses: codecov/codecov-action@v4 uses: codecov/codecov-action@v4
env: env:
+1 -1
View File
@@ -26,7 +26,7 @@ jobs:
pip install -U -r requirements.txt -r tests/requirements.txt pip install -U -r requirements.txt -r tests/requirements.txt
- name: Run Tests - name: Run Tests
run: | run: |
pytest -v --cov=novelwriter --timeout=60 python -m pytest -v --cov=novelwriter --timeout=60
- name: Upload to Codecov - name: Upload to Codecov
uses: codecov/codecov-action@v4 uses: codecov/codecov-action@v4
env: env:
-2
View File
@@ -242,5 +242,3 @@ def main(sysArgs: list | None = None) -> GuiMain | None:
sys.exit(nwApp.exec()) sys.exit(nwApp.exec())
return None return None
# END Function main
-2
View File
@@ -603,5 +603,3 @@ class NWConfigParser(ConfigParser):
for i in range(min(len(data), len(result))): for i in range(min(len(data), len(result))):
result[i] = checkInt(data[i].strip(), result[i]) result[i] = checkInt(data[i].strip(), result[i])
return result return result
# END Class NWConfigParser
+5 -9
View File
@@ -24,24 +24,24 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from __future__ import annotations from __future__ import annotations
import sys
import json import json
import logging import logging
import sys
from time import time
from pathlib import Path
from datetime import datetime from datetime import datetime
from pathlib import Path
from time import time
from PyQt5.QtGui import QFontDatabase
from PyQt5.QtCore import ( from PyQt5.QtCore import (
PYQT_VERSION, PYQT_VERSION_STR, QT_VERSION, QT_VERSION_STR, QLibraryInfo, PYQT_VERSION, PYQT_VERSION_STR, QT_VERSION, QT_VERSION_STR, QLibraryInfo,
QLocale, QStandardPaths, QSysInfo, QTranslator QLocale, QStandardPaths, QSysInfo, QTranslator
) )
from PyQt5.QtGui import QFontDatabase
from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QApplication
from novelwriter.error import formatException, logException
from novelwriter.common import NWConfigParser, checkInt, checkPath, formatTimeStamp from novelwriter.common import NWConfigParser, checkInt, checkPath, formatTimeStamp
from novelwriter.constants import nwFiles, nwUnicode from novelwriter.constants import nwFiles, nwUnicode
from novelwriter.error import formatException, logException
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -787,8 +787,6 @@ class Config:
logger.debug("Checking package 'pyenchant': OK") logger.debug("Checking package 'pyenchant': OK")
return return
# END Class Config
class RecentProjects: class RecentProjects:
@@ -857,5 +855,3 @@ class RecentProjects:
logger.debug("Removed recent: %s", path) logger.debug("Removed recent: %s", path)
self.saveCache() self.saveCache()
return return
# END Class RecentProjects
-24
View File
@@ -60,8 +60,6 @@ class nwConst:
# Dialogs # Dialogs
DLG_FINISHED = 2 DLG_FINISHED = 2
# END Class nwConst
class nwRegEx: class nwRegEx:
@@ -71,8 +69,6 @@ class nwRegEx:
FMT_SC = r"(?i)(?<!\\)(\[[\/\!]?(?:i|b|s|u|m|sup|sub)\])" FMT_SC = r"(?i)(?<!\\)(\[[\/\!]?(?:i|b|s|u|m|sup|sub)\])"
FMT_SV = r"(?<!\\)(\[(?i)(?:footnote):)(.+?)(?<!\\)(\])" FMT_SV = r"(?<!\\)(\[(?i)(?:footnote):)(.+?)(?<!\\)(\])"
# END Class nwRegEx
class nwShortcode: class nwShortcode:
@@ -98,16 +94,12 @@ class nwShortcode:
nwComment.COMMENT: "[comment:{0}]", nwComment.COMMENT: "[comment:{0}]",
} }
# END Class nwShortcode
class nwHeaders: class nwHeaders:
H_VALID = ("H0", "H1", "H2", "H3", "H4") H_VALID = ("H0", "H1", "H2", "H3", "H4")
H_LEVEL = {"H0": 0, "H1": 1, "H2": 2, "H3": 3, "H4": 4} H_LEVEL = {"H0": 0, "H1": 1, "H2": 2, "H3": 3, "H4": 4}
# END Class nwHeaders
class nwFiles: class nwFiles:
@@ -127,8 +119,6 @@ class nwFiles:
DICT_FILE = "userdict.json" DICT_FILE = "userdict.json"
SESS_FILE = "sessions.jsonl" SESS_FILE = "sessions.jsonl"
# END Class nwFiles
class nwKeyWords: class nwKeyWords:
@@ -162,8 +152,6 @@ class nwKeyWords:
CUSTOM_KEY: nwItemClass.CUSTOM, CUSTOM_KEY: nwItemClass.CUSTOM,
} }
# END Class nwKeyWords
class nwLists: class nwLists:
@@ -177,8 +165,6 @@ class nwLists:
nwItemClass.CUSTOM, nwItemClass.CUSTOM,
] ]
# END Class nwLists
class nwLabels: class nwLabels:
@@ -339,8 +325,6 @@ class nwLabels:
"Custom": (-1.0, -1.0), "Custom": (-1.0, -1.0),
} }
# END Class nwLabels
class nwHeadFmt: class nwHeadFmt:
@@ -366,8 +350,6 @@ class nwHeadFmt:
ODT_PAGE = "{Page}" ODT_PAGE = "{Page}"
ODT_AUTO = "{Project} / {Author} / {Page}" ODT_AUTO = "{Project} / {Author} / {Page}"
# END Class nwHeadFmt
class nwQuotes: class nwQuotes:
"""Allowed quotation marks. """Allowed quotation marks.
@@ -398,8 +380,6 @@ class nwQuotes:
"\u300f": QT_TRANSLATE_NOOP("Constant", "Right white corner bracket"), "\u300f": QT_TRANSLATE_NOOP("Constant", "Right white corner bracket"),
} }
# END Class nwQuotes
class nwUnicode: class nwUnicode:
"""Supported unicode character constants and their HTML equivalents.""" """Supported unicode character constants and their HTML equivalents."""
@@ -534,8 +514,6 @@ class nwUnicode:
H_LTRI = "&#9664;" H_LTRI = "&#9664;"
H_LTRIS = "&#9666;" H_LTRIS = "&#9666;"
# END Class nwUnicode
class nwHtmlUnicode(): class nwHtmlUnicode():
@@ -591,5 +569,3 @@ class nwHtmlUnicode():
nwUnicode.U_TIMES: nwUnicode.H_TIMES, nwUnicode.U_TIMES: nwUnicode.H_TIMES,
nwUnicode.U_DIVIDE: nwUnicode.H_DIVIDE, nwUnicode.U_DIVIDE: nwUnicode.H_DIVIDE,
} }
# END Class nwHtmlUnicode
-6
View File
@@ -172,8 +172,6 @@ class FilterMode(Enum):
SKIPPED = 4 SKIPPED = 4
ROOT = 5 ROOT = 5
# END Enum FilterMode
class BuildSettings: class BuildSettings:
"""Core: Build Settings Class """Core: Build Settings Class
@@ -488,8 +486,6 @@ class BuildSettings:
return return
# END Class BuildSettings
class BuildCollection: class BuildCollection:
"""Core: Build Collection Class """Core: Build Collection Class
@@ -637,5 +633,3 @@ class BuildCollection:
return False return False
return True return True
# END Class BuildCollection
-10
View File
@@ -129,8 +129,6 @@ class DocMerger:
return status return status
# END Class DocMerger
class DocSplitter: class DocSplitter:
"""Document tool for splitting a document into a set of new """Document tool for splitting a document into a set of new
@@ -257,8 +255,6 @@ class DocSplitter:
return return
# END Class DocSplitter
class DocDuplicator: class DocDuplicator:
"""A class that will duplicate all documents and folders starting """A class that will duplicate all documents and folders starting
@@ -297,8 +293,6 @@ class DocDuplicator:
nHandle = None nHandle = None
return return
# END Class DocDuplicator
class DocSearch: class DocSearch:
@@ -375,8 +369,6 @@ class DocSearch:
search = f"(?:^|\\b){search}(?:$|\\b)" search = f"(?:^|\\b){search}(?:$|\\b)"
return search return search
# END Class DocSearch
class ProjectBuilder: class ProjectBuilder:
"""A class to build a new project from a set of user-defined """A class to build a new project from a set of user-defined
@@ -609,5 +601,3 @@ class ProjectBuilder:
return False return False
return True return True
# END Class ProjectBuilder
-2
View File
@@ -405,5 +405,3 @@ class NWBuildDocument:
return False return False
return True return True
# END Class NWBuildDocument
+3 -5
View File
@@ -26,14 +26,14 @@ from __future__ import annotations
import hashlib import hashlib
import logging import logging
from pathlib import Path
from time import time from time import time
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from pathlib import Path
from novelwriter.enum import nwItemLayout, nwItemClass
from novelwriter.error import formatException, logException
from novelwriter.common import formatTimeStamp, isHandle from novelwriter.common import formatTimeStamp, isHandle
from novelwriter.core.item import NWItem from novelwriter.core.item import NWItem
from novelwriter.enum import nwItemClass, nwItemLayout
from novelwriter.error import formatException, logException
if TYPE_CHECKING: # pragma: no cover if TYPE_CHECKING: # pragma: no cover
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
@@ -359,5 +359,3 @@ class NWDocument:
logger.debug("Unknown meta data: '%s'", metaLine.strip()) logger.debug("Unknown meta data: '%s'", metaLine.strip())
return return
# END Class NWDocument
+6 -19
View File
@@ -707,12 +707,9 @@ class NWIndex:
return tName, tClass, iItem, None if iItem is None else iItem[tHeading] return tName, tClass, iItem, None if iItem is None else iItem[tHeading]
return "", "", None, None return "", "", None, None
# END Class NWIndex
# The Tags Index Object
# =============================================================================================== # # =====================
# The Tags Index Object
# =============================================================================================== #
class TagsIndex: class TagsIndex:
"""Core: Tags Index Wrapper Class """Core: Tags Index Wrapper Class
@@ -832,12 +829,9 @@ class TagsIndex:
return return
# END Class TagsIndex
# The Item Index Objects
# =============================================================================================== # # ======================
# The Item Index Objects
# =============================================================================================== #
class ItemIndex: class ItemIndex:
"""Core: Item Index Wrapper Class """Core: Item Index Wrapper Class
@@ -1014,8 +1008,6 @@ class ItemIndex:
return return
# END Class ItemIndex
class IndexItem: class IndexItem:
"""Core: Single Index Item Class """Core: Single Index Item Class
@@ -1176,8 +1168,6 @@ class IndexItem:
return return
# END Class IndexItem
class IndexHeading: class IndexHeading:
"""Core: Single Index Heading Class """Core: Single Index Heading Class
@@ -1353,12 +1343,9 @@ class IndexHeading:
raise ValueError("The itemIndex contains an invalid reference type") raise ValueError("The itemIndex contains an invalid reference type")
return return
# END Class IndexHeading
# Text Processing Functions
# =============================================================================================== # # =========================
# Text Processing Functions
# =============================================================================================== #
MODIFIERS = { MODIFIERS = {
"synopsis": nwComment.SYNOPSIS, "synopsis": nwComment.SYNOPSIS,
+3 -4
View File
@@ -29,11 +29,12 @@ from typing import TYPE_CHECKING, Any
from PyQt5.QtGui import QIcon from PyQt5.QtGui import QIcon
from novelwriter.enum import nwItemType, nwItemClass, nwItemLayout
from novelwriter.common import ( from novelwriter.common import (
checkInt, isHandle, isItemClass, isItemLayout, isItemType, simplified, yesNo checkInt, isHandle, isItemClass, isItemLayout, isItemType, simplified,
yesNo
) )
from novelwriter.constants import nwHeaders, nwLabels, trConst from novelwriter.constants import nwHeaders, nwLabels, trConst
from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType
if TYPE_CHECKING: # pragma: no cover if TYPE_CHECKING: # pragma: no cover
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
@@ -557,5 +558,3 @@ class NWItem:
"""Save the initial word count.""" """Save the initial word count."""
self._initCount = self._wordCount self._initCount = self._wordCount
return return
# END Class NWItem
+2 -4
View File
@@ -28,12 +28,12 @@ import json
import logging import logging
from enum import Enum from enum import Enum
from typing import TYPE_CHECKING, Any, TypeVar
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING, Any, TypeVar
from novelwriter.error import logException
from novelwriter.common import checkBool, checkFloat, checkInt, checkString, jsonEncode from novelwriter.common import checkBool, checkFloat, checkInt, checkString, jsonEncode
from novelwriter.constants import nwFiles from novelwriter.constants import nwFiles
from novelwriter.error import logException
if TYPE_CHECKING: # pragma: no cover if TYPE_CHECKING: # pragma: no cover
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
@@ -218,5 +218,3 @@ class OptionState:
if value in lookup.__members__: if value in lookup.__members__:
return lookup[value] return lookup[value]
return default return default
# END Class OptionState
+5 -8
View File
@@ -35,11 +35,12 @@ from typing import TYPE_CHECKING
from PyQt5.QtCore import QCoreApplication from PyQt5.QtCore import QCoreApplication
from novelwriter import CONFIG, SHARED, __version__, __hexversion__ from novelwriter import CONFIG, SHARED, __hexversion__, __version__
from novelwriter.common import ( from novelwriter.common import (
checkStringNone, formatInt, formatTimeStamp, getFileSize, hexToInt, makeFileNameSafe, minmax checkStringNone, formatInt, formatTimeStamp, getFileSize, hexToInt,
makeFileNameSafe, minmax
) )
from novelwriter.constants import trConst, nwLabels from novelwriter.constants import nwLabels, trConst
from novelwriter.core.index import NWIndex from novelwriter.core.index import NWIndex
from novelwriter.core.options import OptionState from novelwriter.core.options import OptionState
from novelwriter.core.projectdata import NWProjectData from novelwriter.core.projectdata import NWProjectData
@@ -47,7 +48,7 @@ from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLR
from novelwriter.core.sessions import NWSessionLog from novelwriter.core.sessions import NWSessionLog
from novelwriter.core.storage import NWStorage, NWStorageOpen from novelwriter.core.storage import NWStorage, NWStorageOpen
from novelwriter.core.tree import NWTree from novelwriter.core.tree import NWTree
from novelwriter.enum import nwItemType, nwItemClass, nwItemLayout from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType
from novelwriter.error import logException from novelwriter.error import logException
if TYPE_CHECKING: # pragma: no cover if TYPE_CHECKING: # pragma: no cover
@@ -63,8 +64,6 @@ class NWProjectState(Enum):
RECOVERY = 2 RECOVERY = 2
READY = 3 READY = 3
# END Enum NWProjectState
class NWProject: class NWProject:
@@ -595,5 +594,3 @@ class NWProject:
return False return False
return True return True
# END Class NWProject
+1 -3
View File
@@ -23,8 +23,8 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from __future__ import annotations from __future__ import annotations
import uuid
import logging import logging
import uuid
from typing import TYPE_CHECKING, Any from typing import TYPE_CHECKING, Any
@@ -322,5 +322,3 @@ class NWProjectData:
self._autoReplace[key] = simplified(entry) self._autoReplace[key] = simplified(entry)
self._project.setProjectChanged(True) self._project.setProjectChanged(True)
return return
# END Class NWProjectData
+3 -9
View File
@@ -29,19 +29,19 @@ import logging
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
from enum import Enum from enum import Enum
from pathlib import Path
from time import time from time import time
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from pathlib import Path
from novelwriter import __version__, __hexversion__ from novelwriter import __hexversion__, __version__
from novelwriter.common import ( from novelwriter.common import (
checkBool, checkInt, checkString, checkStringNone, formatTimeStamp, checkBool, checkInt, checkString, checkStringNone, formatTimeStamp,
hexToInt, simplified, xmlIndent, yesNo hexToInt, simplified, xmlIndent, yesNo
) )
if TYPE_CHECKING: # pragma: no cover if TYPE_CHECKING: # pragma: no cover
from novelwriter.core.status import NWStatus
from novelwriter.core.projectdata import NWProjectData from novelwriter.core.projectdata import NWProjectData
from novelwriter.core.status import NWStatus
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -70,8 +70,6 @@ class XMLReadState(Enum):
PARSED_OK = 5 PARSED_OK = 5
WAS_LEGACY = 6 WAS_LEGACY = 6
# END Class XMLReadState
class ProjectXMLReader: class ProjectXMLReader:
"""Core: Project XML Reader """Core: Project XML Reader
@@ -458,8 +456,6 @@ class ProjectXMLReader:
""" """
return {xNode.tag: checkString(xNode.text, "") for xNode in xItem} return {xNode.tag: checkString(xNode.text, "") for xNode in xItem}
# END Class ProjectXMLReader
class ProjectXMLWriter: class ProjectXMLWriter:
"""Core: Project XML Writer """Core: Project XML Writer
@@ -579,5 +575,3 @@ class ProjectXMLWriter:
xEntry = ET.SubElement(xItem, "entry", attrib={"key": key}) xEntry = ET.SubElement(xItem, "entry", attrib={"key": key})
xEntry.text = str(value) or "" xEntry.text = str(value) or ""
return return
# END Class ProjectXMLWriter
+3 -5
View File
@@ -26,14 +26,14 @@ from __future__ import annotations
import json import json
import logging import logging
from collections.abc import Iterable
from pathlib import Path
from time import time from time import time
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from pathlib import Path
from collections.abc import Iterable
from novelwriter.error import logException
from novelwriter.common import formatTimeStamp from novelwriter.common import formatTimeStamp
from novelwriter.constants import nwFiles from novelwriter.constants import nwFiles
from novelwriter.error import logException
if TYPE_CHECKING: # pragma: no cover if TYPE_CHECKING: # pragma: no cover
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
@@ -135,5 +135,3 @@ class NWSessionLog:
"novel": novel, "notes": notes, "idle": idle, "novel": novel, "notes": notes, "idle": idle,
}) })
return f"{data}\n" return f"{data}\n"
# END Class NWSessionLog
+4 -9
View File
@@ -27,14 +27,14 @@ from __future__ import annotations
import json import json
import logging import logging
from typing import TYPE_CHECKING
from pathlib import Path
from collections.abc import Iterator from collections.abc import Iterator
from pathlib import Path
from typing import TYPE_CHECKING
from PyQt5.QtCore import QLocale from PyQt5.QtCore import QLocale
from novelwriter.error import logException
from novelwriter.constants import nwFiles from novelwriter.constants import nwFiles
from novelwriter.error import logException
if TYPE_CHECKING: # pragma: no cover if TYPE_CHECKING: # pragma: no cover
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
@@ -164,11 +164,10 @@ class NWSpellEnchant:
name = "" name = ""
return tag, name return tag, name
# END Class NWSpellEnchant
class FakeEnchant: class FakeEnchant:
"""Fallback for when Enchant is selected, but not installed.""" """Fallback for when Enchant is selected, but not installed."""
def __init__(self) -> None: def __init__(self) -> None:
class FakeProvider: class FakeProvider:
@@ -188,8 +187,6 @@ class FakeEnchant:
def add_to_session(self, word: str) -> None: def add_to_session(self, word: str) -> None:
return return
# END Class FakeEnchant
class UserDictionary: class UserDictionary:
@@ -240,5 +237,3 @@ class UserDictionary:
logger.error("Failed to save user dictionary") logger.error("Failed to save user dictionary")
logException() logException()
return return
# END Class UserDictionary
+1 -7
View File
@@ -32,7 +32,7 @@ from collections.abc import Iterable
from typing import TYPE_CHECKING, Literal from typing import TYPE_CHECKING, Literal
from PyQt5.QtCore import QPointF, Qt from PyQt5.QtCore import QPointF, Qt
from PyQt5.QtGui import QIcon, QPainter, QPainterPath, QPixmap, QColor, QPolygonF from PyQt5.QtGui import QColor, QIcon, QPainter, QPainterPath, QPixmap, QPolygonF
from novelwriter import SHARED from novelwriter import SHARED
from novelwriter.common import simplified from novelwriter.common import simplified
@@ -62,8 +62,6 @@ class StatusEntry:
cls.icon = QIcon(source.icon) cls.icon = QIcon(source.icon)
return cls return cls
# END Class StatusEntry
NO_ENTRY = StatusEntry("", QColor(0, 0, 0), nwStatusShape.SQUARE, QIcon(), 0) NO_ENTRY = StatusEntry("", QColor(0, 0, 0), nwStatusShape.SQUARE, QIcon(), 0)
@@ -221,8 +219,6 @@ class NWStatus:
"""Check key is valid, and if not, generate one.""" """Check key is valid, and if not, generate one."""
return key if self._isKey(key) else self._newKey() return key if self._isKey(key) else self._newKey()
# END Class NWStatus
class _ShapeCache: class _ShapeCache:
@@ -329,8 +325,6 @@ class _ShapeCache:
return path return path
# END Class _ShapeCache
# Create Singleton # Create Singleton
_SHAPES = _ShapeCache() _SHAPES = _ShapeCache()
-8
View File
@@ -54,8 +54,6 @@ class NWStorageOpen(Enum):
FAILED = 3 FAILED = 3
READY = 4 READY = 4
# END Enum NWStorageOpen
class NWStorageCreate(Enum): class NWStorageCreate(Enum):
@@ -63,8 +61,6 @@ class NWStorageCreate(Enum):
OS_ERROR = 1 OS_ERROR = 1
READY = 2 READY = 2
# END Enum NWStorageCreate
class NWStorage: class NWStorage:
"""Core: Project Storage Class """Core: Project Storage Class
@@ -391,8 +387,6 @@ class NWStorage:
self._lockedBy = None self._lockedBy = None
return True return True
# END Class NWStorage
class _LegacyStorage: class _LegacyStorage:
"""Core: Legacy Storage Converter Utils """Core: Legacy Storage Converter Utils
@@ -590,5 +584,3 @@ class _LegacyStorage:
logException() logException()
return return
# END Class _LegacyStorage
-2
View File
@@ -536,5 +536,3 @@ class ToHtml(Tokenizer):
) )
return bits[0][1:], result return bits[0][1:], result
# END Class ToHtml
-4
View File
@@ -1045,8 +1045,6 @@ class Tokenizer(ABC):
return result, formats return result, formats
# END Class Tokenizer
class HeadingFormatter: class HeadingFormatter:
@@ -1116,5 +1114,3 @@ class HeadingFormatter:
hFormat = hFormat.replace(nwHeadFmt.CHAR_FOCUS, fText) hFormat = hFormat.replace(nwHeadFmt.CHAR_FOCUS, fText)
return hFormat return hFormat
# END Class HeadingFormatter
-2
View File
@@ -272,5 +272,3 @@ class ToMarkdown(Tokenizer):
result += " \n" if style & self.A_Z_BTMMRG else "\n\n" result += " \n" if style & self.A_Z_BTMMRG else "\n\n"
return result return result
# END Class ToMarkdown
+4 -14
View File
@@ -1079,12 +1079,9 @@ class ToOdt(Tokenizer):
return return
# END Class ToOdt
# Auto-Style Classes
# =============================================================================================== # # ==================
# Auto-Style Classes
# =============================================================================================== #
class ODTParagraphStyle: class ODTParagraphStyle:
"""Wrapper class for the paragraph style setting used by the """Wrapper class for the paragraph style setting used by the
@@ -1332,8 +1329,6 @@ class ODTParagraphStyle:
return return
# END Class ODTParagraphStyle
class ODTTextStyle: class ODTTextStyle:
"""Wrapper class for the text style setting used by the exporter. """Wrapper class for the text style setting used by the exporter.
@@ -1457,12 +1452,9 @@ class ODTTextStyle:
ET.SubElement(xEntry, _mkTag("style", "text-properties"), attrib=attr) ET.SubElement(xEntry, _mkTag("style", "text-properties"), attrib=attr)
return return
# END Class ODTTextStyle
# XML Complex Element Helper Class
# =============================================================================================== # # ================================
# XML Complex Element Helper Class
# =============================================================================================== #
X_ROOT_TEXT = 0 X_ROOT_TEXT = 0
X_ROOT_TAIL = 1 X_ROOT_TAIL = 1
@@ -1661,5 +1653,3 @@ class XMLParagraph:
self._chrPos += nSpaces - 1 self._chrPos += nSpaces - 1
return return
# END Class XMLParagraph
+5 -7
View File
@@ -23,18 +23,18 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from __future__ import annotations from __future__ import annotations
import random
import logging import logging
import random
from typing import TYPE_CHECKING, Literal, overload
from pathlib import Path
from collections.abc import Iterable, Iterator from collections.abc import Iterable, Iterator
from pathlib import Path
from typing import TYPE_CHECKING, Literal, overload
from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType
from novelwriter.error import logException
from novelwriter.common import isHandle from novelwriter.common import isHandle
from novelwriter.constants import nwFiles from novelwriter.constants import nwFiles
from novelwriter.core.item import NWItem from novelwriter.core.item import NWItem
from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType
from novelwriter.error import logException
if TYPE_CHECKING: # pragma: no cover if TYPE_CHECKING: # pragma: no cover
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
@@ -520,5 +520,3 @@ class NWTree:
handle = self._makeHandle() handle = self._makeHandle()
return handle return handle
# END Class NWTree
-2
View File
@@ -152,5 +152,3 @@ class GuiAbout(NNonBlockingDialog):
f"QTextBrowser {{border: none; background: {baseCol};}} " f"QTextBrowser {{border: none; background: {baseCol};}} "
) )
return return
# END Class GuiAbout
+1 -3
View File
@@ -34,8 +34,8 @@ from PyQt5.QtWidgets import (
) )
from novelwriter import CONFIG, SHARED from novelwriter import CONFIG, SHARED
from novelwriter.extensions.switch import NSwitch
from novelwriter.extensions.configlayout import NColourLabel from novelwriter.extensions.configlayout import NColourLabel
from novelwriter.extensions.switch import NSwitch
from novelwriter.types import QtDialogCancel, QtDialogOk, QtDialogReset, QtUserRole from novelwriter.types import QtDialogCancel, QtDialogOk, QtDialogReset, QtUserRole
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -182,5 +182,3 @@ class GuiDocMerge(QDialog):
self.listBox.addItem(newItem) self.listBox.addItem(newItem)
return return
# END Class GuiDocMerge
+1 -3
View File
@@ -34,8 +34,8 @@ from PyQt5.QtWidgets import (
) )
from novelwriter import CONFIG, SHARED from novelwriter import CONFIG, SHARED
from novelwriter.extensions.switch import NSwitch
from novelwriter.extensions.configlayout import NColourLabel from novelwriter.extensions.configlayout import NColourLabel
from novelwriter.extensions.switch import NSwitch
from novelwriter.types import QtDialogCancel, QtDialogOk, QtUserRole from novelwriter.types import QtDialogCancel, QtDialogOk, QtUserRole
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -257,5 +257,3 @@ class GuiDocSplit(QDialog):
self.listBox.addItem(newItem) self.listBox.addItem(newItem)
return return
# END Class GuiDocSplit
-2
View File
@@ -94,5 +94,3 @@ class GuiEditLabel(QDialog):
accepted = cls.result() == QDialog.DialogCode.Accepted accepted = cls.result() == QDialog.DialogCode.Accepted
cls.deleteLater() cls.deleteLater()
return label, accepted return label, accepted
# END Class GuiEditLabel
-2
View File
@@ -962,5 +962,3 @@ class GuiPreferences(QDialog):
self.newPreferencesReady.emit(needsRestart, refreshTree, updateTheme, updateSyntax) self.newPreferencesReady.emit(needsRestart, refreshTree, updateTheme, updateSyntax)
return return
# END Class GuiPreferences
+2 -10
View File
@@ -29,8 +29,8 @@ import logging
from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot
from PyQt5.QtGui import QCloseEvent, QColor from PyQt5.QtGui import QCloseEvent, QColor
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QAbstractItemView, QApplication, QColorDialog, QDialog, QDialogButtonBox, QHBoxLayout, QAbstractItemView, QApplication, QColorDialog, QDialog, QDialogButtonBox,
QLineEdit, QMenu, QStackedWidget, QToolButton, QTreeWidget, QHBoxLayout, QLineEdit, QMenu, QStackedWidget, QToolButton, QTreeWidget,
QTreeWidgetItem, QVBoxLayout, QWidget QTreeWidgetItem, QVBoxLayout, QWidget
) )
@@ -227,8 +227,6 @@ class GuiProjectSettings(QDialog):
return return
# END Class GuiProjectSettings
class _SettingsPage(NScrollableForm): class _SettingsPage(NScrollableForm):
@@ -302,8 +300,6 @@ class _SettingsPage(NScrollableForm):
return return
# END Class _SettingsPage
class _StatusPage(NFixedPage): class _StatusPage(NFixedPage):
@@ -622,8 +618,6 @@ class _StatusPage(NFixedPage):
self.shapeButton.setIcon(self._icons[self._shape]) self.shapeButton.setIcon(self._icons[self._shape])
return return
# END Class _StatusPage
class _ReplacePage(NFixedPage): class _ReplacePage(NFixedPage):
@@ -797,5 +791,3 @@ class _ReplacePage(NFixedPage):
def _stripNotAllowed(self, key: str) -> str: def _stripNotAllowed(self, key: str) -> str:
"""Clean up the replace key string.""" """Clean up the replace key string."""
return "".join(c for c in key if c.isalnum()) return "".join(c for c in key if c.isalnum())
# END Class _ReplacePage
+2 -4
View File
@@ -25,15 +25,15 @@ from __future__ import annotations
import logging import logging
from PyQt5.QtGui import QFontMetrics
from PyQt5.QtCore import QSize, pyqtSlot from PyQt5.QtCore import QSize, pyqtSlot
from PyQt5.QtGui import QFontMetrics
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QDialog, QDialogButtonBox, QFrame, QHBoxLayout, QLabel, QListWidget, QDialog, QDialogButtonBox, QFrame, QHBoxLayout, QLabel, QListWidget,
QListWidgetItem, QVBoxLayout, QWidget QListWidgetItem, QVBoxLayout, QWidget
) )
from novelwriter import CONFIG from novelwriter import CONFIG
from novelwriter.constants import trConst, nwQuotes from novelwriter.constants import nwQuotes, trConst
from novelwriter.types import QtAlignCenter, QtAlignTop, QtDialogCancel, QtDialogOk, QtUserRole from novelwriter.types import QtAlignCenter, QtAlignTop, QtDialogCancel, QtDialogOk, QtUserRole
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -141,5 +141,3 @@ class GuiQuoteSelect(QDialog):
self.previewLabel.setText(quote) self.previewLabel.setText(quote)
self._selected = quote self._selected = quote
return return
# END Class GuiQuoteSelect
-2
View File
@@ -253,5 +253,3 @@ class GuiWordList(QDialog):
if (item := self.listBox.item(i)) and (word := item.text().strip()): if (item := self.listBox.item(i)) and (word := item.text().strip()):
result.append(word) result.append(word)
return result return result
# END Class GuiWordList
-26
View File
@@ -32,8 +32,6 @@ class nwItemType(Enum):
FOLDER = 2 FOLDER = 2
FILE = 3 FILE = 3
# END Enum nwItemType
class nwItemClass(Enum): class nwItemClass(Enum):
@@ -50,8 +48,6 @@ class nwItemClass(Enum):
TEMPLATE = 10 TEMPLATE = 10
TRASH = 11 TRASH = 11
# END Enum nwItemClass
class nwItemLayout(Enum): class nwItemLayout(Enum):
@@ -59,8 +55,6 @@ class nwItemLayout(Enum):
DOCUMENT = 1 DOCUMENT = 1
NOTE = 2 NOTE = 2
# END Enum nwItemLayout
class nwComment(Enum): class nwComment(Enum):
@@ -73,8 +67,6 @@ class nwComment(Enum):
COMMENT = 6 COMMENT = 6
STORY = 7 STORY = 7
# END Enum nwComment
class nwTrinary(Enum): class nwTrinary(Enum):
@@ -82,16 +74,12 @@ class nwTrinary(Enum):
NEUTRAL = 0 NEUTRAL = 0
POSITIVE = 1 POSITIVE = 1
# END Enum nwTrinary
class nwDocMode(Enum): class nwDocMode(Enum):
VIEW = 0 VIEW = 0
EDIT = 1 EDIT = 1
# END Enum nwDocMode
class nwDocAction(Enum): class nwDocAction(Enum):
@@ -134,8 +122,6 @@ class nwDocAction(Enum):
SC_SUP = 36 SC_SUP = 36
SC_SUB = 37 SC_SUB = 37
# END Enum nwDocAction
class nwDocInsert(Enum): class nwDocInsert(Enum):
@@ -152,8 +138,6 @@ class nwDocInsert(Enum):
LIPSUM = 10 LIPSUM = 10
FOOTNOTE = 11 FOOTNOTE = 11
# END Enum nwDocInsert
class nwView(Enum): class nwView(Enum):
@@ -163,8 +147,6 @@ class nwView(Enum):
OUTLINE = 3 OUTLINE = 3
SEARCH = 4 SEARCH = 4
# END Enum nwView
class nwWidget(Enum): class nwWidget(Enum):
@@ -173,8 +155,6 @@ class nwWidget(Enum):
VIEWER = 3 VIEWER = 3
OUTLINE = 4 OUTLINE = 4
# END Enum nwWidget
class nwOutline(Enum): class nwOutline(Enum):
@@ -196,8 +176,6 @@ class nwOutline(Enum):
CUSTOM = 15 CUSTOM = 15
SYNOP = 16 SYNOP = 16
# END Enum nwOutline
class nwBuildFmt(Enum): class nwBuildFmt(Enum):
@@ -210,8 +188,6 @@ class nwBuildFmt(Enum):
J_HTML = 6 J_HTML = 6
J_NWD = 7 J_NWD = 7
# END Enum nwBuildFormat
class nwStatusShape(Enum): class nwStatusShape(Enum):
@@ -235,5 +211,3 @@ class nwStatusShape(Enum):
BLOCK_2 = 17 BLOCK_2 = 17
BLOCK_3 = 18 BLOCK_3 = 18
BLOCK_4 = 19 BLOCK_4 = 19
# END Enum nwStatusShape
+8 -15
View File
@@ -23,17 +23,17 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from __future__ import annotations from __future__ import annotations
import sys
import random
import logging import logging
import random
import sys
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from PyQt5.QtCore import Qt, pyqtSlot from PyQt5.QtCore import Qt, pyqtSlot
from PyQt5.QtGui import QFont, QFontDatabase from PyQt5.QtGui import QFont, QFontDatabase
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QApplication, QWidget, QDialog, QGridLayout, QStyle, QPlainTextEdit, QApplication, QDialog, QDialogButtonBox, QGridLayout, QLabel,
QLabel, QDialogButtonBox QPlainTextEdit, QStyle, QWidget
) )
if TYPE_CHECKING: # pragma: no cover if TYPE_CHECKING: # pragma: no cover
@@ -42,10 +42,6 @@ if TYPE_CHECKING: # pragma: no cover
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# =============================================================================================== #
# Utility Functions
# =============================================================================================== #
def logException() -> None: def logException() -> None:
"""Log the content of an exception message.""" """Log the content of an exception message."""
exType, exValue, _ = sys.exc_info() exType, exValue, _ = sys.exc_info()
@@ -61,10 +57,6 @@ def formatException(exc: BaseException) -> str:
return f"{type(exc).__name__}: {str(exc)}" return f"{type(exc).__name__}: {str(exc)}"
# =============================================================================================== #
# Error Handler
# =============================================================================================== #
class NWErrorMessage(QDialog): class NWErrorMessage(QDialog):
def __init__(self, parent: QWidget) -> None: def __init__(self, parent: QWidget) -> None:
@@ -125,9 +117,11 @@ class NWErrorMessage(QDialog):
error traceback. error traceback.
""" """
from traceback import format_tb from traceback import format_tb
from PyQt5.QtCore import PYQT_VERSION_STR, QT_VERSION_STR, QSysInfo
from novelwriter import __version__ from novelwriter import __version__
from novelwriter.constants import nwConst from novelwriter.constants import nwConst
from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR, QSysInfo
self.msgHead.setText( self.msgHead.setText(
"<p>An unhandled error has been encountered.</p>" "<p>An unhandled error has been encountered.</p>"
@@ -175,12 +169,11 @@ class NWErrorMessage(QDialog):
self.close() self.close()
return return
# END Class NWErrorMessage
def exceptionHandler(exType: type, exValue: BaseException, exTrace: TracebackType) -> None: def exceptionHandler(exType: type, exValue: BaseException, exTrace: TracebackType) -> None:
"""Function to catch unhandled global exceptions.""" """Function to catch unhandled global exceptions."""
from traceback import print_tb from traceback import print_tb
from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QApplication
logger.critical("%s: %s", exType.__name__, str(exValue)) logger.critical("%s: %s", exType.__name__, str(exValue))
+2 -4
View File
@@ -26,11 +26,11 @@ from __future__ import annotations
from math import ceil from math import ceil
from PyQt5.QtCore import QRect from PyQt5.QtCore import QRect
from PyQt5.QtGui import QBrush, QColor, QPaintEvent, QPainter, QPen from PyQt5.QtGui import QBrush, QColor, QPainter, QPaintEvent, QPen
from PyQt5.QtWidgets import QProgressBar, QWidget from PyQt5.QtWidgets import QProgressBar, QWidget
from novelwriter.types import ( from novelwriter.types import (
QtPaintAnitAlias, QtAlignCenter, QtRoundCap, QtSizeFixed, QtSolidLine, QtAlignCenter, QtPaintAnitAlias, QtRoundCap, QtSizeFixed, QtSolidLine,
QtTransparent QtTransparent
) )
@@ -101,5 +101,3 @@ class NProgressCircle(QProgressBar):
painter.setPen(self._tColor) painter.setPen(self._tColor)
painter.drawText(self._cRect, QtAlignCenter, self._text or f"{progress:.1f} %") painter.drawText(self._cRect, QtAlignCenter, self._text or f"{progress:.1f} %")
return return
# END Class NProgressCircle
+1 -11
View File
@@ -27,8 +27,8 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from __future__ import annotations from __future__ import annotations
from PyQt5.QtGui import QColor, QFont, QPalette
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt
from PyQt5.QtGui import QColor, QFont, QPalette
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QAbstractButton, QFrame, QHBoxLayout, QLabel, QLayout, QScrollArea, QAbstractButton, QFrame, QHBoxLayout, QLabel, QLayout, QScrollArea,
QVBoxLayout, QWidget QVBoxLayout, QWidget
@@ -64,8 +64,6 @@ class NFixedPage(QFrame):
self.setLayout(layout) self.setLayout(layout)
return return
# END Class NFixedPage
class NScrollablePage(QScrollArea): class NScrollablePage(QScrollArea):
"""Extension: Scrollable Page Widget """Extension: Scrollable Page Widget
@@ -89,8 +87,6 @@ class NScrollablePage(QScrollArea):
self._widget.setLayout(layout) self._widget.setLayout(layout)
return return
# END Class NScrollablePage
class NScrollableForm(QScrollArea): class NScrollableForm(QScrollArea):
"""Extension: Scrollable Form Widget """Extension: Scrollable Form Widget
@@ -235,8 +231,6 @@ class NScrollableForm(QScrollArea):
self._layout.addStretch(1) self._layout.addStretch(1)
return return
# END Class NScrollableForm
class NColourLabel(QLabel): class NColourLabel(QLabel):
"""Extension: A Coloured Label """Extension: A Coloured Label
@@ -267,8 +261,6 @@ class NColourLabel(QLabel):
return return
# END Class NColourLabel
class NWrappedWidgetBox(QHBoxLayout): class NWrappedWidgetBox(QHBoxLayout):
"""Extension: A Text-Wrapped Widget Box """Extension: A Text-Wrapped Widget Box
@@ -287,5 +279,3 @@ class NWrappedWidgetBox(QHBoxLayout):
if after: if after:
self.addWidget(QLabel(after.lstrip())) self.addWidget(QLabel(after.lstrip()))
return return
# END Class NWrappedWidgetBox
+1 -5
View File
@@ -24,8 +24,8 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from __future__ import annotations from __future__ import annotations
from PyQt5.QtGui import QStatusTipEvent, QWheelEvent
from PyQt5.QtCore import QEvent, QObject from PyQt5.QtCore import QEvent, QObject
from PyQt5.QtGui import QStatusTipEvent, QWheelEvent
from PyQt5.QtWidgets import QWidget from PyQt5.QtWidgets import QWidget
@@ -63,13 +63,9 @@ class WheelEventFilter(QObject):
self._locked = False self._locked = False
return False return False
# END Class WheelEventFilter
class StatusTipFilter(QObject): class StatusTipFilter(QObject):
def eventFilter(self, obj: QObject, event: QEvent) -> bool: def eventFilter(self, obj: QObject, event: QEvent) -> bool:
"""Filter out status tip events on menus.""" """Filter out status tip events on menus."""
return True if isinstance(event, QStatusTipEvent) else super().eventFilter(obj, event) return True if isinstance(event, QStatusTipEvent) else super().eventFilter(obj, event)
# END Class StatusTipFilter
-14
View File
@@ -61,8 +61,6 @@ class NToolDialog(QDialog):
QApplication.processEvents() QApplication.processEvents()
return return
# END Class NToolDialog
class NNonBlockingDialog(QDialog): class NNonBlockingDialog(QDialog):
@@ -80,8 +78,6 @@ class NNonBlockingDialog(QDialog):
QApplication.processEvents() QApplication.processEvents()
return return
# END Class NNonBlockingDialog
class NComboBox(QComboBox): class NComboBox(QComboBox):
@@ -103,8 +99,6 @@ class NComboBox(QComboBox):
self.setCurrentIndex(self.findData(default) if idx < 0 else idx) self.setCurrentIndex(self.findData(default) if idx < 0 else idx)
return return
# END Class NComboBox
class NSpinBox(QSpinBox): class NSpinBox(QSpinBox):
@@ -120,8 +114,6 @@ class NSpinBox(QSpinBox):
event.ignore() event.ignore()
return return
# END Class NSpinBox
class NDoubleSpinBox(QDoubleSpinBox): class NDoubleSpinBox(QDoubleSpinBox):
@@ -137,8 +129,6 @@ class NDoubleSpinBox(QDoubleSpinBox):
event.ignore() event.ignore()
return return
# END Class NDoubleSpinBox
class NIconToolButton(QToolButton): class NIconToolButton(QToolButton):
@@ -156,8 +146,6 @@ class NIconToolButton(QToolButton):
self.setIcon(SHARED.theme.getIcon(iconKey)) self.setIcon(SHARED.theme.getIcon(iconKey))
return return
# END Class NIconToolButton
class NIconToggleButton(QToolButton): class NIconToggleButton(QToolButton):
@@ -177,5 +165,3 @@ class NIconToggleButton(QToolButton):
iconSize = self.iconSize() iconSize = self.iconSize()
self.setIcon(SHARED.theme.getToggleIcon(iconKey, (iconSize.width(), iconSize.height()))) self.setIcon(SHARED.theme.getToggleIcon(iconKey, (iconSize.width(), iconSize.height())))
return return
# END Class NUnfoldButton
+1 -3
View File
@@ -29,8 +29,8 @@ from PyQt5.QtCore import pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QComboBox, QWidget from PyQt5.QtWidgets import QComboBox, QWidget
from novelwriter import SHARED from novelwriter import SHARED
from novelwriter.enum import nwItemClass
from novelwriter.constants import nwLabels from novelwriter.constants import nwLabels
from novelwriter.enum import nwItemClass
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -126,5 +126,3 @@ class NovelSelector(QComboBox):
if not self._blockSignal: if not self._blockSignal:
self.novelSelectionChanged.emit(self.currentData()) self.novelSelectionChanged.emit(self.currentData())
return return
# END Class NovelSelector
+2 -8
View File
@@ -25,15 +25,15 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from __future__ import annotations from __future__ import annotations
from PyQt5.QtGui import QColor, QPaintEvent, QPainter, QPolygon
from PyQt5.QtCore import QPoint, QRectF, QSize, Qt, pyqtSignal, pyqtSlot from PyQt5.QtCore import QPoint, QRectF, QSize, Qt, pyqtSignal, pyqtSlot
from PyQt5.QtGui import QColor, QPainter, QPaintEvent, QPolygon
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QAbstractButton, QAction, QButtonGroup, QLabel, QStyle, QAbstractButton, QAction, QButtonGroup, QLabel, QStyle,
QStyleOptionToolButton, QToolBar, QToolButton, QWidget QStyleOptionToolButton, QToolBar, QToolButton, QWidget
) )
from novelwriter.types import ( from novelwriter.types import (
QtPaintAnitAlias, QtAlignLeft, QtMouseOver, QtNoBrush, QtNoPen, QtAlignLeft, QtMouseOver, QtNoBrush, QtNoPen, QtPaintAnitAlias,
QtSizeExpanding, QtSizeFixed QtSizeExpanding, QtSizeFixed
) )
@@ -112,8 +112,6 @@ class NPagedSideBar(QToolBar):
self.buttonClicked.emit(buttonId) self.buttonClicked.emit(buttonId)
return return
# END Class NPagedSideBar
class _NPagedToolButton(QToolButton): class _NPagedToolButton(QToolButton):
@@ -190,8 +188,6 @@ class _NPagedToolButton(QToolButton):
return return
# END Class _NPagedToolButton
class _NPagedToolLabel(QLabel): class _NPagedToolLabel(QLabel):
@@ -231,5 +227,3 @@ class _NPagedToolLabel(QLabel):
paint.drawText(QRectF(self._lM, self._tM, tW, tH), QtAlignLeft, self.text()) paint.drawText(QRectF(self._lM, self._tM, tW, tH), QtAlignLeft, self.text())
return return
# END Class _NPagedToolLabel
+1 -3
View File
@@ -25,7 +25,7 @@ from __future__ import annotations
from math import ceil from math import ceil
from PyQt5.QtGui import QPaintEvent, QPainter from PyQt5.QtGui import QPainter, QPaintEvent
from PyQt5.QtWidgets import QProgressBar, QWidget from PyQt5.QtWidgets import QProgressBar, QWidget
from novelwriter.types import QtPaintAnitAlias from novelwriter.types import QtPaintAnitAlias
@@ -51,5 +51,3 @@ class NProgressSimple(QProgressBar):
painter.setBrush(self.palette().highlight()) painter.setBrush(self.palette().highlight())
painter.drawRect(0, 0, progress, self.height()) painter.drawRect(0, 0, progress, self.height())
return return
# END Class NProgressSimple
+1 -3
View File
@@ -27,7 +27,7 @@ import logging
from typing import Literal from typing import Literal
from PyQt5.QtGui import QColor, QPaintEvent, QPainter from PyQt5.QtGui import QColor, QPainter, QPaintEvent
from PyQt5.QtWidgets import QAbstractButton, QWidget from PyQt5.QtWidgets import QAbstractButton, QWidget
from novelwriter.types import QtPaintAnitAlias from novelwriter.types import QtPaintAnitAlias
@@ -75,5 +75,3 @@ class StatusLED(QAbstractButton):
painter.setOpacity(1.0) painter.setOpacity(1.0)
painter.drawEllipse(1, 1, self.width() - 2, self.height() - 2) painter.drawEllipse(1, 1, self.width() - 2, self.height() - 2)
return return
# END Class StatusLED
+2 -4
View File
@@ -23,12 +23,12 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from __future__ import annotations from __future__ import annotations
from PyQt5.QtGui import QMouseEvent, QPainter, QPaintEvent, QResizeEvent
from PyQt5.QtCore import QEvent, QPropertyAnimation, Qt, pyqtProperty from PyQt5.QtCore import QEvent, QPropertyAnimation, Qt, pyqtProperty
from PyQt5.QtGui import QMouseEvent, QPainter, QPaintEvent, QResizeEvent
from PyQt5.QtWidgets import QAbstractButton, QWidget from PyQt5.QtWidgets import QAbstractButton, QWidget
from novelwriter import CONFIG, SHARED from novelwriter import CONFIG, SHARED
from novelwriter.types import QtPaintAnitAlias, QtMouseLeft, QtNoPen, QtSizeFixed from novelwriter.types import QtMouseLeft, QtNoPen, QtPaintAnitAlias, QtSizeFixed
class NSwitch(QAbstractButton): class NSwitch(QAbstractButton):
@@ -133,5 +133,3 @@ class NSwitch(QAbstractButton):
self.setCursor(Qt.CursorShape.PointingHandCursor) self.setCursor(Qt.CursorShape.PointingHandCursor)
super().enterEvent(event) super().enterEvent(event)
return return
# END Class NSwitch
+1 -3
View File
@@ -23,8 +23,8 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from __future__ import annotations from __future__ import annotations
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSignal from PyQt5.QtCore import pyqtSignal
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QGridLayout, QLabel, QScrollArea, QWidget from PyQt5.QtWidgets import QGridLayout, QLabel, QScrollArea, QWidget
from novelwriter.extensions.switch import NSwitch from novelwriter.extensions.switch import NSwitch
@@ -127,5 +127,3 @@ class NSwitchBox(QScrollArea):
self._content.setRowStretch(self._index + 1, 1) self._content.setRowStretch(self._index + 1, 1)
self._index += 1 self._index += 1
return return
# END Class NSwitchBox
+3 -9
View File
@@ -26,16 +26,16 @@ from __future__ import annotations
import json import json
import logging import logging
from time import sleep
from datetime import datetime from datetime import datetime
from time import sleep
from urllib.error import HTTPError from urllib.error import HTTPError
from urllib.request import Request, urlopen from urllib.request import Request, urlopen
from PyQt5.QtGui import QDesktopServices
from PyQt5.QtCore import QObject, QRunnable, QUrl, pyqtSignal, pyqtSlot from PyQt5.QtCore import QObject, QRunnable, QUrl, pyqtSignal, pyqtSlot
from PyQt5.QtGui import QDesktopServices
from PyQt5.QtWidgets import QLabel, QVBoxLayout, QWidget from PyQt5.QtWidgets import QLabel, QVBoxLayout, QWidget
from novelwriter import CONFIG, SHARED, __version__, __date__, __domain__ from novelwriter import CONFIG, SHARED, __date__, __domain__, __version__
from novelwriter.common import formatVersion from novelwriter.common import formatVersion
from novelwriter.constants import nwConst from novelwriter.constants import nwConst
@@ -111,8 +111,6 @@ class VersionInfoWidget(QWidget):
self._lblRelease.setText(self._trLatest.format(reason or self.tr("Failed"))) self._lblRelease.setText(self._trLatest.format(reason or self.tr("Failed")))
return return
# END Class VersionInfoWidget
class _Retriever(QRunnable): class _Retriever(QRunnable):
@@ -144,10 +142,6 @@ class _Retriever(QRunnable):
self.signals.dataReady.emit("", str(e)) self.signals.dataReady.emit("", str(e))
return return
# END Class _Retriever
class _RetrieverSignal(QObject): class _RetrieverSignal(QObject):
dataReady = pyqtSignal(str, str) dataReady = pyqtSignal(str, str)
# END Class _RetrieverSignal
+25 -43
View File
@@ -78,8 +78,6 @@ class _SelectAction(Enum):
KEEP_POSITION = 2 KEEP_POSITION = 2
MOVE_AFTER = 3 MOVE_AFTER = 3
# END Class _SelectAction
class GuiDocEditor(QPlainTextEdit): class GuiDocEditor(QPlainTextEdit):
"""Gui Widget: Main Document Editor""" """Gui Widget: Main Document Editor"""
@@ -2131,8 +2129,6 @@ class GuiDocEditor(QPlainTextEdit):
self._doReplace = False self._doReplace = False
return return
# END Class GuiDocEditor
class MetaCompleter(QMenu): class MetaCompleter(QMenu):
"""GuiWidget: Meta Completer Menu """GuiWidget: Meta Completer Menu
@@ -2210,15 +2206,13 @@ class MetaCompleter(QMenu):
self.complete.emit(pos, length, value) self.complete.emit(pos, length, value)
return return
# END Class MetaCompleter
# =============================================================================================== #
# The Off-GUI Thread Word Counter
# A runnable for the word counter to be run in the thread pool off the main GUI thread.
# =============================================================================================== #
class BackgroundWordCounter(QRunnable): class BackgroundWordCounter(QRunnable):
"""The Off-GUI Thread Word Counter
A runnable for the word counter to be run in the thread pool off the
main GUI thread.
"""
def __init__(self, docEditor: GuiDocEditor, forSelection: bool = False) -> None: def __init__(self, docEditor: GuiDocEditor, forSelection: bool = False) -> None:
super().__init__() super().__init__()
@@ -2251,8 +2245,6 @@ class BackgroundWordCounter(QRunnable):
return return
# END Class BackgroundWordCounter
class BackgroundWordCounterSignals(QObject): class BackgroundWordCounterSignals(QObject):
"""The QRunnable cannot emit a signal, so we need a simple QObject """The QRunnable cannot emit a signal, so we need a simple QObject
@@ -2260,15 +2252,13 @@ class BackgroundWordCounterSignals(QObject):
""" """
countsReady = pyqtSignal(int, int, int) countsReady = pyqtSignal(int, int, int)
# END Class BackgroundWordCounterSignals
# =============================================================================================== #
# The Formatting and Options Fold Out Menu
# Only used by DocEditor, and is opened by the first button in the header
# =============================================================================================== #
class GuiDocToolBar(QWidget): class GuiDocToolBar(QWidget):
"""The Formatting and Options Fold Out Menu
Only used by DocEditor, and is opened by the first button in the
header.
"""
requestDocAction = pyqtSignal(nwDocAction) requestDocAction = pyqtSignal(nwDocAction)
@@ -2393,15 +2383,13 @@ class GuiDocToolBar(QWidget):
return return
# END Class GuiDocToolBar
# =============================================================================================== #
# The Embedded Document Search/Replace Feature
# Only used by DocEditor, and is at a fixed position in the QTextEdit's viewport
# =============================================================================================== #
class GuiDocEditSearch(QFrame): class GuiDocEditSearch(QFrame):
"""The Embedded Document Search/Replace Feature
Only used by DocEditor, and is at a fixed position in the
QTextEdit's viewport.
"""
def __init__(self, docEditor: GuiDocEditor) -> None: def __init__(self, docEditor: GuiDocEditor) -> None:
super().__init__(parent=docEditor) super().__init__(parent=docEditor)
@@ -2757,15 +2745,13 @@ class GuiDocEditSearch(QFrame):
self.searchBox.setPalette(qPalette) self.searchBox.setPalette(qPalette)
return return
# END Class GuiDocEditSearch
# =============================================================================================== #
# The Embedded Document Header
# Only used by DocEditor, and is at a fixed position in the QTextEdit's viewport
# =============================================================================================== #
class GuiDocEditHeader(QWidget): class GuiDocEditHeader(QWidget):
"""The Embedded Document Header
Only used by DocEditor, and is at a fixed position in the
QTextEdit's viewport.
"""
closeDocumentRequest = pyqtSignal() closeDocumentRequest = pyqtSignal()
toggleToolBarRequest = pyqtSignal() toggleToolBarRequest = pyqtSignal()
@@ -2980,15 +2966,13 @@ class GuiDocEditHeader(QWidget):
self.docEditor.requestProjectItemSelected.emit(self._docHandle or "", True) self.docEditor.requestProjectItemSelected.emit(self._docHandle or "", True)
return return
# END Class GuiDocEditHeader
# =============================================================================================== #
# The Embedded Document Footer
# Only used by DocEditor, and is at a fixed position in the QTextEdit's viewport
# =============================================================================================== #
class GuiDocEditFooter(QWidget): class GuiDocEditFooter(QWidget):
"""The Embedded Document Footer
Only used by DocEditor, and is at a fixed position in the
QTextEdit's viewport.
"""
def __init__(self, parent: QWidget) -> None: def __init__(self, parent: QWidget) -> None:
super().__init__(parent=parent) super().__init__(parent=parent)
@@ -3171,5 +3155,3 @@ class GuiDocEditFooter(QWidget):
wText = self._trWordCount.format("0", "+0") wText = self._trWordCount.format("0", "+0")
self.wordsText.setText(wText) self.wordsText.setText(wText)
return return
# END Class GuiDocEditFooter
-4
View File
@@ -463,8 +463,6 @@ class GuiDocHighlighter(QSyntaxHighlighter):
return return
# END Class GuiDocHighlighter
class TextBlockData(QTextBlockUserData): class TextBlockData(QTextBlockUserData):
@@ -505,5 +503,3 @@ class TextBlockData(QTextBlockUserData):
(rxMatch.capturedStart(0), rxMatch.capturedLength(0)) (rxMatch.capturedStart(0), rxMatch.capturedLength(0))
) )
return self._spellErrors return self._spellErrors
# END Class TextBlockData
+10 -18
View File
@@ -496,8 +496,6 @@ class GuiDocViewer(QTextBrowser):
return return
# END Class GuiDocViewer
class GuiDocViewHistory: class GuiDocViewHistory:
@@ -611,15 +609,13 @@ class GuiDocViewHistory:
) )
return return
# END Class GuiDocViewHistory
# =============================================================================================== #
# The Embedded Document Header
# Only used by DocViewer, and is at a fixed position in the QTextBrowser's viewport
# =============================================================================================== #
class GuiDocViewHeader(QWidget): class GuiDocViewHeader(QWidget):
"""The Embedded Document Header
Only used by DocViewer, and is at a fixed position in the
QTextBrowser's viewport.
"""
def __init__(self, docViewer: GuiDocViewer) -> None: def __init__(self, docViewer: GuiDocViewer) -> None:
super().__init__(parent=docViewer) super().__init__(parent=docViewer)
@@ -835,15 +831,13 @@ class GuiDocViewHeader(QWidget):
self.docViewer.requestProjectItemSelected.emit(self._docHandle, True) self.docViewer.requestProjectItemSelected.emit(self._docHandle, True)
return return
# END Class GuiDocViewHeader
# =============================================================================================== #
# The Embedded Document Footer
# Only used by DocViewer, and is at a fixed position in the QTextBrowser's viewport
# =============================================================================================== #
class GuiDocViewFooter(QWidget): class GuiDocViewFooter(QWidget):
"""The Embedded Document Footer
Only used by DocViewer, and is at a fixed position in the
QTextBrowser's viewport.
"""
def __init__(self, docViewer: GuiDocViewer) -> None: def __init__(self, docViewer: GuiDocViewer) -> None:
super().__init__(parent=docViewer) super().__init__(parent=docViewer)
@@ -967,5 +961,3 @@ class GuiDocViewFooter(QWidget):
CONFIG.viewSynopsis = state CONFIG.viewSynopsis = state
self.docViewer.reloadText() self.docViewer.reloadText()
return return
# END Class GuiDocViewFooter
-6
View File
@@ -221,8 +221,6 @@ class GuiDocViewerPanel(QWidget):
self.kwTabs[tClass].addUpdateEntry(key, name, iItem, hItem) self.kwTabs[tClass].addUpdateEntry(key, name, iItem, hItem)
return return
# END Class GuiDocViewerPanel
class _ViewPanelBackRefs(QTreeWidget): class _ViewPanelBackRefs(QTreeWidget):
@@ -360,8 +358,6 @@ class _ViewPanelBackRefs(QTreeWidget):
return return
# END Class _ViewPanelBackRefs
class _ViewPanelKeyWords(QTreeWidget): class _ViewPanelKeyWords(QTreeWidget):
@@ -528,5 +524,3 @@ class _ViewPanelKeyWords(QTreeWidget):
if index.column() not in (self.C_EDIT, self.C_VIEW): if index.column() not in (self.C_EDIT, self.C_VIEW):
self._parent.loadDocumentTagRequest.emit(tag, nwDocMode.VIEW) self._parent.loadDocumentTagRequest.emit(tag, nwDocMode.VIEW)
return return
# END Class _ViewPanelKeyWords
+1 -3
View File
@@ -28,8 +28,8 @@ import logging
from collections.abc import Iterable from collections.abc import Iterable
from time import time from time import time
from PyQt5.QtGui import QTextBlock, QTextCursor, QTextDocument
from PyQt5.QtCore import QObject, pyqtSlot from PyQt5.QtCore import QObject, pyqtSlot
from PyQt5.QtGui import QTextBlock, QTextCursor, QTextDocument
from PyQt5.QtWidgets import QApplication, QPlainTextDocumentLayout from PyQt5.QtWidgets import QApplication, QPlainTextDocumentLayout
from novelwriter import SHARED from novelwriter import SHARED
@@ -133,5 +133,3 @@ class GuiTextDocument(QTextDocument):
"""Set the spell check state of the syntax highlighter.""" """Set the spell check state of the syntax highlighter."""
self._syntax.setSpellCheck(state) self._syntax.setSpellCheck(state)
return return
# END Class GuiTextDocument
-2
View File
@@ -295,5 +295,3 @@ class GuiItemDetails(QWidget):
self.wCountData.setText(f"{wC:n}") self.wCountData.setText(f"{wC:n}")
self.pCountData.setText(f"{pC:n}") self.pCountData.setText(f"{pC:n}")
return return
# END Class GuiItemDetails
-2
View File
@@ -991,5 +991,3 @@ class GuiMainMenu(QMenuBar):
self.aWebsite.triggered.connect(lambda: self._openWebsite(nwConst.URL_WEB)) self.aWebsite.triggered.connect(lambda: self._openWebsite(nwConst.URL_WEB))
return return
# END Class GuiMainMenu
-8
View File
@@ -61,8 +61,6 @@ class NovelTreeColumn(Enum):
FOCUS = 2 FOCUS = 2
PLOT = 3 PLOT = 3
# END Enum NovelTreeColumn
class GuiNovelView(QWidget): class GuiNovelView(QWidget):
@@ -185,8 +183,6 @@ class GuiNovelView(QWidget):
self.novelTree.refreshHandle(tHandle) self.novelTree.refreshHandle(tHandle)
return return
# END Class GuiNovelView
class GuiNovelToolBar(QWidget): class GuiNovelToolBar(QWidget):
@@ -349,8 +345,6 @@ class GuiNovelToolBar(QWidget):
self.aLastCol[colType] = aLast self.aLastCol[colType] = aLast
return return
# END Class GuiNovelToolBar
class GuiNovelTree(QTreeWidget): class GuiNovelTree(QTreeWidget):
@@ -778,5 +772,3 @@ class GuiNovelTree(QTreeWidget):
if tags: if tags:
lines.append(f"<b>{trConst(nwLabels.KEY_NAME[key])}</b>: {tags}") lines.append(f"<b>{trConst(nwLabels.KEY_NAME[key])}</b>: {tags}")
return lines return lines
# END Class GuiNovelTree
+4 -15
View File
@@ -30,10 +30,10 @@ from __future__ import annotations
import csv import csv
import logging import logging
from time import time
from enum import Enum from enum import Enum
from time import time
from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot, QT_TRANSLATE_NOOP from PyQt5.QtCore import QT_TRANSLATE_NOOP, Qt, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QAbstractItemView, QAction, QFileDialog, QFrame, QGridLayout, QGroupBox, QAbstractItemView, QAction, QFileDialog, QFrame, QGridLayout, QGroupBox,
QHBoxLayout, QLabel, QMenu, QScrollArea, QSplitter, QToolBar, QToolButton, QHBoxLayout, QLabel, QMenu, QScrollArea, QSplitter, QToolBar, QToolButton,
@@ -41,10 +41,10 @@ from PyQt5.QtWidgets import (
) )
from novelwriter import CONFIG, SHARED from novelwriter import CONFIG, SHARED
from novelwriter.common import checkInt, formatFileFilter, makeFileNameSafe
from novelwriter.constants import nwHeaders, nwKeyWords, nwLabels, trConst
from novelwriter.enum import nwDocMode, nwItemClass, nwItemLayout, nwItemType, nwOutline from novelwriter.enum import nwDocMode, nwItemClass, nwItemLayout, nwItemType, nwOutline
from novelwriter.error import logException from novelwriter.error import logException
from novelwriter.common import checkInt, formatFileFilter, makeFileNameSafe
from novelwriter.constants import nwHeaders, trConst, nwKeyWords, nwLabels
from novelwriter.extensions.configlayout import NColourLabel from novelwriter.extensions.configlayout import NColourLabel
from novelwriter.extensions.novelselector import NovelSelector from novelwriter.extensions.novelselector import NovelSelector
from novelwriter.types import ( from novelwriter.types import (
@@ -52,7 +52,6 @@ from novelwriter.types import (
QtSizeExpanding, QtUserRole QtSizeExpanding, QtUserRole
) )
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -195,8 +194,6 @@ class GuiOutlineView(QWidget):
self.outlineTree.refreshTree(rootHandle=(tHandle or None), overRide=True) self.outlineTree.refreshTree(rootHandle=(tHandle or None), overRide=True)
return return
# END Class GuiOutlineView
class GuiOutlineToolBar(QToolBar): class GuiOutlineToolBar(QToolBar):
@@ -310,8 +307,6 @@ class GuiOutlineToolBar(QToolBar):
self.outlineExportRequest.emit() self.outlineExportRequest.emit()
return return
# END Class GuiOutlineToolBar
class GuiOutlineTree(QTreeWidget): class GuiOutlineTree(QTreeWidget):
@@ -727,8 +722,6 @@ class GuiOutlineTree(QTreeWidget):
return return
# END Class GuiOutlineTree
class GuiOutlineHeaderMenu(QMenu): class GuiOutlineHeaderMenu(QMenu):
@@ -771,8 +764,6 @@ class GuiOutlineHeaderMenu(QMenu):
return return
# END Class GuiOutlineHeaderMenu
class GuiOutlineDetails(QScrollArea): class GuiOutlineDetails(QScrollArea):
@@ -1103,5 +1094,3 @@ class GuiOutlineDetails(QScrollArea):
return ", ".join( return ", ".join(
[f"<a href='{tag}'>{tag}</a>" for tag in refs.get(key, [])] [f"<a href='{tag}'>{tag}</a>" for tag in refs.get(key, [])]
) )
# END Class GuiOutlineDetails
-10
View File
@@ -243,8 +243,6 @@ class GuiProjectView(QWidget):
self.projTree.createNewNote(tag, itemClass) self.projTree.createNewNote(tag, itemClass)
return return
# END Class GuiProjectView
class GuiProjectToolBar(QWidget): class GuiProjectToolBar(QWidget):
@@ -470,8 +468,6 @@ class GuiProjectToolBar(QWidget):
return return
# END Class GuiProjectToolBar
class GuiProjectTree(QTreeWidget): class GuiProjectTree(QTreeWidget):
@@ -1651,8 +1647,6 @@ class GuiProjectTree(QTreeWidget):
return return
# END Class GuiProjectTree
class _UpdatableMenu(QMenu): class _UpdatableMenu(QMenu):
@@ -1716,8 +1710,6 @@ class _UpdatableMenu(QMenu):
self.menuItemTriggered.emit(str(action.data())) self.menuItemTriggered.emit(str(action.data()))
return return
# END Class _UpdatableMenu
class _TreeContextMenu(QMenu): class _TreeContextMenu(QMenu):
@@ -2069,5 +2061,3 @@ class _TreeContextMenu(QMenu):
else: else:
logger.info("Folder conversion cancelled") logger.info("Folder conversion cancelled")
return return
# END Class _TreeContextMenu
-2
View File
@@ -358,5 +358,3 @@ class GuiProjectSearch(QWidget):
QApplication.processEvents() QApplication.processEvents()
return return
# END Class GuiProjectSearch
-4
View File
@@ -150,8 +150,6 @@ class GuiSideBar(QWidget):
return return
# END Class GuiSideBar
class _PopRightMenu(QMenu): class _PopRightMenu(QMenu):
@@ -162,5 +160,3 @@ class _PopRightMenu(QMenu):
offset = QPoint(parent.width(), parent.height() - self.height()) offset = QPoint(parent.width(), parent.height() - self.height())
self.move(parent.mapToGlobal(offset)) self.move(parent.mapToGlobal(offset))
return super(_PopRightMenu, self).event(event) return super(_PopRightMenu, self).event(event)
# END Class _PopRightMenu
-2
View File
@@ -262,5 +262,3 @@ class GuiMainStatus(QStatusBar):
f" \u2013 Peak: {mem[1]:n}" f" \u2013 Peak: {mem[1]:n}"
), 6000) ), 6000)
return return
# END Class GuiMainStatus
+6 -16
View File
@@ -46,12 +46,11 @@ STYLES_MIN_TOOLBUTTON = "minimalToolButton"
STYLES_BIG_TOOLBUTTON = "bigToolButton" STYLES_BIG_TOOLBUTTON = "bigToolButton"
# =============================================================================================== #
# Gui Theme Class
# Handles the look and feel of novelWriter
# =============================================================================================== #
class GuiTheme: class GuiTheme:
"""Gui Theme Class
Handles the look and feel of novelWriter.
"""
def __init__(self) -> None: def __init__(self) -> None:
@@ -482,12 +481,6 @@ class GuiTheme:
return return
# End Class GuiTheme
# =============================================================================================== #
# Icons Class
# =============================================================================================== #
class GuiIcons: class GuiIcons:
"""The icon class manages the content of the assets/icons folder, """The icon class manages the content of the assets/icons folder,
@@ -795,12 +788,9 @@ class GuiIcons:
return self._noIcon return self._noIcon
# END Class GuiIcons
# Module Functions
# =============================================================================================== # # ================
# Module Functions
# =============================================================================================== #
def _sortTheme(data: tuple[str, str]) -> str: def _sortTheme(data: tuple[str, str]) -> str:
-2
View File
@@ -1399,5 +1399,3 @@ class GuiMain(QMainWindow):
)) ))
return None, None return None, None
return tHandle, sTitle return tHandle, sTitle
# END Class GuiMain
-4
View File
@@ -376,8 +376,6 @@ class SharedData(QObject):
widget.close() widget.close()
return return
# END Class SharedData
class _GuiAlert(QMessageBox): class _GuiAlert(QMessageBox):
@@ -438,5 +436,3 @@ class _GuiAlert(QMessageBox):
self.setIconPixmap(self._theme.getPixmap("alert_question", (pSz, pSz))) self.setIconPixmap(self._theme.getPixmap("alert_question", (pSz, pSz)))
self.setWindowTitle(self.tr("Question")) self.setWindowTitle(self.tr("Question"))
return return
# END Class _GuiAlert
-2
View File
@@ -264,5 +264,3 @@ class GuiDictionaries(NNonBlockingDialog):
cursor.deleteChar() cursor.deleteChar()
self.infoBox.setTextCursor(cursor) self.infoBox.setTextCursor(cursor)
return return
# END Class GuiDictionaries
+2 -4
View File
@@ -23,8 +23,8 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from __future__ import annotations from __future__ import annotations
import random
import logging import logging
import random
from PyQt5.QtCore import Qt, pyqtSlot from PyQt5.QtCore import Qt, pyqtSlot
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
@@ -35,7 +35,7 @@ from PyQt5.QtWidgets import (
from novelwriter import CONFIG, SHARED from novelwriter import CONFIG, SHARED
from novelwriter.common import readTextFile from novelwriter.common import readTextFile
from novelwriter.extensions.switch import NSwitch from novelwriter.extensions.switch import NSwitch
from novelwriter.types import QtAlignLeft, QtAlignRight, QtRoleAction, QtDialogClose from novelwriter.types import QtAlignLeft, QtAlignRight, QtDialogClose, QtRoleAction
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -150,5 +150,3 @@ class GuiLipsum(QDialog):
self._lipsumText = "\n\n".join(lipsumText[0:pCount]) + "\n\n" self._lipsumText = "\n\n".join(lipsumText[0:pCount]) + "\n\n"
self.close() self.close()
return return
# END Class GuiLipsum
-2
View File
@@ -403,5 +403,3 @@ class GuiManuscriptBuild(QDialog):
"""Open the build folder in the system's file explorer.""" """Open the build folder in the system's file explorer."""
openExternalPath(Path(self.buildPath.text())) openExternalPath(Path(self.buildPath.text()))
return return
# END Class GuiManuscriptBuild
-10
View File
@@ -510,8 +510,6 @@ class GuiManuscript(NToolDialog):
return obj return obj
return None return None
# END Class GuiManuscript
class _DetailsWidget(QWidget): class _DetailsWidget(QWidget):
@@ -653,8 +651,6 @@ class _DetailsWidget(QWidget):
return return
# END Class _DetailsWidget
class _OutlineWidget(QWidget): class _OutlineWidget(QWidget):
@@ -734,8 +730,6 @@ class _OutlineWidget(QWidget):
self.outlineEntryClicked.emit(str(item.data(0, self.D_LINE))) self.outlineEntryClicked.emit(str(item.data(0, self.D_LINE)))
return return
# END Class _OutlineWidget
class _PreviewWidget(QTextBrowser): class _PreviewWidget(QTextBrowser):
@@ -961,8 +955,6 @@ class _PreviewWidget(QTextBrowser):
self.buildProgress.move((vW-pS)//2, (vH-pS)//2) self.buildProgress.move((vW-pS)//2, (vH-pS)//2)
return return
# END Class _PreviewWidget
class _StatsWidget(QWidget): class _StatsWidget(QWidget):
@@ -1136,5 +1128,3 @@ class _StatsWidget(QWidget):
self.maxWidget.setLayout(self.maxLayout) self.maxWidget.setLayout(self.maxLayout)
return return
# END Class _StatsWidget
-14
View File
@@ -278,8 +278,6 @@ class GuiBuildSettings(NToolDialog):
self._build.resetChangedState() self._build.resetChangedState()
return return
# END Class GuiBuildSettings
class _FilterTab(NFixedPage): class _FilterTab(NFixedPage):
@@ -574,8 +572,6 @@ class _FilterTab(NFixedPage):
self._scanChildren(item.child(i), items) self._scanChildren(item.child(i), items)
return items return items
# END Class _FilterTab
class _HeadingsTab(NScrollablePage): class _HeadingsTab(NScrollablePage):
@@ -941,8 +937,6 @@ class _HeadingsTab(NScrollablePage):
return return
# END Class _HeadingsTab
class _HeadingSyntaxHighlighter(QSyntaxHighlighter): class _HeadingSyntaxHighlighter(QSyntaxHighlighter):
@@ -967,8 +961,6 @@ class _HeadingSyntaxHighlighter(QSyntaxHighlighter):
self.setFormat(pos + ddots, 1, self._fmtSymbol) self.setFormat(pos + ddots, 1, self._fmtSymbol)
return return
# END Class _HeadingSyntaxHighlighter
class _ContentTab(NScrollableForm): class _ContentTab(NScrollableForm):
@@ -1052,8 +1044,6 @@ class _ContentTab(NScrollableForm):
self.ignoredKeywords.setText(", ".join(verified)) self.ignoredKeywords.setText(", ".join(verified))
return return
# END Class _ContentTab
class _FormatTab(NScrollableForm): class _FormatTab(NScrollableForm):
@@ -1346,8 +1336,6 @@ class _FormatTab(NScrollableForm):
self.pageSize.setCurrentIndex(index) self.pageSize.setCurrentIndex(index)
return return
# END Class _FormatTab
class _OutputTab(NScrollableForm): class _OutputTab(NScrollableForm):
@@ -1432,5 +1420,3 @@ class _OutputTab(NScrollableForm):
self.odtPageHeader.setText(nwHeadFmt.ODT_AUTO) self.odtPageHeader.setText(nwHeadFmt.ODT_AUTO)
self.odtPageHeader.setCursorPosition(0) self.odtPageHeader.setCursorPosition(0)
return return
# END Class _OutputTab
-6
View File
@@ -186,8 +186,6 @@ class GuiNovelDetails(NNonBlockingDialog):
return return
# END Class GuiNovelDetails
class _OverviewPage(NScrollablePage): class _OverviewPage(NScrollablePage):
@@ -294,8 +292,6 @@ class _OverviewPage(NScrollablePage):
return return
# END Class _OverviewPage
class _ContentsPage(NFixedPage): class _ContentsPage(NFixedPage):
@@ -524,5 +520,3 @@ class _ContentsPage(NFixedPage):
self._data = SHARED.project.index.getTableOfContents(rootHandle, 2) self._data = SHARED.project.index.getTableOfContents(rootHandle, 2)
self._data.append(("", 0, self.tr("END"), 0)) self._data.append(("", 0, self.tr("END"), 0))
return return
# END Class _ContentsPage
+2 -16
View File
@@ -32,11 +32,11 @@ from PyQt5.QtCore import (
QAbstractListModel, QEvent, QModelIndex, QObject, QPoint, QSize, Qt, QAbstractListModel, QEvent, QModelIndex, QObject, QPoint, QSize, Qt,
pyqtSignal, pyqtSlot pyqtSignal, pyqtSlot
) )
from PyQt5.QtGui import QCloseEvent, QColor, QFont, QPaintEvent, QPainter, QPen from PyQt5.QtGui import QCloseEvent, QColor, QFont, QPainter, QPaintEvent, QPen
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QAction, QApplication, QDialog, QFileDialog, QFormLayout, QHBoxLayout, QAction, QApplication, QDialog, QFileDialog, QFormLayout, QHBoxLayout,
QLabel, QLineEdit, QListView, QMenu, QPushButton, QScrollArea, QShortcut, QLabel, QLineEdit, QListView, QMenu, QPushButton, QScrollArea, QShortcut,
QStackedWidget, QStyleOptionViewItem, QStyledItemDelegate, QVBoxLayout, QStackedWidget, QStyledItemDelegate, QStyleOptionViewItem, QVBoxLayout,
QWidget QWidget
) )
@@ -267,8 +267,6 @@ class GuiWelcome(QDialog):
self.btnCreate.setFocus() self.btnCreate.setFocus()
return return
# END Class GuiWelcome
class _OpenProjectPage(QWidget): class _OpenProjectPage(QWidget):
@@ -392,8 +390,6 @@ class _OpenProjectPage(QWidget):
self._projectClicked(index) self._projectClicked(index)
return return
# END Class _OpenProjectPage
class _ProjectListItem(QStyledItemDelegate): class _ProjectListItem(QStyledItemDelegate):
@@ -450,8 +446,6 @@ class _ProjectListItem(QStyledItemDelegate):
"""Set the size hint to fixed height.""" """Set the size hint to fixed height."""
return QSize(opt.rect.width(), self._hPx) return QSize(opt.rect.width(), self._hPx)
# END Class _ProjectListItem
class _ProjectListModel(QAbstractListModel): class _ProjectListModel(QAbstractListModel):
@@ -491,8 +485,6 @@ class _ProjectListModel(QAbstractListModel):
return True return True
return False return False
# END Class _ProjectListModel
class _NewProjectPage(QWidget): class _NewProjectPage(QWidget):
@@ -548,8 +540,6 @@ class _NewProjectPage(QWidget):
self.openProjectRequest.emit(path) self.openProjectRequest.emit(path)
return return
# END Class _NewProjectPage
class _NewProjectForm(QWidget): class _NewProjectForm(QWidget):
@@ -805,8 +795,6 @@ class _NewProjectForm(QWidget):
return return
# END Class _NewProjectForm
class _PopLeftDirectionMenu(QMenu): class _PopLeftDirectionMenu(QMenu):
@@ -817,5 +805,3 @@ class _PopLeftDirectionMenu(QMenu):
offset = QPoint(parent.width() - self.width(), parent.height()) offset = QPoint(parent.width() - self.width(), parent.height())
self.move(parent.mapToGlobal(offset)) self.move(parent.mapToGlobal(offset))
return super(_PopLeftDirectionMenu, self).event(event) return super(_PopLeftDirectionMenu, self).event(event)
# END Class _PopLeftDirectionMenu
-2
View File
@@ -614,5 +614,3 @@ class GuiWritingStats(NToolDialog):
self.labelFilter.setText(formatTime(round(self.timeFilter))) self.labelFilter.setText(formatTime(round(self.timeFilter)))
return return
# END Class GuiWritingStats
-2
View File
@@ -1718,5 +1718,3 @@ if __name__ == "__main__":
sys.exit(1) sys.exit(1)
else: else:
xdgUninstall() xdgUninstall()
# END Main
+6 -5
View File
@@ -20,15 +20,13 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from __future__ import annotations from __future__ import annotations
import sys
import pytest
import shutil
import logging import logging
import shutil
import sys
from pathlib import Path from pathlib import Path
from tools import cleanProject import pytest
from mocked import MockGuiMain, MockTheme
from PyQt5.QtWidgets import QMessageBox from PyQt5.QtWidgets import QMessageBox
@@ -36,6 +34,9 @@ sys.path.insert(1, str(Path(__file__).parent.parent.absolute()))
from novelwriter import CONFIG, SHARED, main # noqa: E402 from novelwriter import CONFIG, SHARED, main # noqa: E402
from tests.mocked import MockGuiMain, MockTheme # noqa: E402
from tests.tools import cleanProject # noqa: E402
_TST_ROOT = Path(__file__).parent _TST_ROOT = Path(__file__).parent
_TMP_ROOT = _TST_ROOT / "temp" _TMP_ROOT = _TST_ROOT / "temp"
_TMP_CONF = _TMP_ROOT / "conf" _TMP_CONF = _TMP_ROOT / "conf"
+3 -16
View File
@@ -24,10 +24,6 @@ from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QWidget from PyQt5.QtWidgets import QWidget
# =========================================================================== #
# Mock GUI
# =========================================================================== #
class MockGuiMain(QWidget): class MockGuiMain(QWidget):
def __init__(self): def __init__(self):
@@ -55,8 +51,6 @@ class MockGuiMain(QWidget):
def close(self): def close(self):
return "close" return "close"
# END Class MockGuiMain
class MockStatusBar: class MockStatusBar:
@@ -69,8 +63,6 @@ class MockStatusBar:
def updateProjectStatus(self, status): def updateProjectStatus(self, status):
return return
# END Class MockStatusBar
class MockTheme: class MockTheme:
@@ -81,8 +73,6 @@ class MockTheme:
def getPixmap(self, *a): def getPixmap(self, *a):
return QPixmap() return QPixmap()
# END Class MockTheme
class MockApp: class MockApp:
@@ -92,13 +82,10 @@ class MockApp:
def installTranslator(self, language): def installTranslator(self, language):
return return
# END Class MockApp
# Error Functions
# =========================================================================== # # ===============
# Error Functions # Mock functions that will raise errors instead.
# Mock functions that will raise errors instead.
# =========================================================================== #
def causeOSError(*args, **kwargs): def causeOSError(*args, **kwargs):
raise OSError("Mock OSError") raise OSError("Mock OSError")
-70
View File
@@ -54,8 +54,6 @@ def testBaseCommon_checkStringNone():
assert checkStringNone(1.0, "NotNone") == "NotNone" assert checkStringNone(1.0, "NotNone") == "NotNone"
assert checkStringNone(True, "NotNone") == "NotNone" assert checkStringNone(True, "NotNone") == "NotNone"
# END Test testBaseCommon_checkStringNone
@pytest.mark.base @pytest.mark.base
def testBaseCommon_checkString(): def testBaseCommon_checkString():
@@ -69,8 +67,6 @@ def testBaseCommon_checkString():
assert checkString(1.0, "default") == "default" assert checkString(1.0, "default") == "default"
assert checkString(True, "default") == "default" assert checkString(True, "default") == "default"
# END Test testBaseCommon_checkString
@pytest.mark.base @pytest.mark.base
def testBaseCommon_checkInt(): def testBaseCommon_checkInt():
@@ -85,8 +81,6 @@ def testBaseCommon_checkInt():
assert checkInt("1", 3) == 1 assert checkInt("1", 3) == 1
assert checkInt("1.0", 3) == 3 assert checkInt("1.0", 3) == 3
# END Test testBaseCommon_checkInt
@pytest.mark.base @pytest.mark.base
def testBaseCommon_checkFloat(): def testBaseCommon_checkFloat():
@@ -101,8 +95,6 @@ def testBaseCommon_checkFloat():
assert checkFloat("1", 3.0) == 1.0 assert checkFloat("1", 3.0) == 1.0
assert checkFloat("1.0", 3.0) == 1.0 assert checkFloat("1.0", 3.0) == 1.0
# END Test testBaseCommon_checkFloat
@pytest.mark.base @pytest.mark.base
def testBaseCommon_checkBool(): def testBaseCommon_checkBool():
@@ -150,8 +142,6 @@ def testBaseCommon_checkBool():
assert checkBool(2.0, True) is True assert checkBool(2.0, True) is True
assert checkBool(2.0, False) is False assert checkBool(2.0, False) is False
# END Test testBaseCommon_checkBool
@pytest.mark.base @pytest.mark.base
def testBaseCommon_checkUuid(): def testBaseCommon_checkUuid():
@@ -163,8 +153,6 @@ def testBaseCommon_checkUuid():
assert checkUuid("e2be99af-f9bf-4403-857a-c3d1ac25abeaa", None) is None # type: ignore assert checkUuid("e2be99af-f9bf-4403-857a-c3d1ac25abeaa", None) is None # type: ignore
assert checkUuid(testUuid, None) == testUuid # type: ignore assert checkUuid(testUuid, None) == testUuid # type: ignore
# END Test testBaseCommon_checkUuid
@pytest.mark.base @pytest.mark.base
def testBaseCommon_checkPath(): def testBaseCommon_checkPath():
@@ -175,8 +163,6 @@ def testBaseCommon_checkPath():
assert checkPath("", None) is None # type: ignore assert checkPath("", None) is None # type: ignore
assert checkPath(" ", None) is None # type: ignore assert checkPath(" ", None) is None # type: ignore
# END Test testBaseCommon_checkPath
@pytest.mark.base @pytest.mark.base
def testBaseCommon_isHandle(): def testBaseCommon_isHandle():
@@ -188,8 +174,6 @@ def testBaseCommon_isHandle():
assert isHandle(None) is False assert isHandle(None) is False
assert isHandle("STUFF") is False assert isHandle("STUFF") is False
# END Test testBaseCommon_isHandle
@pytest.mark.base @pytest.mark.base
def testBaseCommon_isTitleTag(): def testBaseCommon_isTitleTag():
@@ -205,8 +189,6 @@ def testBaseCommon_isTitleTag():
assert isTitleTag(None) is False assert isTitleTag(None) is False
assert isTitleTag("STUFF") is False assert isTitleTag("STUFF") is False
# END Test testBaseCommon_isTitleTag
@pytest.mark.base @pytest.mark.base
def testBaseCommon_isItemClass(): def testBaseCommon_isItemClass():
@@ -228,8 +210,6 @@ def testBaseCommon_isItemClass():
assert isItemClass(None) is False assert isItemClass(None) is False
assert isItemClass("STUFF") is False assert isItemClass("STUFF") is False
# END Test testBaseCommon_isItemClass
@pytest.mark.base @pytest.mark.base
def testBaseCommon_isItemType(): def testBaseCommon_isItemType():
@@ -247,8 +227,6 @@ def testBaseCommon_isItemType():
assert isItemType(None) is False # type: ignore assert isItemType(None) is False # type: ignore
assert isItemType("STUFF") is False assert isItemType("STUFF") is False
# END Test testBaseCommon_isItemType
@pytest.mark.base @pytest.mark.base
def testBaseCommon_isItemLayout(): def testBaseCommon_isItemLayout():
@@ -271,8 +249,6 @@ def testBaseCommon_isItemLayout():
assert isItemLayout(None) is False # type: ignore assert isItemLayout(None) is False # type: ignore
assert isItemLayout("STUFF") is False assert isItemLayout("STUFF") is False
# END Test testBaseCommon_isItemLayout
@pytest.mark.base @pytest.mark.base
def testBaseCommon_isListInstance(): def testBaseCommon_isListInstance():
@@ -289,8 +265,6 @@ def testBaseCommon_isListInstance():
assert isListInstance([1], str) is False assert isListInstance([1], str) is False
assert isListInstance(["stuff"], int) is False assert isListInstance(["stuff"], int) is False
# END Test testBaseCommon_isListInstance
@pytest.mark.base @pytest.mark.base
def testBaseCommon_hexToInt(): def testBaseCommon_hexToInt():
@@ -302,8 +276,6 @@ def testBaseCommon_hexToInt():
assert hexToInt("0xffffq") == 0 assert hexToInt("0xffffq") == 0
assert hexToInt("0xffffq", 12) == 12 assert hexToInt("0xffffq", 12) == 12
# END Test testBaseCommon_hexToInt
@pytest.mark.base @pytest.mark.base
def testBaseCommon_minmax(): def testBaseCommon_minmax():
@@ -311,8 +283,6 @@ def testBaseCommon_minmax():
for i in range(-5, 15): for i in range(-5, 15):
assert 0 <= minmax(i, 0, 10) <= 10 assert 0 <= minmax(i, 0, 10) <= 10
# END Test testBaseCommon_minmax
@pytest.mark.base @pytest.mark.base
def testBaseCommon_checkIntTuple(): def testBaseCommon_checkIntTuple():
@@ -320,8 +290,6 @@ def testBaseCommon_checkIntTuple():
assert checkIntTuple(0, (0, 1, 2), 3) == 0 assert checkIntTuple(0, (0, 1, 2), 3) == 0
assert checkIntTuple(5, (0, 1, 2), 3) == 3 assert checkIntTuple(5, (0, 1, 2), 3) == 3
# END Test testBaseCommon_checkIntTuple
@pytest.mark.base @pytest.mark.base
def testBaseCommon_formatTimeStamp(): def testBaseCommon_formatTimeStamp():
@@ -330,8 +298,6 @@ def testBaseCommon_formatTimeStamp():
assert formatTimeStamp(tTime, False) == "1970-01-01 00:00:00" assert formatTimeStamp(tTime, False) == "1970-01-01 00:00:00"
assert formatTimeStamp(tTime, True) == "1970-01-01 00.00.00" assert formatTimeStamp(tTime, True) == "1970-01-01 00.00.00"
# END Test testBaseCommon_formatTimeStamp
@pytest.mark.base @pytest.mark.base
def testBaseCommon_formatTime(): def testBaseCommon_formatTime():
@@ -352,8 +318,6 @@ def testBaseCommon_formatTime():
assert formatTime(86400) == "1-00:00:00" assert formatTime(86400) == "1-00:00:00"
assert formatTime(360000) == "4-04:00:00" assert formatTime(360000) == "4-04:00:00"
# END Test testBaseCommon_formatTime
@pytest.mark.base @pytest.mark.base
def testBaseCommon_formatVersion(): def testBaseCommon_formatVersion():
@@ -363,8 +327,6 @@ def testBaseCommon_formatVersion():
assert formatVersion("1.2b2") == "1.2 Beta 2" assert formatVersion("1.2b2") == "1.2 Beta 2"
assert formatVersion("1.2rc3") == "1.2 RC 3" assert formatVersion("1.2rc3") == "1.2 RC 3"
# END Test testBaseCommon_formatVersion
@pytest.mark.base @pytest.mark.base
def testBaseCommon_formatFileFilter(): def testBaseCommon_formatFileFilter():
@@ -375,8 +337,6 @@ def testBaseCommon_formatFileFilter():
"Stuff (*.stuff);;Text files (*.txt);;All files (*)" "Stuff (*.stuff);;Text files (*.txt);;All files (*)"
) )
# END Test testBaseCommon_formatFileFilter
@pytest.mark.base @pytest.mark.base
def testBaseCommon_simplified(): def testBaseCommon_simplified():
@@ -385,8 +345,6 @@ def testBaseCommon_simplified():
assert simplified(" Hello World ") == "Hello World" assert simplified(" Hello World ") == "Hello World"
assert simplified("\tHello\n\r\tWorld") == "Hello World" assert simplified("\tHello\n\r\tWorld") == "Hello World"
# END Test testBaseCommon_simplified
@pytest.mark.base @pytest.mark.base
def testBaseCommon_elide(): def testBaseCommon_elide():
@@ -405,8 +363,6 @@ def testBaseCommon_elide():
assert elide("Hello World!", 1) == " ..." assert elide("Hello World!", 1) == " ..."
assert elide("Hello World!", 0) == " ..." assert elide("Hello World!", 0) == " ..."
# END Test testBaseCommon_elide
@pytest.mark.base @pytest.mark.base
def testBaseCommon_yesNo(): def testBaseCommon_yesNo():
@@ -432,8 +388,6 @@ def testBaseCommon_yesNo():
assert yesNo(1.0) == "yes" # type: ignore assert yesNo(1.0) == "yes" # type: ignore
assert yesNo(2.0) == "yes" # type: ignore assert yesNo(2.0) == "yes" # type: ignore
# END Test testBaseCommon_yesNo
@pytest.mark.base @pytest.mark.base
def testBaseCommon_formatInt(): def testBaseCommon_formatInt():
@@ -455,8 +409,6 @@ def testBaseCommon_formatInt():
assert formatInt(None) == "ERR" # type: ignore assert formatInt(None) == "ERR" # type: ignore
assert formatInt("42") == "ERR" # type: ignore assert formatInt("42") == "ERR" # type: ignore
# END Test testBaseCommon_formatInt
@pytest.mark.base @pytest.mark.base
def testBaseCommon_transferCase(): def testBaseCommon_transferCase():
@@ -469,8 +421,6 @@ def testBaseCommon_transferCase():
assert transferCase("SOURCE", "target") == "TARGET" assert transferCase("SOURCE", "target") == "TARGET"
assert transferCase("source", "TARGET") == "target" assert transferCase("source", "TARGET") == "target"
# END Test testBaseCommon_transferCase
@pytest.mark.base @pytest.mark.base
def testBaseCommon_fuzzyTime(): def testBaseCommon_fuzzyTime():
@@ -504,8 +454,6 @@ def testBaseCommon_fuzzyTime():
assert fuzzyTime(47336399) == "a year ago" assert fuzzyTime(47336399) == "a year ago"
assert fuzzyTime(47336400) == "2 years ago" assert fuzzyTime(47336400) == "2 years ago"
# END Test testBaseCommon_fuzzyTime
@pytest.mark.core @pytest.mark.core
def testBaseCommon_numberToRoman(): def testBaseCommon_numberToRoman():
@@ -531,8 +479,6 @@ def testBaseCommon_numberToRoman():
assert numberToRoman(2010, False) == "MMX" assert numberToRoman(2010, False) == "MMX"
assert numberToRoman(999, True) == "cmxcix" assert numberToRoman(999, True) == "cmxcix"
# END Test testBaseCommon_numberToRoman
@pytest.mark.base @pytest.mark.base
def testBaseCommon_cssCol(): def testBaseCommon_cssCol():
@@ -540,8 +486,6 @@ def testBaseCommon_cssCol():
assert cssCol(QColor(0, 0, 0, 0)) == "rgba(0, 0, 0, 0)" assert cssCol(QColor(0, 0, 0, 0)) == "rgba(0, 0, 0, 0)"
assert cssCol(QColor(10, 20, 30, 40)) == "rgba(10, 20, 30, 40)" assert cssCol(QColor(10, 20, 30, 40)) == "rgba(10, 20, 30, 40)"
# END Test testBaseCommon_cssCol
@pytest.mark.base @pytest.mark.base
def testBaseCommon_jsonEncode(): def testBaseCommon_jsonEncode():
@@ -623,8 +567,6 @@ def testBaseCommon_jsonEncode():
'}' '}'
) )
# END Test testBaseCommon_jsonEncode
@pytest.mark.base @pytest.mark.base
def testBaseCommon_xmlIndent(): def testBaseCommon_xmlIndent():
@@ -650,8 +592,6 @@ def testBaseCommon_xmlIndent():
xmlIndent(data) # type: ignore xmlIndent(data) # type: ignore
assert data == "foobar" assert data == "foobar"
# END Test testBaseCommon_xmlIndent
@pytest.mark.base @pytest.mark.base
def testBaseCommon_readTextFile(monkeypatch, fncPath, ipsumText): def testBaseCommon_readTextFile(monkeypatch, fncPath, ipsumText):
@@ -667,8 +607,6 @@ def testBaseCommon_readTextFile(monkeypatch, fncPath, ipsumText):
mp.setattr("pathlib.Path.read_text", causeOSError) mp.setattr("pathlib.Path.read_text", causeOSError)
assert readTextFile(testFile) == "" assert readTextFile(testFile) == ""
# END Test testBaseCommon_readTextFile
@pytest.mark.base @pytest.mark.base
def testBaseCommon_makeFileNameSafe(): def testBaseCommon_makeFileNameSafe():
@@ -680,8 +618,6 @@ def testBaseCommon_makeFileNameSafe():
assert makeFileNameSafe("æøå") == "æøå" assert makeFileNameSafe("æøå") == "æøå"
assert makeFileNameSafe("Stuff œfi2⁵") == "Stuff œfi25" assert makeFileNameSafe("Stuff œfi2⁵") == "Stuff œfi25"
# END Test testBaseCommon_makeFileNameSafe
@pytest.mark.base @pytest.mark.base
def testBaseCommon_getFileSize(fncPath): def testBaseCommon_getFileSize(fncPath):
@@ -693,8 +629,6 @@ def testBaseCommon_getFileSize(fncPath):
assert getFileSize(fncPath / "one.txt") == 6 assert getFileSize(fncPath / "one.txt") == 6
assert getFileSize(fncPath / "two.txt") == 0 assert getFileSize(fncPath / "two.txt") == 0
# END Test testBaseCommon_getFileSize
@pytest.mark.base @pytest.mark.base
def testBaseCommon_openExternalPath(monkeypatch, tstPaths): def testBaseCommon_openExternalPath(monkeypatch, tstPaths):
@@ -711,8 +645,6 @@ def testBaseCommon_openExternalPath(monkeypatch, tstPaths):
assert openExternalPath(tstPaths.tmpDir) is True assert openExternalPath(tstPaths.tmpDir) is True
assert lastUrl.startswith("file://") assert lastUrl.startswith("file://")
# END Test testBaseCommon_openExternalPath
@pytest.mark.base @pytest.mark.base
def testBaseCommon_NWConfigParser(fncPath): def testBaseCommon_NWConfigParser(fncPath):
@@ -801,5 +733,3 @@ def testBaseCommon_NWConfigParser(fncPath):
assert cfgParser.rdIntList("nope", "list2", [1]) == [1] assert cfgParser.rdIntList("nope", "list2", [1]) == [1]
assert cfgParser.rdIntList("main", "blabla", [1]) == [1] assert cfgParser.rdIntList("main", "blabla", [1]) == [1]
# END Test testBaseCommon_NWConfigParser
+5 -18
View File
@@ -21,18 +21,19 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
from __future__ import annotations from __future__ import annotations
import sys import sys
import pytest
from shutil import copyfile
from pathlib import Path from pathlib import Path
from shutil import copyfile
from mocked import causeOSError, MockApp import pytest
from tools import cmpFiles, writeFile
from novelwriter import CONFIG from novelwriter import CONFIG
from novelwriter.config import Config, RecentProjects from novelwriter.config import Config, RecentProjects
from novelwriter.constants import nwFiles from novelwriter.constants import nwFiles
from tests.mocked import MockApp, causeOSError
from tests.tools import cmpFiles, writeFile
@pytest.mark.base @pytest.mark.base
def testBaseConfig_Constructor(monkeypatch): def testBaseConfig_Constructor(monkeypatch):
@@ -88,8 +89,6 @@ def testBaseConfig_Constructor(monkeypatch):
tstConf = Config() tstConf = Config()
assert tstConf._appPath == tstConf._appRoot assert tstConf._appPath == tstConf._appRoot
# END Test testBaseConfig_Constructor
@pytest.mark.base @pytest.mark.base
def testBaseConfig_InitLoadSave(monkeypatch, fncPath, tstPaths): def testBaseConfig_InitLoadSave(monkeypatch, fncPath, tstPaths):
@@ -153,8 +152,6 @@ def testBaseConfig_InitLoadSave(monkeypatch, fncPath, tstPaths):
assert newConf.doReplaceDQuote is False assert newConf.doReplaceDQuote is False
assert newConf.doReplaceSQuote is False assert newConf.doReplaceSQuote is False
# END Test testBaseConfig_InitLoadSave
@pytest.mark.base @pytest.mark.base
def testBaseConfig_Localisation(fncPath, tstPaths): def testBaseConfig_Localisation(fncPath, tstPaths):
@@ -191,8 +188,6 @@ def testBaseConfig_Localisation(fncPath, tstPaths):
languages = tstConf.listLanguages(tstConf.LANG_NW) languages = tstConf.listLanguages(tstConf.LANG_NW)
assert languages == [("en_GB", "British English"), ("fr", "Français")] assert languages == [("en_GB", "British English"), ("fr", "Français")]
# END Test testBaseConfig_Localisation
@pytest.mark.base @pytest.mark.base
def testBaseConfig_Methods(fncPath): def testBaseConfig_Methods(fncPath):
@@ -237,8 +232,6 @@ def testBaseConfig_Methods(fncPath):
# Recent Projects # Recent Projects
assert isinstance(tstConf.recentProjects, RecentProjects) assert isinstance(tstConf.recentProjects, RecentProjects)
# END Test testBaseConfig_Methods
@pytest.mark.base @pytest.mark.base
def testBaseConfig_SettersGetters(fncPath): def testBaseConfig_SettersGetters(fncPath):
@@ -361,8 +354,6 @@ def testBaseConfig_SettersGetters(fncPath):
assert tstConf.getTextMargin() == 80 assert tstConf.getTextMargin() == 80
assert tstConf.getTabWidth() == 80 assert tstConf.getTabWidth() == 80
# END Test testBaseConfig_SettersGetters
@pytest.mark.base @pytest.mark.base
def testBaseConfig_Internal(monkeypatch, fncPath): def testBaseConfig_Internal(monkeypatch, fncPath):
@@ -383,8 +374,6 @@ def testBaseConfig_Internal(monkeypatch, fncPath):
tstConf._checkOptionalPackages() tstConf._checkOptionalPackages()
assert tstConf.hasEnchant is False assert tstConf.hasEnchant is False
# END Test testBaseConfig_Internal
@pytest.mark.base @pytest.mark.base
def testBaseConfig_RecentCache(monkeypatch, tstPaths): def testBaseConfig_RecentCache(monkeypatch, tstPaths):
@@ -446,5 +435,3 @@ def testBaseConfig_RecentCache(monkeypatch, tstPaths):
assert recent.listEntries() == [ assert recent.listEntries() == [
(str(pathOne), "Proj One", 100, 1600002000), (str(pathOne), "Proj One", 100, 1600002000),
] ]
# END Test testBaseConfig_RecentCache
+2 -6
View File
@@ -22,10 +22,10 @@ from __future__ import annotations
import pytest import pytest
from mocked import causeException
from novelwriter.error import NWErrorMessage, exceptionHandler from novelwriter.error import NWErrorMessage, exceptionHandler
from tests.mocked import causeException
@pytest.mark.base @pytest.mark.base
def testBaseError_Dialog(qtbot, monkeypatch, nwGUI): def testBaseError_Dialog(qtbot, monkeypatch, nwGUI):
@@ -61,8 +61,6 @@ def testBaseError_Dialog(qtbot, monkeypatch, nwGUI):
nwErr.close() nwErr.close()
nwGUI.closeMain() nwGUI.closeMain()
# END Test testBaseError_Dialog
@pytest.mark.base @pytest.mark.base
def testBaseError_Handler(qtbot, monkeypatch, nwGUI): def testBaseError_Handler(qtbot, monkeypatch, nwGUI):
@@ -98,5 +96,3 @@ def testBaseError_Handler(qtbot, monkeypatch, nwGUI):
exceptionHandler(Exception, "Error Message", None) # type: ignore exceptionHandler(Exception, "Error Message", None) # type: ignore
nwGUI.closeMain() nwGUI.closeMain()
# END Test testBaseError_Handler
+5 -10
View File
@@ -20,13 +20,14 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from __future__ import annotations from __future__ import annotations
import sys
import pytest
import logging import logging
import sys
from mocked import MockGuiMain import pytest
from novelwriter import CONFIG, main, logger from novelwriter import CONFIG, logger, main
from tests.mocked import MockGuiMain
@pytest.mark.base @pytest.mark.base
@@ -71,8 +72,6 @@ def testBaseInit_Launch(caplog, monkeypatch, fncPath):
main([f"--config={fncPath}", f"--data={fncPath}"]) main([f"--config={fncPath}", f"--data={fncPath}"])
assert ex.value.code == 0 assert ex.value.code == 0
# END Test testBaseInit_Launch
@pytest.mark.base @pytest.mark.base
def testBaseInit_Options(monkeypatch, fncPath): def testBaseInit_Options(monkeypatch, fncPath):
@@ -136,8 +135,6 @@ def testBaseInit_Options(monkeypatch, fncPath):
) )
assert nwGUI.closeMain() == "closeMain" assert nwGUI.closeMain() == "closeMain"
# END Test testBaseInit_Options
@pytest.mark.base @pytest.mark.base
def testBaseInit_Imports(caplog, monkeypatch, fncPath): def testBaseInit_Imports(caplog, monkeypatch, fncPath):
@@ -164,5 +161,3 @@ def testBaseInit_Imports(caplog, monkeypatch, fncPath):
assert "At least Python" in caplog.messages[0] assert "At least Python" in caplog.messages[0]
assert "At least Qt5" in caplog.messages[1] assert "At least Qt5" in caplog.messages[1]
assert "At least PyQt5" in caplog.messages[2] assert "At least PyQt5" in caplog.messages[2]
# END Test testBaseInit_Imports
+4 -10
View File
@@ -22,13 +22,13 @@ from __future__ import annotations
import pytest import pytest
from tools import buildTestProject
from mocked import MockGuiMain, MockTheme
from PyQt5.QtWidgets import QFileDialog, QMessageBox, QWidget from PyQt5.QtWidgets import QFileDialog, QMessageBox, QWidget
from novelwriter.shared import SharedData
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
from novelwriter.shared import SharedData
from tests.mocked import MockGuiMain, MockTheme
from tests.tools import buildTestProject
@pytest.mark.base @pytest.mark.base
@@ -62,8 +62,6 @@ def testBaseSharedData_Init():
assert shared.projectIdleTime == 0.0 assert shared.projectIdleTime == 0.0
assert shared.projectLock is None assert shared.projectLock is None
# END Test testBaseSharedData_Init
@pytest.mark.base @pytest.mark.base
def testBaseSharedData_Projects(monkeypatch, caplog, fncPath): def testBaseSharedData_Projects(monkeypatch, caplog, fncPath):
@@ -123,8 +121,6 @@ def testBaseSharedData_Projects(monkeypatch, caplog, fncPath):
mp.setattr(QFileDialog, "getOpenFileName", lambda *a, **k: (a[2], "")) mp.setattr(QFileDialog, "getOpenFileName", lambda *a, **k: (a[2], ""))
assert shared.getProjectPath(QWidget(), fncPath, allowZip=True) == fncPath assert shared.getProjectPath(QWidget(), fncPath, allowZip=True) == fncPath
# END Test testBaseSharedData_Projects
@pytest.mark.base @pytest.mark.base
def testBaseSharedData_Alerts(qtbot, monkeypatch, caplog): def testBaseSharedData_Alerts(qtbot, monkeypatch, caplog):
@@ -171,5 +167,3 @@ def testBaseSharedData_Alerts(qtbot, monkeypatch, caplog):
# Question box # Question box
assert shared.question("Why?") is True assert shared.question("Why?") is True
assert shared.lastAlert == "Why?" assert shared.lastAlert == "Why?"
# END Test testBaseSharedData_Alerts
+8 -15
View File
@@ -21,20 +21,21 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
from __future__ import annotations from __future__ import annotations
import json import json
import uuid
import pytest
import shutil import shutil
import uuid
from pathlib import Path from pathlib import Path
from novelwriter import CONFIG import pytest
from tools import C, buildTestProject
from mocked import causeOSError
from novelwriter.enum import nwBuildFmt, nwItemClass from novelwriter import CONFIG
from novelwriter.constants import nwFiles from novelwriter.constants import nwFiles
from novelwriter.core.project import NWProject
from novelwriter.core.buildsettings import BuildCollection, BuildSettings, FilterMode from novelwriter.core.buildsettings import BuildCollection, BuildSettings, FilterMode
from novelwriter.core.project import NWProject
from novelwriter.enum import nwBuildFmt, nwItemClass
from tests.mocked import causeOSError
from tests.tools import C, buildTestProject
def isUUID(value): def isUUID(value):
@@ -140,8 +141,6 @@ def testCoreBuildSettings_ClassAttributes(fncPath: Path):
assert more["build"] == "Build Name" assert more["build"] == "Build Name"
assert more["format"] == nwBuildFmt.HTML.name assert more["format"] == nwBuildFmt.HTML.name
# END Test testCoreBuildSettings_ClassAttributes
@pytest.mark.core @pytest.mark.core
def testCoreBuildSettings_BuildValues(): def testCoreBuildSettings_BuildValues():
@@ -216,8 +215,6 @@ def testCoreBuildSettings_BuildValues():
assert more["settings"][boolSetting] is True assert more["settings"][boolSetting] is True
assert more["settings"][floatSetting] == 2.5 assert more["settings"][floatSetting] == 2.5
# END Test testCoreBuildSettings_BuildValues
@pytest.mark.core @pytest.mark.core
def testCoreBuildSettings_Filters(mockGUI, fncPath: Path, mockRnd): def testCoreBuildSettings_Filters(mockGUI, fncPath: Path, mockRnd):
@@ -364,8 +361,6 @@ def testCoreBuildSettings_Filters(mockGUI, fncPath: Path, mockRnd):
# No valid project provided # No valid project provided
assert build.buildItemFilter(None) == {} # type: ignore assert build.buildItemFilter(None) == {} # type: ignore
# END Test testCoreBuildSettings_Filters
@pytest.mark.core @pytest.mark.core
def testCoreBuildSettings_Collection(monkeypatch, mockGUI, fncPath: Path, mockRnd): def testCoreBuildSettings_Collection(monkeypatch, mockGUI, fncPath: Path, mockRnd):
@@ -471,5 +466,3 @@ def testCoreBuildSettings_Collection(monkeypatch, mockGUI, fncPath: Path, mockRn
] ]
assert another.lastBuild == buildIDOne assert another.lastBuild == buildIDOne
assert another.defaultBuild == buildIDTwo assert another.defaultBuild == buildIDTwo
# END Test testCoreBuildSettings_Collection
-20
View File
@@ -125,8 +125,6 @@ def testCoreTools_DocMerger(monkeypatch, mockGUI, fncPath, tstPaths, mockRnd, ip
# Just for debugging # Just for debugging
docMerger.writeTargetDoc() docMerger.writeTargetDoc()
# END Test testCoreTools_DocMerger
@pytest.mark.core @pytest.mark.core
def testCoreTools_DocSplitter(monkeypatch, mockGUI, fncPath, mockRnd, ipsumText): def testCoreTools_DocSplitter(monkeypatch, mockGUI, fncPath, mockRnd, ipsumText):
@@ -264,8 +262,6 @@ def testCoreTools_DocSplitter(monkeypatch, mockGUI, fncPath, mockRnd, ipsumText)
project.saveProject() project.saveProject()
# END Test testCoreTools_DocSplitter
@pytest.mark.core @pytest.mark.core
def testCoreTools_DocDuplicator(mockGUI, fncPath, tstPaths, mockRnd): def testCoreTools_DocDuplicator(mockGUI, fncPath, tstPaths, mockRnd):
@@ -401,8 +397,6 @@ def testCoreTools_DocDuplicator(mockGUI, fncPath, tstPaths, mockRnd):
copyfile(projFile, testFile) copyfile(projFile, testFile)
assert cmpFiles(testFile, compFile, ignoreStart=XML_IGNORE) assert cmpFiles(testFile, compFile, ignoreStart=XML_IGNORE)
# END Test testCoreTools_DocDuplicator
@pytest.mark.core @pytest.mark.core
def testCoreTools_DocSearch(monkeypatch, mockGUI, fncPath, mockRnd, ipsumText): def testCoreTools_DocSearch(monkeypatch, mockGUI, fncPath, mockRnd, ipsumText):
@@ -479,8 +473,6 @@ def testCoreTools_DocSearch(monkeypatch, mockGUI, fncPath, mockRnd, ipsumText):
assert pruneResult(search.iterSearch(project, "Lorem"), 2) == [(15, 5, "Lorem")] assert pruneResult(search.iterSearch(project, "Lorem"), 2) == [(15, 5, "Lorem")]
search.setCaseSensitive(False) search.setCaseSensitive(False)
# END Test testCoreTools_DocSearch
@pytest.mark.core @pytest.mark.core
def testCoreTools_ProjectBuilderWrapper(monkeypatch, caplog, fncPath, mockGUI): def testCoreTools_ProjectBuilderWrapper(monkeypatch, caplog, fncPath, mockGUI):
@@ -509,8 +501,6 @@ def testCoreTools_ProjectBuilderWrapper(monkeypatch, caplog, fncPath, mockGUI):
assert builder.buildProject({"path": fncPath}) is False assert builder.buildProject({"path": fncPath}) is False
assert "The target folder is not empty." in caplog.text assert "The target folder is not empty." in caplog.text
# END Test testCoreTools_ProjectBuilderWrapper
@pytest.mark.core @pytest.mark.core
def testCoreTools_ProjectBuilderA(monkeypatch, fncPath, tstPaths, mockGUI, mockRnd): def testCoreTools_ProjectBuilderA(monkeypatch, fncPath, tstPaths, mockGUI, mockRnd):
@@ -544,8 +534,6 @@ def testCoreTools_ProjectBuilderA(monkeypatch, fncPath, tstPaths, mockGUI, mockR
copyfile(projFile, testFile) copyfile(projFile, testFile)
assert cmpFiles(testFile, compFile, ignoreStart=XML_IGNORE) assert cmpFiles(testFile, compFile, ignoreStart=XML_IGNORE)
# END Test testCoreTools_ProjectBuilderA
@pytest.mark.core @pytest.mark.core
def testCoreTools_ProjectBuilderB(monkeypatch, fncPath, tstPaths, mockGUI, mockRnd): def testCoreTools_ProjectBuilderB(monkeypatch, fncPath, tstPaths, mockGUI, mockRnd):
@@ -579,8 +567,6 @@ def testCoreTools_ProjectBuilderB(monkeypatch, fncPath, tstPaths, mockGUI, mockR
copyfile(projFile, testFile) copyfile(projFile, testFile)
assert cmpFiles(testFile, compFile, ignoreStart=XML_IGNORE) assert cmpFiles(testFile, compFile, ignoreStart=XML_IGNORE)
# END Test testCoreTools_ProjectBuilderB
@pytest.mark.core @pytest.mark.core
def testCoreTools_ProjectBuilderCopyPlain(monkeypatch, caplog, mockGUI, prjLipsum, fncPath): def testCoreTools_ProjectBuilderCopyPlain(monkeypatch, caplog, mockGUI, prjLipsum, fncPath):
@@ -645,8 +631,6 @@ def testCoreTools_ProjectBuilderCopyPlain(monkeypatch, caplog, mockGUI, prjLipsu
assert dstProject.data.autoCount < 5 assert dstProject.data.autoCount < 5
assert dstProject.data.editTime < 10 assert dstProject.data.editTime < 10
# END Test testCoreTools_ProjectBuilderCopyPlain
@pytest.mark.core @pytest.mark.core
def testCoreTools_ProjectBuilderCopyZipped(monkeypatch, caplog, mockGUI, fncPath, mockRnd): def testCoreTools_ProjectBuilderCopyZipped(monkeypatch, caplog, mockGUI, fncPath, mockRnd):
@@ -723,8 +707,6 @@ def testCoreTools_ProjectBuilderCopyZipped(monkeypatch, caplog, mockGUI, fncPath
assert dstProject.data.autoCount < 5 assert dstProject.data.autoCount < 5
assert dstProject.data.editTime < 10 assert dstProject.data.editTime < 10
# END Test testCoreTools_ProjectBuilderCopyZipped
@pytest.mark.core @pytest.mark.core
def testCoreTools_ProjectBuilderSample(monkeypatch, mockGUI, fncPath, tstPaths): def testCoreTools_ProjectBuilderSample(monkeypatch, mockGUI, fncPath, tstPaths):
@@ -769,5 +751,3 @@ def testCoreTools_ProjectBuilderSample(monkeypatch, mockGUI, fncPath, tstPaths):
# Can't create to the same target again # Can't create to the same target again
assert builder.buildProject(data) is False assert builder.buildProject(data) is False
dstSample.unlink() dstSample.unlink()
# END Test testCoreTools_ProjectBuilderSample
-12
View File
@@ -182,8 +182,6 @@ def testCoreDocBuild_OpenDocument(monkeypatch, mockGUI, prjLipsum, fncPath, tstP
"Build: Failed to build '04468803b92e1'", "Build: Failed to build '04468803b92e1'",
] ]
# END Test testCoreDocBuild_OpenDocument
@pytest.mark.core @pytest.mark.core
def testCoreDocBuild_HTML(monkeypatch, mockGUI, prjLipsum, fncPath, tstPaths): def testCoreDocBuild_HTML(monkeypatch, mockGUI, prjLipsum, fncPath, tstPaths):
@@ -252,8 +250,6 @@ def testCoreDocBuild_HTML(monkeypatch, mockGUI, prjLipsum, fncPath, tstPaths):
assert docBuild.error == "OSError: Mock OSError" assert docBuild.error == "OSError: Mock OSError"
assert not docFile.is_file() assert not docFile.is_file()
# END Test testCoreDocBuild_HTML
@pytest.mark.core @pytest.mark.core
def testCoreDocBuild_Markdown(monkeypatch, mockGUI, prjLipsum, fncPath, tstPaths): def testCoreDocBuild_Markdown(monkeypatch, mockGUI, prjLipsum, fncPath, tstPaths):
@@ -322,8 +318,6 @@ def testCoreDocBuild_Markdown(monkeypatch, mockGUI, prjLipsum, fncPath, tstPaths
assert docBuild.error == "OSError: Mock OSError" assert docBuild.error == "OSError: Mock OSError"
assert not docFile.is_file() assert not docFile.is_file()
# END Test testCoreDocBuild_Markdown
@pytest.mark.core @pytest.mark.core
def testCoreDocBuild_NWD(monkeypatch, mockGUI, prjLipsum, fncPath, tstPaths): def testCoreDocBuild_NWD(monkeypatch, mockGUI, prjLipsum, fncPath, tstPaths):
@@ -392,8 +386,6 @@ def testCoreDocBuild_NWD(monkeypatch, mockGUI, prjLipsum, fncPath, tstPaths):
assert docBuild.error == "OSError: Mock OSError" assert docBuild.error == "OSError: Mock OSError"
assert not docFile.is_file() assert not docFile.is_file()
# END Test testCoreDocBuild_NWD
@pytest.mark.core @pytest.mark.core
def testCoreDocBuild_Custom(mockGUI, fncPath: Path): def testCoreDocBuild_Custom(mockGUI, fncPath: Path):
@@ -457,8 +449,6 @@ def testCoreDocBuild_Custom(mockGUI, fncPath: Path):
) )
docFile.unlink() docFile.unlink()
# END Test testCoreDocBuild_Custom
@pytest.mark.core @pytest.mark.core
def testCoreDocBuild_IterBuild(mockGUI, fncPath: Path, mockRnd): def testCoreDocBuild_IterBuild(mockGUI, fncPath: Path, mockRnd):
@@ -600,5 +590,3 @@ def testCoreDocBuild_IterBuild(mockGUI, fncPath: Path, mockRnd):
assert "meta" in data assert "meta" in data
assert "text" in data assert "text" in data
docFile.unlink() docFile.unlink()
# END Test testCoreDocBuild_IterBuild
+5 -9
View File
@@ -22,12 +22,12 @@ from __future__ import annotations
import pytest import pytest
from tools import C, MOCK_TIME, buildTestProject, readFile, writeFile
from mocked import causeOSError
from novelwriter.enum import nwItemClass, nwItemLayout
from novelwriter.core.project import NWProject
from novelwriter.core.document import NWDocument from novelwriter.core.document import NWDocument
from novelwriter.core.project import NWProject
from novelwriter.enum import nwItemClass, nwItemLayout
from tests.mocked import causeOSError
from tests.tools import MOCK_TIME, C, buildTestProject, readFile, writeFile
@pytest.mark.core @pytest.mark.core
@@ -189,8 +189,6 @@ def testCoreDocument_LoadSave(monkeypatch, mockGUI, fncPath, mockRnd):
assert doc.deleteDocument() is True assert doc.deleteDocument() is True
assert not docPath.exists() assert not docPath.exists()
# END Test testCoreDocument_Load
@pytest.mark.core @pytest.mark.core
def testCoreDocument_Methods(monkeypatch, mockGUI, fncPath, mockRnd): def testCoreDocument_Methods(monkeypatch, mockGUI, fncPath, mockRnd):
@@ -234,5 +232,3 @@ def testCoreDocument_Methods(monkeypatch, mockGUI, fncPath, mockRnd):
) )
assert doc.readDocument() == "### Test File\n\nText ...\n\n" assert doc.readDocument() == "### Test File\n\nText ...\n\n"
# END Test testCoreDocument_Methods
-20
View File
@@ -156,8 +156,6 @@ def testCoreIndex_LoadSave(qtbot, monkeypatch, prjLipsum, mockGUI, tstPaths):
# Regression test for issue #1718 # Regression test for issue #1718
project.closeProject() project.closeProject()
# END Test testCoreIndex_LoadSave
@pytest.mark.core @pytest.mark.core
def testCoreIndex_ScanThis(mockGUI): def testCoreIndex_ScanThis(mockGUI):
@@ -214,8 +212,6 @@ def testCoreIndex_ScanThis(mockGUI):
project.closeProject() project.closeProject()
# END Test testCoreIndex_ScanThis
@pytest.mark.core @pytest.mark.core
def testCoreIndex_CheckThese(mockGUI, fncPath, mockRnd): def testCoreIndex_CheckThese(mockGUI, fncPath, mockRnd):
@@ -305,8 +301,6 @@ def testCoreIndex_CheckThese(mockGUI, fncPath, mockRnd):
project.closeProject() project.closeProject()
# END Test testCoreIndex_CheckThese
@pytest.mark.core @pytest.mark.core
def testCoreIndex_ScanText(monkeypatch, mockGUI, fncPath, mockRnd): def testCoreIndex_ScanText(monkeypatch, mockGUI, fncPath, mockRnd):
@@ -550,8 +544,6 @@ def testCoreIndex_ScanText(monkeypatch, mockGUI, fncPath, mockRnd):
project.closeProject() project.closeProject()
# END Test testCoreIndex_ScanText
@pytest.mark.core @pytest.mark.core
def testCoreIndex_CommentKeys(monkeypatch, mockGUI, fncPath, mockRnd): def testCoreIndex_CommentKeys(monkeypatch, mockGUI, fncPath, mockRnd):
@@ -589,8 +581,6 @@ def testCoreIndex_CommentKeys(monkeypatch, mockGUI, fncPath, mockRnd):
# Check invalid comment style # Check invalid comment style
assert index.newCommentKey(C.hSceneDoc, None) == "err" # type: ignore assert index.newCommentKey(C.hSceneDoc, None) == "err" # type: ignore
# END Test testCoreIndex_CommentKeys
@pytest.mark.core @pytest.mark.core
def testCoreIndex_ExtractData(mockGUI, fncPath, mockRnd): def testCoreIndex_ExtractData(mockGUI, fncPath, mockRnd):
@@ -931,8 +921,6 @@ def testCoreIndex_ExtractData(mockGUI, fncPath, mockRnd):
assert project.saveProject() is True assert project.saveProject() is True
project.closeProject() project.closeProject()
# END Test testCoreIndex_ExtractData
@pytest.mark.core @pytest.mark.core
def testCoreIndex_TagsIndex(): def testCoreIndex_TagsIndex():
@@ -1119,8 +1107,6 @@ def testCoreIndex_TagsIndex():
} }
}) })
# END Test testCoreIndex_TagsIndex
@pytest.mark.core @pytest.mark.core
def testCoreIndex_ItemIndex(mockGUI, fncPath, mockRnd): def testCoreIndex_ItemIndex(mockGUI, fncPath, mockRnd):
@@ -1391,8 +1377,6 @@ def testCoreIndex_ItemIndex(mockGUI, fncPath, mockRnd):
} }
}) })
# END Test testCoreIndex_ItemIndex
@pytest.mark.core @pytest.mark.core
def testCoreIndex_checkModKey(): def testCoreIndex_checkModKey():
@@ -1425,8 +1409,6 @@ def testCoreIndex_checkModKey():
assert _checkModKey("note", "a1.2") is False assert _checkModKey("note", "a1.2") is False
assert _checkModKey("note", "a1_2") is True assert _checkModKey("note", "a1_2") is True
# END Test testCoreIndex_checkModKey
@pytest.mark.core @pytest.mark.core
def testCoreIndex_processComment(): def testCoreIndex_processComment():
@@ -1477,5 +1459,3 @@ def testCoreIndex_processComment():
assert processComment("% note.term: Hi") == (nwComment.NOTE, "term", "Hi", 7, 12) assert processComment("% note.term: Hi") == (nwComment.NOTE, "term", "Hi", 7, 12)
assert processComment("% note. term : Hi") == (nwComment.PLAIN, "", "note. term : Hi", 0, 0) assert processComment("% note. term : Hi") == (nwComment.PLAIN, "", "note. term : Hi", 0, 0)
assert processComment("% note . term : Hi") == (nwComment.PLAIN, "", "note . term : Hi", 0, 0) assert processComment("% note . term : Hi") == (nwComment.PLAIN, "", "note . term : Hi", 0, 0)
# END Test testCoreIndex_processComment
+4 -17
View File
@@ -21,15 +21,16 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
from __future__ import annotations from __future__ import annotations
import copy import copy
import pytest import pytest
from PyQt5.QtGui import QIcon from PyQt5.QtGui import QIcon
from tools import C, buildTestProject
from novelwriter.enum import nwItemClass, nwItemType, nwItemLayout
from novelwriter.core.item import NWItem from novelwriter.core.item import NWItem
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType
from tests.tools import C, buildTestProject
@pytest.mark.core @pytest.mark.core
@@ -180,8 +181,6 @@ def testCoreItem_Setters(mockGUI, mockRnd, fncPath):
item.saveInitialCount() item.saveInitialCount()
assert item.initCount == 234 assert item.initCount == 234
# END Test testCoreItem_Setters
@pytest.mark.core @pytest.mark.core
def testCoreItem_Methods(mockGUI, mockRnd, fncPath): def testCoreItem_Methods(mockGUI, mockRnd, fncPath):
@@ -326,8 +325,6 @@ def testCoreItem_Methods(mockGUI, mockRnd, fncPath):
del scItem del scItem
assert cpItem.pack() == cpData assert cpItem.pack() == cpData
# END Test testCoreItem_Methods
@pytest.mark.core @pytest.mark.core
def testCoreItem_TypeSetter(mockGUI): def testCoreItem_TypeSetter(mockGUI):
@@ -355,8 +352,6 @@ def testCoreItem_TypeSetter(mockGUI):
item.setType(nwItemType.ROOT) item.setType(nwItemType.ROOT)
assert item.itemType == nwItemType.ROOT assert item.itemType == nwItemType.ROOT
# END Test testCoreItem_TypeSetter
@pytest.mark.core @pytest.mark.core
def testCoreItem_ClassSetter(mockGUI): def testCoreItem_ClassSetter(mockGUI):
@@ -461,8 +456,6 @@ def testCoreItem_ClassSetter(mockGUI):
item.setClass(nwItemClass.NOVEL) item.setClass(nwItemClass.NOVEL)
assert item.itemClass == nwItemClass.NOVEL assert item.itemClass == nwItemClass.NOVEL
# END Test testCoreItem_ClassSetter
@pytest.mark.core @pytest.mark.core
def testCoreItem_LayoutSetter(mockGUI): def testCoreItem_LayoutSetter(mockGUI):
@@ -490,8 +483,6 @@ def testCoreItem_LayoutSetter(mockGUI):
item.setLayout(nwItemLayout.NOTE) item.setLayout(nwItemLayout.NOTE)
assert item.itemLayout == nwItemLayout.NOTE assert item.itemLayout == nwItemLayout.NOTE
# END Test testCoreItem_LayoutSetter
@pytest.mark.core @pytest.mark.core
def testCoreItem_ClassDefaults(mockGUI): def testCoreItem_ClassDefaults(mockGUI):
@@ -546,8 +537,6 @@ def testCoreItem_ClassDefaults(mockGUI):
assert item.itemStatus is not None assert item.itemStatus is not None
assert item.itemImport is not None assert item.itemImport is not None
# END Test testCoreItem_ClassDefaults
@pytest.mark.core @pytest.mark.core
def testCoreItem_PackUnpack(mockGUI, caplog, mockRnd): def testCoreItem_PackUnpack(mockGUI, caplog, mockRnd):
@@ -761,5 +750,3 @@ def testCoreItem_PackUnpack(mockGUI, caplog, mockRnd):
"import": "i000001", "import": "i000001",
} }
} }
# END Test testCoreItem_PackUnpack
+3 -6
View File
@@ -21,15 +21,16 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
from __future__ import annotations from __future__ import annotations
import json import json
import pytest
from mocked import causeOSError import pytest
from novelwriter.constants import nwFiles from novelwriter.constants import nwFiles
from novelwriter.core.options import OptionState from novelwriter.core.options import OptionState
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
from novelwriter.gui.noveltree import NovelTreeColumn from novelwriter.gui.noveltree import NovelTreeColumn
from tests.mocked import causeOSError
@pytest.mark.core @pytest.mark.core
def testCoreOptions_LoadSave(monkeypatch, mockGUI, fncPath): def testCoreOptions_LoadSave(monkeypatch, mockGUI, fncPath):
@@ -102,8 +103,6 @@ def testCoreOptions_LoadSave(monkeypatch, mockGUI, fncPath):
}, },
} }
# END Test testCoreOptions_LoadSave
@pytest.mark.core @pytest.mark.core
def testCoreOptions_SetGet(mockGUI): def testCoreOptions_SetGet(mockGUI):
@@ -151,5 +150,3 @@ def testCoreOptions_SetGet(mockGUI):
assert options.getFloat("SomeGroup", "mockItem", None) is None # type: ignore assert options.getFloat("SomeGroup", "mockItem", None) is None # type: ignore
assert options.getBool("SomeGroup", "mockItem", None) is None # type: ignore assert options.getBool("SomeGroup", "mockItem", None) is None # type: ignore
assert options.getEnum("SomeGroup", "mockItem", NovelTreeColumn, None) is None # type: ignore assert options.getEnum("SomeGroup", "mockItem", NovelTreeColumn, None) is None # type: ignore
# END Test testCoreOptions_SetGet
+8 -22
View File
@@ -20,25 +20,25 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from __future__ import annotations from __future__ import annotations
import pytest
from shutil import copyfile from shutil import copyfile
from zipfile import ZipFile from zipfile import ZipFile
from mocked import causeOSError import pytest
from tools import C, cmpFiles, buildTestProject, XML_IGNORE
from PyQt5.QtWidgets import QMessageBox from PyQt5.QtWidgets import QMessageBox
from novelwriter import CONFIG, SHARED from novelwriter import CONFIG, SHARED
from novelwriter.enum import nwItemClass
from novelwriter.constants import nwFiles from novelwriter.constants import nwFiles
from novelwriter.core.item import NWItem
from novelwriter.core.tree import NWTree
from novelwriter.core.index import NWIndex from novelwriter.core.index import NWIndex
from novelwriter.core.project import NWProject, NWProjectState from novelwriter.core.item import NWItem
from novelwriter.core.options import OptionState from novelwriter.core.options import OptionState
from novelwriter.core.project import NWProject, NWProjectState
from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLReadState from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLReadState
from novelwriter.core.tree import NWTree
from novelwriter.enum import nwItemClass
from tests.mocked import causeOSError
from tests.tools import XML_IGNORE, C, buildTestProject, cmpFiles
@pytest.mark.core @pytest.mark.core
@@ -88,8 +88,6 @@ def testCoreProject_NewRoot(fncPath, tstPaths, mockGUI, mockRnd):
assert "0000000000016" not in project.tree assert "0000000000016" not in project.tree
assert "0000000000017" not in project.tree assert "0000000000017" not in project.tree
# END Test testCoreProject_NewRoot
@pytest.mark.core @pytest.mark.core
def testCoreProject_NewFileFolder(monkeypatch, fncPath, tstPaths, mockGUI, mockRnd): def testCoreProject_NewFileFolder(monkeypatch, fncPath, tstPaths, mockGUI, mockRnd):
@@ -192,8 +190,6 @@ def testCoreProject_NewFileFolder(monkeypatch, fncPath, tstPaths, mockGUI, mockR
project.closeProject() project.closeProject()
# END Test testCoreProject_NewFileFolder
@pytest.mark.core @pytest.mark.core
def testCoreProject_Open(monkeypatch, caplog, mockGUI, fncPath, mockRnd): def testCoreProject_Open(monkeypatch, caplog, mockGUI, fncPath, mockRnd):
@@ -302,8 +298,6 @@ def testCoreProject_Open(monkeypatch, caplog, mockGUI, fncPath, mockRnd):
project.closeProject() project.closeProject()
# END Test testCoreProject_Open
@pytest.mark.core @pytest.mark.core
def testCoreProject_Save(monkeypatch, mockGUI, mockRnd, fncPath): def testCoreProject_Save(monkeypatch, mockGUI, mockRnd, fncPath):
@@ -331,8 +325,6 @@ def testCoreProject_Save(monkeypatch, mockGUI, mockRnd, fncPath):
assert project.saveProject(autoSave=True) is True assert project.saveProject(autoSave=True) is True
project.closeProject() project.closeProject()
# END Test testCoreProject_Save
@pytest.mark.core @pytest.mark.core
def testCoreProject_AccessItems(mockGUI, fncPath, mockRnd): def testCoreProject_AccessItems(mockGUI, fncPath, mockRnd):
@@ -397,8 +389,6 @@ def testCoreProject_AccessItems(mockGUI, fncPath, mockRnd):
] ]
assert nItem.itemParent is None assert nItem.itemParent is None
# END Test testCoreProject_AccessItems
@pytest.mark.core @pytest.mark.core
def testCoreProject_Methods(monkeypatch, mockGUI, fncPath, mockRnd): def testCoreProject_Methods(monkeypatch, mockGUI, fncPath, mockRnd):
@@ -507,8 +497,6 @@ def testCoreProject_Methods(monkeypatch, mockGUI, fncPath, mockRnd):
project.setTreeOrder(oldOrder) project.setTreeOrder(oldOrder)
assert project.tree.handles() == oldOrder assert project.tree.handles() == oldOrder
# END Test testCoreProject_Methods
@pytest.mark.core @pytest.mark.core
def testCoreProject_Backup(monkeypatch, mockGUI, fncPath, tstPaths): def testCoreProject_Backup(monkeypatch, mockGUI, fncPath, tstPaths):
@@ -566,5 +554,3 @@ def testCoreProject_Backup(monkeypatch, mockGUI, fncPath, tstPaths):
fncPath / "nwProject.nwx", fncPath / "nwProject.nwx",
tstPaths.tmpDir / "extract" / "nwProject.nwx" tstPaths.tmpDir / "extract" / "nwProject.nwx"
) )
# END Test testCoreProject_Backup
-12
View File
@@ -246,8 +246,6 @@ def testCoreProjectXML_ReadCurrent(monkeypatch, mockGUI, tstPaths, fncPath):
copyfile(outFile, tstFile) copyfile(outFile, tstFile)
assert cmpFiles(tstFile, refFile) assert cmpFiles(tstFile, refFile)
# END Test testCoreProjectXML_ReadCurrent
@pytest.mark.core @pytest.mark.core
def testCoreProjectXML_ReadLegacy10(tstPaths, fncPath, mockGUI, mockRnd): def testCoreProjectXML_ReadLegacy10(tstPaths, fncPath, mockGUI, mockRnd):
@@ -393,8 +391,6 @@ def testCoreProjectXML_ReadLegacy10(tstPaths, fncPath, mockGUI, mockRnd):
copyfile(outFile, testFile) copyfile(outFile, testFile)
assert cmpFiles(testFile, compFile) assert cmpFiles(testFile, compFile)
# END Test testCoreProjectXML_ReadLegacy10
@pytest.mark.core @pytest.mark.core
def testCoreProjectXML_ReadLegacy11(tstPaths, fncPath, mockGUI, mockRnd): def testCoreProjectXML_ReadLegacy11(tstPaths, fncPath, mockGUI, mockRnd):
@@ -540,8 +536,6 @@ def testCoreProjectXML_ReadLegacy11(tstPaths, fncPath, mockGUI, mockRnd):
copyfile(outFile, testFile) copyfile(outFile, testFile)
assert cmpFiles(testFile, compFile) assert cmpFiles(testFile, compFile)
# END Test testCoreProjectXML_ReadLegacy11
@pytest.mark.core @pytest.mark.core
def testCoreProjectXML_ReadLegacy12(tstPaths, fncPath, mockGUI, mockRnd): def testCoreProjectXML_ReadLegacy12(tstPaths, fncPath, mockGUI, mockRnd):
@@ -690,8 +684,6 @@ def testCoreProjectXML_ReadLegacy12(tstPaths, fncPath, mockGUI, mockRnd):
copyfile(outFile, testFile) copyfile(outFile, testFile)
assert cmpFiles(testFile, compFile) assert cmpFiles(testFile, compFile)
# END Test testCoreProjectXML_ReadLegacy12
@pytest.mark.core @pytest.mark.core
def testCoreProjectXML_ReadLegacy13(tstPaths, fncPath, mockGUI, mockRnd): def testCoreProjectXML_ReadLegacy13(tstPaths, fncPath, mockGUI, mockRnd):
@@ -840,8 +832,6 @@ def testCoreProjectXML_ReadLegacy13(tstPaths, fncPath, mockGUI, mockRnd):
copyfile(outFile, testFile) copyfile(outFile, testFile)
assert cmpFiles(testFile, compFile) assert cmpFiles(testFile, compFile)
# END Test testCoreProjectXML_ReadLegacy13
@pytest.mark.core @pytest.mark.core
def testCoreProjectXML_ReadLegacy14(tstPaths, fncPath, mockGUI, mockRnd): def testCoreProjectXML_ReadLegacy14(tstPaths, fncPath, mockGUI, mockRnd):
@@ -990,5 +980,3 @@ def testCoreProjectXML_ReadLegacy14(tstPaths, fncPath, mockGUI, mockRnd):
compFile = tstPaths.refDir / "projectXML_ReadLegacy14.nwx" compFile = tstPaths.refDir / "projectXML_ReadLegacy14.nwx"
copyfile(outFile, testFile) copyfile(outFile, testFile)
assert cmpFiles(testFile, compFile) assert cmpFiles(testFile, compFile)
# END Test testCoreProjectXML_ReadLegacy14
+5 -7
View File
@@ -20,18 +20,18 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from __future__ import annotations from __future__ import annotations
import pytest
from time import sleep
from pathlib import Path from pathlib import Path
from time import sleep
from tools import buildTestProject import pytest
from mocked import causeOSError
from novelwriter.constants import nwFiles from novelwriter.constants import nwFiles
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
from novelwriter.core.sessions import NWSessionLog from novelwriter.core.sessions import NWSessionLog
from tests.mocked import causeOSError
from tests.tools import buildTestProject
@pytest.mark.core @pytest.mark.core
def testCoreSessions_Main(monkeypatch, mockGUI, fncPath): def testCoreSessions_Main(monkeypatch, mockGUI, fncPath):
@@ -111,5 +111,3 @@ def testCoreSessions_Main(monkeypatch, mockGUI, fncPath):
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr("novelwriter.core.storage.NWStorage.getMetaFile", lambda *a: None) mp.setattr("novelwriter.core.storage.NWStorage.getMetaFile", lambda *a: None)
assert len(list(sessLog.iterRecords())) == 0 assert len(list(sessLog.iterRecords())) == 0
# END Test testCoreSessions_Main
+5 -10
View File
@@ -21,18 +21,19 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
from __future__ import annotations from __future__ import annotations
import sys import sys
import pytest
import enchant
from pathlib import Path from pathlib import Path
from tools import buildTestProject import enchant
from mocked import causeOSError import pytest
from novelwriter.constants import nwFiles from novelwriter.constants import nwFiles
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
from novelwriter.core.spellcheck import FakeEnchant, NWSpellEnchant, UserDictionary from novelwriter.core.spellcheck import FakeEnchant, NWSpellEnchant, UserDictionary
from tests.mocked import causeOSError
from tests.tools import buildTestProject
@pytest.mark.core @pytest.mark.core
def testCoreSpell_UserDictionary(monkeypatch, mockGUI, fncPath): def testCoreSpell_UserDictionary(monkeypatch, mockGUI, fncPath):
@@ -102,8 +103,6 @@ def testCoreSpell_UserDictionary(monkeypatch, mockGUI, fncPath):
userDict.load() userDict.load()
assert sorted(userDict) == ["bar", "foo"] assert sorted(userDict) == ["bar", "foo"]
# END Test testCoreSpell_UserDictionary
@pytest.mark.core @pytest.mark.core
def testCoreSpell_FakeEnchant(monkeypatch, mockGUI, fncPath): def testCoreSpell_FakeEnchant(monkeypatch, mockGUI, fncPath):
@@ -137,8 +136,6 @@ def testCoreSpell_FakeEnchant(monkeypatch, mockGUI, fncPath):
assert fkChk.suggest("whatchamajig") == [] assert fkChk.suggest("whatchamajig") == []
assert fkChk.add_to_session("whatchamajig") is None assert fkChk.add_to_session("whatchamajig") is None
# END Test testCoreSpell_FakeEnchant
@pytest.mark.core @pytest.mark.core
def testCoreSpell_Enchant(monkeypatch, mockGUI, fncPath): def testCoreSpell_Enchant(monkeypatch, mockGUI, fncPath):
@@ -189,5 +186,3 @@ def testCoreSpell_Enchant(monkeypatch, mockGUI, fncPath):
mp.setattr("enchant.Broker.request_dict", lambda *a: None) mp.setattr("enchant.Broker.request_dict", lambda *a: None)
spChk.setLanguage("en_US") spChk.setLanguage("en_US")
assert isinstance(spChk._enchant, FakeEnchant) assert isinstance(spChk._enchant, FakeEnchant)
# END Test testCoreSpell_Enchant
+2 -14
View File
@@ -22,13 +22,13 @@ from __future__ import annotations
import pytest import pytest
from tools import C
from PyQt5.QtGui import QColor, QIcon from PyQt5.QtGui import QColor, QIcon
from novelwriter.core.status import NWStatus, StatusEntry, _ShapeCache from novelwriter.core.status import NWStatus, StatusEntry, _ShapeCache
from novelwriter.enum import nwStatusShape from novelwriter.enum import nwStatusShape
from tests.tools import C
statusKeys = [C.sNew, C.sNote, C.sDraft, C.sFinished] statusKeys = [C.sNew, C.sNote, C.sDraft, C.sFinished]
importKeys = [C.iNew, C.iMinor, C.iMajor, C.iMain] importKeys = [C.iNew, C.iMinor, C.iMajor, C.iMain]
@@ -59,8 +59,6 @@ def testCoreStatus_StatusEntry():
assert other.icon is not icon # Not the same icon, but a copy assert other.icon is not icon # Not the same icon, but a copy
assert other.count == 42 assert other.count == 42
# END Test testCoreStatus_StatusEntry
@pytest.mark.core @pytest.mark.core
def testCoreStatus_Internal(mockGUI, mockRnd): def testCoreStatus_Internal(mockGUI, mockRnd):
@@ -116,8 +114,6 @@ def testCoreStatus_Internal(mockGUI, mockRnd):
assert nImport._checkKey("s654321") == "i00000b" # Status key not accepted assert nImport._checkKey("s654321") == "i00000b" # Status key not accepted
assert nImport._checkKey("i123456") == "i123456" # Import key accepted assert nImport._checkKey("i123456") == "i123456" # Import key accepted
# END Test testCoreStatus_Internal
@pytest.mark.core @pytest.mark.core
def testCoreStatus_Iterator(mockGUI, mockRnd): def testCoreStatus_Iterator(mockGUI, mockRnd):
@@ -162,8 +158,6 @@ def testCoreStatus_Iterator(mockGUI, mockRnd):
# Content : Count # Content : Count
assert [e.count for _, e in nStatus.iterItems()] == [0, 1, 2, 3] assert [e.count for _, e in nStatus.iterItems()] == [0, 1, 2, 3]
# END Test testCoreStatus_Iterator
@pytest.mark.core @pytest.mark.core
def testCoreStatus_Entries(mockGUI, mockRnd): def testCoreStatus_Entries(mockGUI, mockRnd):
@@ -309,8 +303,6 @@ def testCoreStatus_Entries(mockGUI, mockRnd):
assert list(nStatus._store.keys()) == [statusKeys[3], statusKeys[2]] assert list(nStatus._store.keys()) == [statusKeys[3], statusKeys[2]]
assert nStatus._default == statusKeys[3] assert nStatus._default == statusKeys[3]
# END Test testCoreStatus_Entries
@pytest.mark.core @pytest.mark.core
def testCoreStatus_Pack(mockGUI, mockRnd): def testCoreStatus_Pack(mockGUI, mockRnd):
@@ -362,8 +354,6 @@ def testCoreStatus_Pack(mockGUI, mockRnd):
}), }),
] ]
# END Test testCoreStatus_Pack
@pytest.mark.core @pytest.mark.core
def testCoreStatus_ShapeCache(): def testCoreStatus_ShapeCache():
@@ -413,5 +403,3 @@ def testCoreStatus_ShapeCache():
assert shapes.getShape(nwStatusShape.BLOCK_2) is block2 assert shapes.getShape(nwStatusShape.BLOCK_2) is block2
assert shapes.getShape(nwStatusShape.BLOCK_3) is block3 assert shapes.getShape(nwStatusShape.BLOCK_3) is block3
assert shapes.getShape(nwStatusShape.BLOCK_4) is block4 assert shapes.getShape(nwStatusShape.BLOCK_4) is block4
# END Test testCoreStatus_ShapeCache
+5 -20
View File
@@ -21,20 +21,21 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
from __future__ import annotations from __future__ import annotations
import json import json
import pytest
from pathlib import Path from pathlib import Path
from zipfile import ZipFile from zipfile import ZipFile
from mocked import causeOSError import pytest
from tools import C, buildTestProject
from novelwriter import CONFIG from novelwriter import CONFIG
from novelwriter.constants import nwFiles from novelwriter.constants import nwFiles
from novelwriter.core.document import NWDocument from novelwriter.core.document import NWDocument
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter
from novelwriter.core.storage import NWStorage, NWStorageOpen, NWStorageCreate, _LegacyStorage from novelwriter.core.storage import NWStorage, NWStorageCreate, NWStorageOpen, _LegacyStorage
from tests.mocked import causeOSError
from tests.tools import C, buildTestProject
class MockProject: class MockProject:
@@ -82,8 +83,6 @@ def testCoreStorage_CreateNewProject(mockGUI, fncPath):
project.closeProject() project.closeProject()
# END Test testCoreStorage_CreateNewProject
@pytest.mark.core @pytest.mark.core
def testCoreStorage_InitProjectStorage(monkeypatch, mockGUI, fncPath, mockRnd): def testCoreStorage_InitProjectStorage(monkeypatch, mockGUI, fncPath, mockRnd):
@@ -163,8 +162,6 @@ def testCoreStorage_InitProjectStorage(monkeypatch, mockGUI, fncPath, mockRnd):
project.closeProject() project.closeProject()
# END Test testCoreStorage_InitProjectStorage
@pytest.mark.core @pytest.mark.core
def testCoreStorage_InitProjectStorage_Invalid(mockGUI, fncPath): def testCoreStorage_InitProjectStorage_Invalid(mockGUI, fncPath):
@@ -202,8 +199,6 @@ def testCoreStorage_InitProjectStorage_Invalid(mockGUI, fncPath):
project.closeProject() project.closeProject()
# END Test testCoreStorage_InitProjectStorage_Invalid
@pytest.mark.core @pytest.mark.core
def testCoreStorage_LockFile(monkeypatch, fncPath): def testCoreStorage_LockFile(monkeypatch, fncPath):
@@ -265,8 +260,6 @@ def testCoreStorage_LockFile(monkeypatch, fncPath):
assert storage._clearLockFile() is True assert storage._clearLockFile() is True
assert not lockFilePath.exists() assert not lockFilePath.exists()
# END Test testCoreStorage_LockFile
@pytest.mark.core @pytest.mark.core
def testCoreStorage_ZipIt(monkeypatch, mockGUI, fncPath, tstPaths, mockRnd): def testCoreStorage_ZipIt(monkeypatch, mockGUI, fncPath, tstPaths, mockRnd):
@@ -301,8 +294,6 @@ def testCoreStorage_ZipIt(monkeypatch, mockGUI, fncPath, tstPaths, mockRnd):
project.closeProject() project.closeProject()
# END Test testCoreStorage_ZipIt
@pytest.mark.core @pytest.mark.core
def testCoreStorage_LegacyDataFolder(monkeypatch, fncPath): def testCoreStorage_LegacyDataFolder(monkeypatch, fncPath):
@@ -369,8 +360,6 @@ def testCoreStorage_LegacyDataFolder(monkeypatch, fncPath):
for c in "0123456789abcdef": for c in "0123456789abcdef":
assert (fncPath / "content" / f"{c}00000000000{c}.nwd").exists() assert (fncPath / "content" / f"{c}00000000000{c}.nwd").exists()
# END Test testCoreStorage_LegacyDataFolder
@pytest.mark.core @pytest.mark.core
def testCoreStorage_DeprecatedFiles(monkeypatch, fncPath): def testCoreStorage_DeprecatedFiles(monkeypatch, fncPath):
@@ -412,8 +401,6 @@ def testCoreStorage_DeprecatedFiles(monkeypatch, fncPath):
for depFile in remove: for depFile in remove:
assert not depFile.exists() assert not depFile.exists()
# END Test testCoreStorage_DeprecatedFiles
@pytest.mark.core @pytest.mark.core
def testCoreStorage_OldFormatConvert(monkeypatch, mockGUI, fncPath): def testCoreStorage_OldFormatConvert(monkeypatch, mockGUI, fncPath):
@@ -529,5 +516,3 @@ def testCoreStorage_OldFormatConvert(monkeypatch, mockGUI, fncPath):
"LABEL": [False, 267], "LABEL": [False, 267],
"LINE": [True, 40] "LINE": [True, 40]
} }
# END Test testCoreStorage_OldFormatConvert
-14
View File
@@ -129,8 +129,6 @@ def testCoreToHtml_ConvertHeaders(mockGUI):
html.doConvert() html.doConvert()
assert html.result == "<h2><a name='0000000000000:T0001'></a>Heading Two</h2>\n" assert html.result == "<h2><a name='0000000000000:T0001'></a>Heading Two</h2>\n"
# END Test testCoreToHtml_ConvertHeaders
@pytest.mark.core @pytest.mark.core
def testCoreToHtml_ConvertParagraphs(mockGUI): def testCoreToHtml_ConvertParagraphs(mockGUI):
@@ -301,8 +299,6 @@ def testCoreToHtml_ConvertParagraphs(mockGUI):
"text</b> here</p>\n" "text</b> here</p>\n"
) )
# END Test testCoreToHtml_ConvertParagraphs
@pytest.mark.core @pytest.mark.core
def testCoreToHtml_ConvertDirect(mockGUI): def testCoreToHtml_ConvertDirect(mockGUI):
@@ -447,8 +443,6 @@ def testCoreToHtml_ConvertDirect(mockGUI):
"<p style='margin-right: 40px;'>Some text ...</p>\n" "<p style='margin-right: 40px;'>Some text ...</p>\n"
) )
# END Test testCoreToHtml_ConvertDirect
@pytest.mark.core @pytest.mark.core
def testCoreToHtml_SpecialCases(mockGUI): def testCoreToHtml_SpecialCases(mockGUI):
@@ -521,8 +515,6 @@ def testCoreToHtml_SpecialCases(mockGUI):
"<p>Test text **<em>bold</em>** and more.</p>\n" "<p>Test text **<em>bold</em>** and more.</p>\n"
) )
# END Test testCoreToHtml_SpecialCases
@pytest.mark.core @pytest.mark.core
def testCoreToHtml_Save(mockGUI, fncPath): def testCoreToHtml_Save(mockGUI, fncPath):
@@ -619,8 +611,6 @@ def testCoreToHtml_Save(mockGUI, fncPath):
assert data["text"]["css"] == hStyle assert data["text"]["css"] == hStyle
assert len(data["text"]["html"]) == len(resText) assert len(data["text"]["html"]) == len(resText)
# END Test testCoreToHtml_Save
@pytest.mark.core @pytest.mark.core
def testCoreToHtml_Methods(mockGUI): def testCoreToHtml_Methods(mockGUI):
@@ -668,8 +658,6 @@ def testCoreToHtml_Methods(mockGUI):
html.setStyles(False) html.setStyles(False)
assert html.getStyleSheet() == [] assert html.getStyleSheet() == []
# END Test testCoreToHtml_Methods
@pytest.mark.core @pytest.mark.core
def testCoreToHtml_Format(mockGUI): def testCoreToHtml_Format(mockGUI):
@@ -726,5 +714,3 @@ def testCoreToHtml_Format(mockGUI):
"<a class='tag' href='#char=Bod'>Bod</a>, " "<a class='tag' href='#char=Bod'>Bod</a>, "
"<a class='tag' href='#char=Jane'>Jane</a>" "<a class='tag' href='#char=Jane'>Jane</a>"
) )
# END Test testCoreToHtml_Format
-35
View File
@@ -148,8 +148,6 @@ def testCoreToken_Setters(mockGUI):
tokens.setBlockIndent(60.0) tokens.setBlockIndent(60.0)
assert tokens._blockIndent == 10.0 assert tokens._blockIndent == 10.0
# END Test testCoreToken_Setters
@pytest.mark.core @pytest.mark.core
def testCoreToken_TextOps(monkeypatch, mockGUI, mockRnd, fncPath): def testCoreToken_TextOps(monkeypatch, mockGUI, mockRnd, fncPath):
@@ -236,8 +234,6 @@ def testCoreToken_TextOps(monkeypatch, mockGUI, mockRnd, fncPath):
with pytest.raises(NotImplementedError): with pytest.raises(NotImplementedError):
tokens.doConvert() tokens.doConvert()
# END Test testCoreToken_TextOps
@pytest.mark.core @pytest.mark.core
def testCoreToken_StripEscape(): def testCoreToken_StripEscape():
@@ -247,8 +243,6 @@ def testCoreToken_StripEscape():
assert stripEscape(text1) == "This is text with escapes: ** ~~ __" assert stripEscape(text1) == "This is text with escapes: ** ~~ __"
assert stripEscape(text2) == "This is text with escapes: ** ~~ __" assert stripEscape(text2) == "This is text with escapes: ** ~~ __"
# END Test testCoreToken_StripEscape
@pytest.mark.core @pytest.mark.core
def testCoreToken_HeaderFormat(mockGUI): def testCoreToken_HeaderFormat(mockGUI):
@@ -438,8 +432,6 @@ def testCoreToken_HeaderFormat(mockGUI):
] ]
assert tokens.allMarkdown[-1] == "##! Prologue\n\n" assert tokens.allMarkdown[-1] == "##! Prologue\n\n"
# END Test testCoreToken_HeaderFormat
@pytest.mark.core @pytest.mark.core
def testCoreToken_HeaderStyle(mockGUI): def testCoreToken_HeaderStyle(mockGUI):
@@ -701,8 +693,6 @@ def testCoreToken_HeaderStyle(mockGUI):
assert processStyle("#! My Novel\n", False) == Tokenizer.A_CENTRE | Tokenizer.A_PBB assert processStyle("#! My Novel\n", False) == Tokenizer.A_CENTRE | Tokenizer.A_PBB
assert processStyle("##! Prologue\n", False) == Tokenizer.A_NONE assert processStyle("##! Prologue\n", False) == Tokenizer.A_NONE
# END Test testCoreToken_HeaderStyle
@pytest.mark.core @pytest.mark.core
def testCoreToken_MetaFormat(mockGUI): def testCoreToken_MetaFormat(mockGUI):
@@ -800,8 +790,6 @@ def testCoreToken_MetaFormat(mockGUI):
(Tokenizer.T_EMPTY, 0, "", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 0, "", [], Tokenizer.A_NONE),
] ]
# END Test testCoreToken_MetaFormat
@pytest.mark.core @pytest.mark.core
def testCoreToken_MarginFormat(mockGUI): def testCoreToken_MarginFormat(mockGUI):
@@ -854,8 +842,6 @@ def testCoreToken_MarginFormat(mockGUI):
"Right-indent, right-aligned\n\n\n" "Right-indent, right-aligned\n\n\n"
) )
# END Test testCoreToken_MarginFormat
@pytest.mark.core @pytest.mark.core
def testCoreToken_ExtractFormats(mockGUI): def testCoreToken_ExtractFormats(mockGUI):
@@ -963,8 +949,6 @@ def testCoreToken_ExtractFormats(mockGUI):
(38, tokens.FMT_B_E, ""), (41, tokens.FMT_I_E, ""), (38, tokens.FMT_B_E, ""), (41, tokens.FMT_I_E, ""),
] ]
# END Test testCoreToken_ExtractFormats
@pytest.mark.core @pytest.mark.core
def testCoreToken_TextFormat(mockGUI): def testCoreToken_TextFormat(mockGUI):
@@ -1084,8 +1068,6 @@ def testCoreToken_TextFormat(mockGUI):
"Some **nested bold and _italic_ and ~~strikethrough~~ text** here\n\n" "Some **nested bold and _italic_ and ~~strikethrough~~ text** here\n\n"
) )
# END Test testCoreToken_TextFormat
@pytest.mark.core @pytest.mark.core
def testCoreToken_SpecialFormat(mockGUI): def testCoreToken_SpecialFormat(mockGUI):
@@ -1286,8 +1268,6 @@ def testCoreToken_SpecialFormat(mockGUI):
(Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE),
] ]
# END Test testCoreToken_SpecialFormat
@pytest.mark.core @pytest.mark.core
def testCoreToken_ProcessHeaders(mockGUI): def testCoreToken_ProcessHeaders(mockGUI):
@@ -1509,8 +1489,6 @@ def testCoreToken_ProcessHeaders(mockGUI):
tokens.tokenizeText() tokens.tokenizeText()
assert tokens._noSep is False assert tokens._noSep is False
# END Test testCoreToken_ProcessHeaders
@pytest.mark.core @pytest.mark.core
def testCoreToken_BuildOutline(mockGUI, ipsumText): def testCoreToken_BuildOutline(mockGUI, ipsumText):
@@ -1576,9 +1554,6 @@ def testCoreToken_BuildOutline(mockGUI, ipsumText):
} }
# END Test testCoreToken_BuildOutline
@pytest.mark.core @pytest.mark.core
def testCoreToken_CountStats(mockGUI, ipsumText): def testCoreToken_CountStats(mockGUI, ipsumText):
"""Test stats counter of the Tokenizer class.""" """Test stats counter of the Tokenizer class."""
@@ -1784,8 +1759,6 @@ def testCoreToken_CountStats(mockGUI, ipsumText):
"allWordChars": 3289, "textWordChars": 2990, "titleWordChars": 38 "allWordChars": 3289, "textWordChars": 2990, "titleWordChars": 38
} }
# END Test testCoreToken_CountStats
@pytest.mark.core @pytest.mark.core
def testCoreToken_SceneSeparators(mockGUI): def testCoreToken_SceneSeparators(mockGUI):
@@ -1937,8 +1910,6 @@ def testCoreToken_SceneSeparators(mockGUI):
"Text\n\n" "Text\n\n"
) )
# END Test testCoreToken_SceneSeparators
@pytest.mark.core @pytest.mark.core
def testCoreToken_HeaderVisibility(mockGUI): def testCoreToken_HeaderVisibility(mockGUI):
@@ -2051,8 +2022,6 @@ def testCoreToken_HeaderVisibility(mockGUI):
"Text\n\n" "Text\n\n"
) )
# END Test testCoreToken_HeaderVisibility
@pytest.mark.core @pytest.mark.core
def testCoreToken_CounterHandling(mockGUI): def testCoreToken_CounterHandling(mockGUI):
@@ -2138,8 +2107,6 @@ def testCoreToken_CounterHandling(mockGUI):
"Text\n\n" "Text\n\n"
) )
# END Test testCoreToken_CounterHandling
@pytest.mark.core @pytest.mark.core
def testCoreToken_HeadingFormatter(fncPath, mockGUI, mockRnd): def testCoreToken_HeadingFormatter(fncPath, mockGUI, mockRnd):
@@ -2245,5 +2212,3 @@ def testCoreToken_HeadingFormatter(fncPath, mockGUI, mockRnd):
# Chapter w/Fallback Focus # Chapter w/Fallback Focus
cFormat = f"Chapter {nwHeadFmt.CH_NUM}, Scene {nwHeadFmt.SC_NUM} - {nwHeadFmt.CHAR_FOCUS}" cFormat = f"Chapter {nwHeadFmt.CH_NUM}, Scene {nwHeadFmt.SC_NUM} - {nwHeadFmt.CHAR_FOCUS}"
assert formatter.apply(cFormat, "Hi Bob", 0) == "Chapter 2, Scene 3 - Focus" assert formatter.apply(cFormat, "Hi Bob", 0) == "Chapter 2, Scene 3 - Focus"
# END Test testCoreToken_HeadingFormatter
-10
View File
@@ -71,8 +71,6 @@ def testCoreToMarkdown_ConvertHeaders(mockGUI):
toMD.doConvert() toMD.doConvert()
assert toMD.result == "## Prologue\n\n" assert toMD.result == "## Prologue\n\n"
# END Test testCoreToMarkdown_ConvertHeaders
@pytest.mark.core @pytest.mark.core
def testCoreToMarkdown_ConvertParagraphs(mockGUI): def testCoreToMarkdown_ConvertParagraphs(mockGUI):
@@ -209,8 +207,6 @@ def testCoreToMarkdown_ConvertParagraphs(mockGUI):
"1. Footnote text A.\n\n" "1. Footnote text A.\n\n"
) )
# END Test testCoreToMarkdown_ConvertParagraphs
@pytest.mark.core @pytest.mark.core
def testCoreToMarkdown_ConvertDirect(mockGUI): def testCoreToMarkdown_ConvertDirect(mockGUI):
@@ -250,8 +246,6 @@ def testCoreToMarkdown_ConvertDirect(mockGUI):
toMD.doConvert() toMD.doConvert()
assert toMD.result == "\n\n" assert toMD.result == "\n\n"
# END Test testCoreToMarkdown_ConvertDirect
@pytest.mark.core @pytest.mark.core
def testCoreToMarkdown_Save(mockGUI, fncPath): def testCoreToMarkdown_Save(mockGUI, fncPath):
@@ -304,8 +298,6 @@ def testCoreToMarkdown_Save(mockGUI, fncPath):
toMD.saveMarkdown(saveFile) toMD.saveMarkdown(saveFile)
assert saveFile.read_text(encoding="utf-8") == "".join(resText) assert saveFile.read_text(encoding="utf-8") == "".join(resText)
# END Test testCoreToMarkdown_Save
@pytest.mark.core @pytest.mark.core
def testCoreToMarkdown_Format(mockGUI): def testCoreToMarkdown_Format(mockGUI):
@@ -317,5 +309,3 @@ def testCoreToMarkdown_Format(mockGUI):
assert toMD._formatKeywords("tag: Jane", toMD.A_NONE) == "**Tag:** Jane\n\n" assert toMD._formatKeywords("tag: Jane", toMD.A_NONE) == "**Tag:** Jane\n\n"
assert toMD._formatKeywords("tag: Jane, John", toMD.A_NONE) == "**Tag:** Jane, John\n\n" assert toMD._formatKeywords("tag: Jane, John", toMD.A_NONE) == "**Tag:** Jane, John\n\n"
assert toMD._formatKeywords("tag: Jane", toMD.A_Z_BTMMRG) == "**Tag:** Jane \n" assert toMD._formatKeywords("tag: Jane", toMD.A_Z_BTMMRG) == "**Tag:** Jane \n"
# END Test testCoreToMarkdown_Format
-25
View File
@@ -105,9 +105,6 @@ def testCoreToOdt_Init(mockGUI):
assert odt._xText.tag == _mkTag("office", "text") assert odt._xText.tag == _mkTag("office", "text")
# END Test testCoreToOdt_Init
@pytest.mark.core @pytest.mark.core
def testCoreToOdt_TextFormatting(mockGUI): def testCoreToOdt_TextFormatting(mockGUI):
"""Test formatting of paragraphs.""" """Test formatting of paragraphs."""
@@ -236,8 +233,6 @@ def testCoreToOdt_TextFormatting(mockGUI):
'</office:text>' '</office:text>'
) )
# END Test testCoreToOdt_TextFormatting
@pytest.mark.core @pytest.mark.core
def testCoreToOdt_ConvertHeaders(mockGUI): def testCoreToOdt_ConvertHeaders(mockGUI):
@@ -325,8 +320,6 @@ def testCoreToOdt_ConvertHeaders(mockGUI):
'</office:text>' '</office:text>'
) )
# END Test testCoreToOdt_ConvertHeaders
@pytest.mark.core @pytest.mark.core
def testCoreToOdt_ConvertParagraphs(mockGUI): def testCoreToOdt_ConvertParagraphs(mockGUI):
@@ -675,8 +668,6 @@ def testCoreToOdt_ConvertParagraphs(mockGUI):
'</office:text>' '</office:text>'
) )
# END Test testCoreToOdt_ConvertParagraphs
@pytest.mark.core @pytest.mark.core
def testCoreToOdt_ConvertDirect(mockGUI): def testCoreToOdt_ConvertDirect(mockGUI):
@@ -730,8 +721,6 @@ def testCoreToOdt_ConvertDirect(mockGUI):
'</office:text>' '</office:text>'
) )
# END Test testCoreToOdt_ConvertDirect
@pytest.mark.core @pytest.mark.core
def testCoreToOdt_SaveFlat(mockGUI, fncPath, tstPaths): def testCoreToOdt_SaveFlat(mockGUI, fncPath, tstPaths):
@@ -787,8 +776,6 @@ def testCoreToOdt_SaveFlat(mockGUI, fncPath, tstPaths):
copyfile(flatFile, testFile) copyfile(flatFile, testFile)
assert cmpFiles(testFile, compFile, ignoreStart=ODT_IGNORE) assert cmpFiles(testFile, compFile, ignoreStart=ODT_IGNORE)
# END Test testCoreToOdt_SaveFlat
@pytest.mark.core @pytest.mark.core
def testCoreToOdt_SaveFull(mockGUI, fncPath, tstPaths): def testCoreToOdt_SaveFull(mockGUI, fncPath, tstPaths):
@@ -867,8 +854,6 @@ def testCoreToOdt_SaveFull(mockGUI, fncPath, tstPaths):
assert cmpFiles(metaFile, metaComp, ignoreStart=ODT_IGNORE) assert cmpFiles(metaFile, metaComp, ignoreStart=ODT_IGNORE)
assert cmpFiles(stylFile, stylComp) assert cmpFiles(stylFile, stylComp)
# END Test testCoreToOdt_SaveFull
@pytest.mark.core @pytest.mark.core
def testCoreToOdt_Format(mockGUI): def testCoreToOdt_Format(mockGUI):
@@ -900,8 +885,6 @@ def testCoreToOdt_Format(mockGUI):
"Characters: Bod, Jane", [(0, ToOdt.FMT_B_B, ""), (11, ToOdt.FMT_B_E, "")] "Characters: Bod, Jane", [(0, ToOdt.FMT_B_B, ""), (11, ToOdt.FMT_B_E, "")]
) )
# END Test testCoreToOdt_Format
@pytest.mark.core @pytest.mark.core
def testCoreToOdt_ODTParagraphStyle(): def testCoreToOdt_ODTParagraphStyle():
@@ -1123,8 +1106,6 @@ def testCoreToOdt_ODTParagraphStyle():
assert aStyle.checkNew(oStyle) is True assert aStyle.checkNew(oStyle) is True
assert aStyle.getID() != oStyle.getID() assert aStyle.getID() != oStyle.getID()
# END Test testCoreToOdt_ODTParagraphStyle
@pytest.mark.core @pytest.mark.core
def testCoreToOdt_ODTTextStyle(): def testCoreToOdt_ODTTextStyle():
@@ -1248,8 +1229,6 @@ def testCoreToOdt_ODTTextStyle():
'</style:style></test>' '</style:style></test>'
) )
# END Test testCoreToOdt_ODTTextStyle
@pytest.mark.core @pytest.mark.core
def testCoreToOdt_XMLParagraph(): def testCoreToOdt_XMLParagraph():
@@ -1439,8 +1418,6 @@ def testCoreToOdt_XMLParagraph():
assert xmlPar.checkError() == (1, "1 char(s) were not written: 'AB'") assert xmlPar.checkError() == (1, "1 char(s) were not written: 'AB'")
# END Test testCoreToOdt_XMLParagraph
@pytest.mark.core @pytest.mark.core
def testCoreToOdt_MkTag(): def testCoreToOdt_MkTag():
@@ -1448,5 +1425,3 @@ def testCoreToOdt_MkTag():
assert _mkTag("office", "text") == "{urn:oasis:names:tc:opendocument:xmlns:office:1.0}text" assert _mkTag("office", "text") == "{urn:oasis:names:tc:opendocument:xmlns:office:1.0}text"
assert _mkTag("style", "text") == "{urn:oasis:names:tc:opendocument:xmlns:style:1.0}text" assert _mkTag("style", "text") == "{urn:oasis:names:tc:opendocument:xmlns:style:1.0}text"
assert _mkTag("blabla", "text") == "text" assert _mkTag("blabla", "text") == "text"
# END Test testCoreToOdt_MkTag
+6 -21
View File
@@ -20,20 +20,21 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from __future__ import annotations from __future__ import annotations
import pytest
import random import random
from pathlib import Path from pathlib import Path
from tools import C, buildTestProject import pytest
from mocked import causeOSError
from novelwriter.enum import nwItemClass, nwItemType, nwItemLayout
from novelwriter.common import isHandle from novelwriter.common import isHandle
from novelwriter.constants import nwFiles from novelwriter.constants import nwFiles
from novelwriter.core.item import NWItem from novelwriter.core.item import NWItem
from novelwriter.core.tree import NWTree
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
from novelwriter.core.tree import NWTree
from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType
from tests.mocked import causeOSError
from tests.tools import C, buildTestProject
@pytest.fixture(scope="function") @pytest.fixture(scope="function")
@@ -263,8 +264,6 @@ def testCoreTree_BuildTree(mockGUI, mockItems):
assert "a000000000003" not in tree assert "a000000000003" not in tree
assert tree.trashRoot is None assert tree.trashRoot is None
# END Test testCoreTree_BuildTree
@pytest.mark.core @pytest.mark.core
def testCoreTree_PackUnpack(mockGUI, mockItems): def testCoreTree_PackUnpack(mockGUI, mockItems):
@@ -292,8 +291,6 @@ def testCoreTree_PackUnpack(mockGUI, mockItems):
tree.unpack(packed) tree.unpack(packed)
assert tree.handles() == aHandles assert tree.handles() == aHandles
# END Test testCoreTree_PackUnpack
@pytest.mark.core @pytest.mark.core
def testCoreTree_CheckConsistency(caplog: pytest.LogCaptureFixture, mockGUI, fncPath, mockRnd): def testCoreTree_CheckConsistency(caplog: pytest.LogCaptureFixture, mockGUI, fncPath, mockRnd):
@@ -361,8 +358,6 @@ def testCoreTree_CheckConsistency(caplog: pytest.LogCaptureFixture, mockGUI, fnc
nHandle = project.tree.findRoot(nwItemClass.NOVEL) nHandle = project.tree.findRoot(nwItemClass.NOVEL)
assert project.tree[nHandle].itemName == "Recovered" # type: ignore assert project.tree[nHandle].itemName == "Recovered" # type: ignore
# END Test testCoreTree_CheckConsistency
@pytest.mark.core @pytest.mark.core
def testCoreTree_Methods(monkeypatch, mockGUI, mockItems): def testCoreTree_Methods(monkeypatch, mockGUI, mockItems):
@@ -442,8 +437,6 @@ def testCoreTree_Methods(monkeypatch, mockGUI, mockItems):
"c000000000001", "b000000000001", "a000000000001" "c000000000001", "b000000000001", "a000000000001"
] ]
# END Test testCoreTree_Methods
@pytest.mark.core @pytest.mark.core
def testCoreTree_MakeHandles(mockGUI): def testCoreTree_MakeHandles(mockGUI):
@@ -471,8 +464,6 @@ def testCoreTree_MakeHandles(mockGUI):
tHandle = tree._makeHandle() tHandle = tree._makeHandle()
assert tHandle == handles[3] assert tHandle == handles[3]
# END Test testCoreTree_MakeHandles
@pytest.mark.core @pytest.mark.core
def testCoreTree_Stats(mockGUI, mockItems): def testCoreTree_Stats(mockGUI, mockItems):
@@ -491,8 +482,6 @@ def testCoreTree_Stats(mockGUI, mockItems):
assert novelWords == 550 assert novelWords == 550
assert noteWords == 400 assert noteWords == 400
# END Test testCoreTree_Stats
@pytest.mark.core @pytest.mark.core
def testCoreTree_Reorder(caplog, mockGUI, mockItems): def testCoreTree_Reorder(caplog, mockGUI, mockItems):
@@ -526,8 +515,6 @@ def testCoreTree_Reorder(caplog, mockGUI, mockItems):
assert tree.handles() == bHandle assert tree.handles() == bHandle
assert "Handle 'stuff' in old tree order is not in new order" in caplog.text assert "Handle 'stuff' in old tree order is not in new order" in caplog.text
# END Test testCoreTree_Reorder
@pytest.mark.core @pytest.mark.core
def testCoreTree_ToCFile(monkeypatch, fncPath, mockGUI, mockItems): def testCoreTree_ToCFile(monkeypatch, fncPath, mockGUI, mockItems):
@@ -582,5 +569,3 @@ def testCoreTree_ToCFile(monkeypatch, fncPath, mockGUI, mockItems):
f"{pathB} NOVEL DOCUMENT Scene One\n" f"{pathB} NOVEL DOCUMENT Scene One\n"
f"{pathC} CHARACTER NOTE Jane Doe\n" f"{pathC} CHARACTER NOTE Jane Doe\n"
) )
# END Test testCoreTree_ToCFile
+2 -6
View File
@@ -20,10 +20,10 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from __future__ import annotations from __future__ import annotations
import pytest
from pathlib import Path from pathlib import Path
import pytest
from PyQt5.QtWidgets import QAction, QMessageBox from PyQt5.QtWidgets import QAction, QMessageBox
from novelwriter import SHARED from novelwriter import SHARED
@@ -49,8 +49,6 @@ def testDlgAbout_NWDialog(qtbot, monkeypatch, nwGUI):
msgAbout.close() msgAbout.close()
# END Test testDlgAbout_NWDialog
@pytest.mark.gui @pytest.mark.gui
def testDlgAbout_QtDialog(monkeypatch, nwGUI): def testDlgAbout_QtDialog(monkeypatch, nwGUI):
@@ -61,5 +59,3 @@ def testDlgAbout_QtDialog(monkeypatch, nwGUI):
# All it can do is check against a crash # All it can do is check against a crash
nwGUI.showAboutQtDialog() nwGUI.showAboutQtDialog()
nwGUI.mainMenu.aAboutQt.activate(QAction.Trigger) nwGUI.mainMenu.aAboutQt.activate(QAction.Trigger)
# END Test testDlgAbout_QtDialog
+2 -6
View File
@@ -23,10 +23,10 @@ from __future__ import annotations
import pytest import pytest
from PyQt5.QtCore import QItemSelectionModel from PyQt5.QtCore import QItemSelectionModel
from PyQt5.QtWidgets import QListWidgetItem, QDialog from PyQt5.QtWidgets import QDialog, QListWidgetItem
from novelwriter.dialogs.quotes import GuiQuoteSelect
from novelwriter.dialogs.editlabel import GuiEditLabel from novelwriter.dialogs.editlabel import GuiEditLabel
from novelwriter.dialogs.quotes import GuiQuoteSelect
@pytest.mark.gui @pytest.mark.gui
@@ -62,8 +62,6 @@ def testDlgOther_QuoteSelect(qtbot, monkeypatch, nwGUI):
# qtbot.stop() # qtbot.stop()
# END Test testDlgOther_QuoteSelect
@pytest.mark.gui @pytest.mark.gui
def testDlgOther_EditLabel(qtbot, monkeypatch): def testDlgOther_EditLabel(qtbot, monkeypatch):
@@ -81,5 +79,3 @@ def testDlgOther_EditLabel(qtbot, monkeypatch):
newLabel, dlgOk = GuiEditLabel.getLabel(None, text="Hello World") # type: ignore newLabel, dlgOk = GuiEditLabel.getLabel(None, text="Hello World") # type: ignore
assert dlgOk is False assert dlgOk is False
assert newLabel == "Hello World" assert newLabel == "Hello World"
# END Test testDlgOther_EditLabel
+2 -4
View File
@@ -22,13 +22,13 @@ from __future__ import annotations
import pytest import pytest
from tools import buildTestProject, C
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt
from novelwriter.dialogs.docmerge import GuiDocMerge from novelwriter.dialogs.docmerge import GuiDocMerge
from novelwriter.types import QtUserRole from novelwriter.types import QtUserRole
from tests.tools import C, buildTestProject
@pytest.mark.gui @pytest.mark.gui
def testDlgMerge_Main(qtbot, nwGUI, projPath, mockRnd): def testDlgMerge_Main(qtbot, nwGUI, projPath, mockRnd):
@@ -86,5 +86,3 @@ def testDlgMerge_Main(qtbot, nwGUI, projPath, mockRnd):
assert data["finalItems"] == [C.hChapterDoc, C.hSceneDoc] assert data["finalItems"] == [C.hChapterDoc, C.hSceneDoc]
# qtbot.stop() # qtbot.stop()
# END Test testDlgMerge_Main

Some files were not shown because too many files have changed in this diff Show More