Spell check comments and docstrings

This commit is contained in:
Veronica Berglyd Olsen
2023-07-20 23:25:49 +02:00
parent e773884c29
commit 4dfa51855e
45 changed files with 122 additions and 175 deletions
+1 -1
View File
@@ -39,7 +39,7 @@ from novelwriter.config import Config
# - Digit 1,2 : Major Version (01-ff)
# - Digit 3,4 : Minor Version (01-ff)
# - Digit 5,6 : Patch Version (01-ff)
# - Digit 7 : Release Type (a: aplha, b: beta, c: candidate, f: final)
# - Digit 7 : Release Type (a: alpha, b: beta, c: candidate, f: final)
# - Digit 8 : Release Number (0-f)
#
# Example : Full Short Description
+1 -1
View File
@@ -257,7 +257,7 @@ def formatTime(t: int) -> str:
def simplified(text: str) -> str:
"""Take a string and strip leading and trailing whitespaces, and
replace all occurences of (multiple) whitespaces with a 0x20 space.
replace all occurrences of (multiple) whitespaces with a 0x20 space.
"""
return " ".join(str(text).strip().split())
+3 -3
View File
@@ -109,7 +109,7 @@ class Config:
# Size Settings
self._mainWinSize = [1200, 650] # Last size of the main GUI window
self._prefsWinSize = [700, 615] # Last size of the Preferences dialog
self._projLoadCols = [280, 60, 160] # Last columns withs of the Project Load dialog
self._projLoadCols = [280, 60, 160] # Last columns widths of the Project Load dialog
self._mainPanePos = [300, 800] # Last position of the main window splitter
self._viewPanePos = [500, 150] # Last position of the document viewer splitter
self._outlnPanePos = [500, 150] # Last position of the outline panel splitter
@@ -135,7 +135,7 @@ class Config:
self.autoSelect = True # Auto-select word when applying format with no selection
self.doJustify = False # Justify text
self.showTabsNSpaces = False # Show tabs and spaces in edior
self.showTabsNSpaces = False # Show tabs and spaces in editor
self.showLineEndings = False # Show line endings in editor
self.showMultiSpaces = True # Highlight multiple spaces in the text
@@ -781,7 +781,7 @@ class Config:
return checkVal
def _checkOptionalPackages(self):
"""Cheks if we have the optional packages used by some features.
"""Check if we have the optional packages used by some features.
"""
try:
import enchant # noqa: F401
+3 -3
View File
@@ -42,8 +42,8 @@ class nwConst:
FMT_DSTAMP = "%Y-%m-%d" # Date only format
# Various Hard Limits
MAX_DOCSIZE = 5000000 # Maxium size of a single document
MAX_BUILDSIZE = 10000000 # Maxium size of a project build
MAX_DOCSIZE = 5000000 # Maximum size of a single document
MAX_BUILDSIZE = 10000000 # Maximum size of a project build
# URLs
URL_WEB = "https://novelwriter.io"
@@ -358,7 +358,7 @@ class nwUnicode:
U_PERMIL = "\u2030" # Per mille sign
U_DEGREE = "\u00b0" # Degree symbol
U_MINUS = "\u2212" # Minus sign
U_TIMES = "\u00d7" # Multiplaction sign
U_TIMES = "\u00d7" # Multiplication sign
U_DIVIDE = "\u00f7" # Division sign
# Arrows
+1 -1
View File
@@ -493,7 +493,7 @@ class BuildCollection:
return
def builds(self) -> Iterable[tuple[str, str]]:
"""Iterate over all avaiable builds."""
"""Iterate over all available builds."""
for buildID in self._builds:
yield buildID, self._builds[buildID].get("name", "")
return
+1 -1
View File
@@ -309,7 +309,7 @@ class DocDuplicator:
class ProjectBuilder:
"""A class to build a new project from a set of user-defined
parameter provided by the New Projecty Wizard.
parameter provided by the New Project Wizard.
"""
def __init__(self, mainGui: GuiMain) -> None:
+1 -1
View File
@@ -87,7 +87,7 @@ class NWDocument:
def readDocument(self, isOrphan: bool = False) -> str | None:
"""Read the document specified by the handle set in the
contructor, capturing potential file system errors and parse
constructor, capturing potential file system errors and parse
meta data. If the document doesn't exist on disk, return an
empty string. If something went wrong, return None.
"""
+1 -1
View File
@@ -730,7 +730,7 @@ class TagsIndex:
class ItemIndex:
"""Core: Item Index Wrapper Class
A wrapper object holding the indexed items. This is a warapper
A wrapper object holding the indexed items. This is a wrapper
class around a single storage dictionary with a set of utility
functions for setting and accessing the index data. Each indexed
item is stored in an IndexItem object, which again holds an
+1 -1
View File
@@ -67,7 +67,7 @@ class NWProject(QObject):
self._storage = NWStorage(self) # The project storage handler
self._data = NWProjectData(self) # The project settings
self._tree = NWTree(self) # The project tree
self._index = NWIndex(self) # The projecty index
self._index = NWIndex(self) # The project index
self._session = NWSessionLog(self) # The session record
# Data Cache
+1 -1
View File
@@ -252,7 +252,7 @@ class NWProjectData:
return
def setEditTime(self, value: Any):
"""Set tyje edit time from last session."""
"""Set the edit time from last session."""
self._editTime = checkInt(value, 0)
self.theProject.setProjectChanged(True)
return
+4 -4
View File
@@ -97,12 +97,12 @@ class ProjectXMLReader:
1.4 Introduces a more compact format for storing items. All settings
aside from name are now attributes. This format also changes the
way satus and importance labels are stored. This format was only
way status and importance labels are stored. This format was only
a part of version 2.0 RC 1
1.5 The actual format released for 2.0. It moves last used handles
and title formats into a key/value format similar to auto-
replace, status and imporetance. It adds the heading value to
replace, status and importance. It adds the heading value to
the content item meta entry. It also moves meta data related to
the project or the content into their respective section nodes
as attributes. The id attribute was also added to the project.
@@ -452,7 +452,7 @@ class ProjectXMLReader:
def _parseDictKeyText(self, xItem: ET.Element) -> dict:
"""Parse a dictionary stored with key as an attribute and the
value as the text porperty.
value as the text property.
"""
result = {}
for xEntry in xItem:
@@ -462,7 +462,7 @@ class ProjectXMLReader:
def _parseDictTagText(self, xItem):
"""Parse a dictionary stored with key as the tag and the value
as the text porperty.
as the text property.
"""
return {xNode.tag: checkString(xNode.text, "") for xNode in xItem}
+1 -1
View File
@@ -66,7 +66,7 @@ class NWSessionLog:
##
def startSession(self):
"""Start the writng session."""
"""Start the writing session."""
self._start = time()
return
+2 -2
View File
@@ -110,7 +110,7 @@ class NWStorage:
"""
inPath = Path(path).resolve()
if inPath.is_file():
# The path should not point to an exisitng file,
# The path should not point to an existing file,
# but it can point to a folder containing files
inPath = inPath.parent
@@ -313,7 +313,7 @@ class NWStorage:
if not checkLegacy:
# The legacy content check is only needed for project folder
# storage, so if it is not expected to be that, there's no
# need for the remaning checks.
# need for the remaining checks.
return True
legacy = _LegacyStorage(self._project)
+1 -1
View File
@@ -147,7 +147,7 @@ class ToOdt(Tokenizer):
self._dLanguage = "en"
self._dCountry = "GB"
# Text Margings
# Text Margins
self._mTopTitle = "0.423cm"
self._mTopHead1 = "0.423cm"
self._mTopHead2 = "0.353cm"
+1 -1
View File
@@ -126,7 +126,7 @@ class NWTree:
return None
def pack(self) -> list[dict]:
"""Pack the content of the tree into a list of doctionaries of
"""Pack the content of the tree into a list of dictionaries of
items. In the order defined by the _treeOrder list.
"""
tree = []
+1 -1
View File
@@ -122,7 +122,7 @@ class NSwitchBox(QScrollArea):
def _bumpIndex(self):
"""Increase the index counter and make sure only the last
columns is stretcing.
columns is stretching.
"""
self._content.setRowStretch(self._index, 0)
self._content.setRowStretch(self._index + 1, 1)
+2 -2
View File
@@ -417,7 +417,7 @@ class GuiDocEditor(QTextEdit):
self.setDocumentChanged(False)
qApp.restoreOverrideCursor()
# This is a hack to fix invisble cursor on an empty document
# This is a hack to fix invisible cursor on an empty document
if self.document().characterCount() <= 1:
self.setPlainText("\n")
self.setPlainText("")
@@ -1001,7 +1001,7 @@ class GuiDocEditor(QTextEdit):
We need to intercept a few key sequences:
* The return and enter keys redirect here even if the search
box has focus. Since we need these keys to continue search,
we block any further interaction here while ithas focus.
we block any further interaction here while it has focus.
* The undo/redo/select all sequences bypass the docAction
pathway from the menu, so we redirect them back from here.
* We also handle automatic scrolling here.
+2 -2
View File
@@ -83,7 +83,7 @@ class GuiDocHighlighter(QSyntaxHighlighter):
def initHighlighter(self):
"""Initialise the syntax highlighter, setting all the colour
rules and building the regexes.
rules and building the RegExes.
"""
logger.debug("Setting up highlighting rules")
@@ -255,7 +255,7 @@ class GuiDocHighlighter(QSyntaxHighlighter):
##
def rehighlightByType(self, theType):
"""Loop through all blocks and rehighlight those of a given
"""Loop through all blocks and re-highlight those of a given
content type.
"""
qDoc = self.document()
+1 -1
View File
@@ -456,7 +456,7 @@ class GuiDocViewer(QTextBrowser):
theCursor.select(selMode)
if selMode == QTextCursor.BlockUnderCursor:
# This selection mode also selects the preceding oaragraph
# This selection mode also selects the preceding paragraph
# separator, which we want to avoid.
posS = theCursor.selectionStart()
posE = theCursor.selectionEnd()
+1 -1
View File
@@ -1,7 +1,7 @@
"""
novelWriter GUI Novel Tree
============================
GUI classe for the main window novel tree
GUI class for the main window novel tree
File History:
Created: 2020-12-20 [1.1rc1] GuiNovelTree
+1 -1
View File
@@ -281,7 +281,7 @@ class GuiOutlineToolBar(QToolBar):
return
def populateNovelList(self):
"""Relaod the content of the novel list.
"""Reload the content of the novel list.
"""
self.novelValue.updateList(includeAll=True)
return
+1 -1
View File
@@ -432,7 +432,7 @@ class GuiProjectToolBar(QWidget):
@pyqtSlot(str)
def _treeSelectionChanged(self, tHandle):
"""Toggle the visibility of the new item enties for novel
"""Toggle the visibility of the new item entries for novel
documents. They should only be visible if novel documents can
actually be added.
"""
+2 -2
View File
@@ -232,7 +232,7 @@ class GuiManuscript(QDialog):
def closeEvent(self, event):
"""Capture the user closing the window so we can save GUI
settings. We also check that we don't have a build settings
diralog open.
dialog open.
"""
self._saveSettings()
for obj in self.children():
@@ -430,7 +430,7 @@ class GuiManuscript(QDialog):
bItem = self._buildMap.get(build.buildID, None)
if isinstance(bItem, QListWidgetItem):
bItem.setText(build.name)
else: # Propbably a new item
else: # Probably a new item
self._updateBuildsList()
return
+1 -1
View File
@@ -133,7 +133,7 @@ def testBaseCommon_CheckBool():
assert checkBool(0, True) is False
assert checkBool(1, False) is True
# Inalid Integers
# Invalid Integers
assert checkBool(2, True) is True
assert checkBool(2, False) is False
+4 -8
View File
@@ -35,8 +35,7 @@ from novelwriter.constants import nwFiles
@pytest.mark.base
def testBaseConfig_Constructor(monkeypatch):
"""Test config contructor.
"""
"""Test config constructor."""
# Linux
with monkeypatch.context() as mp:
mp.setattr("sys.platform", "linux")
@@ -93,8 +92,7 @@ def testBaseConfig_Constructor(monkeypatch):
@pytest.mark.base
def testBaseConfig_InitLoadSave(monkeypatch, fncPath, tstPaths):
"""Test config intialisation.
"""
"""Test config initialisation."""
tstConf = Config()
confFile = fncPath / nwFiles.CONF_FILE
@@ -159,8 +157,7 @@ def testBaseConfig_InitLoadSave(monkeypatch, fncPath, tstPaths):
@pytest.mark.base
def testBaseConfig_Localisation(fncPath, tstPaths):
"""Test localisation.
"""
"""Test localisation."""
tstConf = Config()
tstConf.initConfig(confPath=fncPath, dataPath=fncPath)
@@ -198,8 +195,7 @@ def testBaseConfig_Localisation(fncPath, tstPaths):
@pytest.mark.base
def testBaseConfig_Methods(fncPath):
"""Check class methods.
"""
"""Check class methods."""
tstConf = Config()
tstConf.initConfig(confPath=fncPath, dataPath=fncPath)
+1 -1
View File
@@ -67,7 +67,7 @@ def testBaseError_Dialog(qtbot, monkeypatch, nwGUI):
def testBaseError_Handler(qtbot, monkeypatch, nwGUI):
"""Test the error handler. This test doesn'thave any asserts, but it
checks that the error handler handles potential exceptions. The test
will fail if excpetions are not handled.
will fail if exceptions are not handled.
"""
# Normal shutdown
with monkeypatch.context() as mp:
+2 -2
View File
@@ -387,12 +387,12 @@ def testCoreBuildSettings_Collection(monkeypatch, mockGUI, fncPath: Path, mockRn
assert len(builds) == 0
assert not buildsFile.exists()
# Greate a default build
# Create a default build
buildOne = BuildSettings()
buildOne.setName("Build One")
buildIDOne = buildOne.buildID
# Check that invalid type is ahndled
# Check that invalid type is handled
builds.setBuild(None) # type: ignore
assert len(builds) == 0
assert not buildsFile.exists()
+4 -4
View File
@@ -76,7 +76,7 @@ BUILD_CONF = {
@pytest.mark.core
def testCoreDocBuild_OpenDocument(monkeypatch, mockGUI, prjLipsum, fncPath, tstPaths):
"""Test builing an open document manuscript."""
"""Test building an open document manuscript."""
project = NWProject(mockGUI)
project.openProject(prjLipsum)
@@ -180,7 +180,7 @@ def testCoreDocBuild_OpenDocument(monkeypatch, mockGUI, prjLipsum, fncPath, tstP
@pytest.mark.core
def testCoreDocBuild_HTML(monkeypatch, mockGUI, prjLipsum, fncPath, tstPaths):
"""Test builing an HTML manuscript."""
"""Test building an HTML manuscript."""
project = NWProject(mockGUI)
project.openProject(prjLipsum)
@@ -250,7 +250,7 @@ def testCoreDocBuild_HTML(monkeypatch, mockGUI, prjLipsum, fncPath, tstPaths):
@pytest.mark.core
def testCoreDocBuild_Markdown(monkeypatch, mockGUI, prjLipsum, fncPath, tstPaths):
"""Test builing an Markdown manuscript."""
"""Test building an Markdown manuscript."""
project = NWProject(mockGUI)
project.openProject(prjLipsum)
@@ -320,7 +320,7 @@ def testCoreDocBuild_Markdown(monkeypatch, mockGUI, prjLipsum, fncPath, tstPaths
@pytest.mark.core
def testCoreDocBuild_NWD(monkeypatch, mockGUI, prjLipsum, fncPath, tstPaths):
"""Test builing a NWD manuscript."""
"""Test building a NWD manuscript."""
project = NWProject(mockGUI)
project.openProject(prjLipsum)
+10 -16
View File
@@ -35,7 +35,7 @@ from novelwriter.core.project import NWProject
@pytest.mark.core
def testCoreIndex_LoadSave(monkeypatch, prjLipsum, mockGUI, tstPaths):
"""Test core functionality of scaning, saving, loading and checking
"""Test core functionality of scanning, saving, loading and checking
the index cache file.
"""
projFile = prjLipsum / "meta" / nwFiles.INDEX_FILE
@@ -154,8 +154,7 @@ def testCoreIndex_LoadSave(monkeypatch, prjLipsum, mockGUI, tstPaths):
@pytest.mark.core
def testCoreIndex_ScanThis(mockGUI):
"""Test the tag scanner function scanThis.
"""
"""Test the tag scanner function scanThis."""
theProject = NWProject(mockGUI)
theIndex = theProject.index
@@ -281,8 +280,7 @@ def testCoreIndex_CheckThese(mockGUI, fncPath, mockRnd):
@pytest.mark.core
def testCoreIndex_ScanText(mockGUI, fncPath, mockRnd):
"""Check the index text scanner.
"""
"""Check the index text scanner."""
theProject = NWProject(mockGUI)
mockRnd.reset()
buildTestProject(theProject, fncPath)
@@ -503,8 +501,7 @@ def testCoreIndex_ScanText(mockGUI, fncPath, mockRnd):
@pytest.mark.core
def testCoreIndex_ExtractData(mockGUI, fncPath, mockRnd):
"""Check the index data extraction functions.
"""
"""Check the index data extraction functions."""
theProject = NWProject(mockGUI)
mockRnd.reset()
buildTestProject(theProject, fncPath)
@@ -591,7 +588,7 @@ def testCoreIndex_ExtractData(mockGUI, fncPath, mockRnd):
# getReferences
# =============
# Look up an ivalid handle
# Look up an invalid handle
theRefs = theIndex.getReferences("Not a handle")
assert theRefs["@pov"] == []
assert theRefs["@char"] == []
@@ -784,8 +781,7 @@ def testCoreIndex_ExtractData(mockGUI, fncPath, mockRnd):
@pytest.mark.core
def testCoreIndex_TagsIndex():
"""Check the TagsIndex class.
"""
"""Check the TagsIndex class."""
tagsIndex = TagsIndex()
assert tagsIndex._tags == {}
@@ -847,7 +843,7 @@ def testCoreIndex_TagsIndex():
# Pack Data
assert tagsIndex.packData() == content
# Delete the second key and a nomn-existant key
# Delete the second key and a non-existant key
del tagsIndex["Tag2"]
del tagsIndex["Tag4"]
assert "Tag1" in tagsIndex
@@ -944,8 +940,7 @@ def testCoreIndex_TagsIndex():
@pytest.mark.core
def testCoreIndex_ItemIndex(mockGUI, fncPath, mockRnd):
"""Check the ItemIndex class.
"""
"""Check the ItemIndex class."""
theProject = NWProject(mockGUI)
mockRnd.reset()
buildTestProject(theProject, fncPath)
@@ -981,7 +976,7 @@ def testCoreIndex_ItemIndex(mockGUI, fncPath, mockRnd):
# Add a heading to an invalid item
assert itemIndex.addItemHeading(C.hInvalid, 1, "H1", "Stuff") == "T0000"
# Set the remainig data values
# Set the remaining data values
itemIndex.setHeadingCounts(cHandle, "T0001", 60, 10, 2)
itemIndex.setHeadingSynopsis(cHandle, "T0001", "In the beginning ...")
itemIndex.setHeadingTag(cHandle, "T0001", "One")
@@ -1183,8 +1178,7 @@ def testCoreIndex_ItemIndex(mockGUI, fncPath, mockRnd):
@pytest.mark.core
def testCoreIndex_CountWords():
"""Test the word counter and the exclusion filers.
"""
"""Test the word counter and the exclusion filers."""
# Non-Text
assert countWords(None) == (0, 0, 0)
assert countWords(1234) == (0, 0, 0)
+9 -15
View File
@@ -38,8 +38,7 @@ from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLR
@pytest.mark.core
def testCoreProject_NewRoot(fncPath, tstPaths, mockGUI, mockRnd):
"""Check that new root folders can be added to the project.
"""
"""Check that new root folders can be added to the project."""
projFile = fncPath / "nwProject.nwx"
testFile = tstPaths.outDir / "coreProject_NewRoot_nwProject.nwx"
compFile = tstPaths.refDir / "coreProject_NewRoot_nwProject.nwx"
@@ -89,8 +88,7 @@ def testCoreProject_NewRoot(fncPath, tstPaths, mockGUI, mockRnd):
@pytest.mark.core
def testCoreProject_NewFileFolder(monkeypatch, fncPath, tstPaths, mockGUI, mockRnd):
"""Check that new files can be added to the project.
"""
"""Check that new files can be added to the project."""
projFile = fncPath / "nwProject.nwx"
testFile = tstPaths.outDir / "coreProject_NewFileFolder_nwProject.nwx"
compFile = tstPaths.refDir / "coreProject_NewFileFolder_nwProject.nwx"
@@ -163,8 +161,7 @@ def testCoreProject_NewFileFolder(monkeypatch, fncPath, tstPaths, mockGUI, mockR
@pytest.mark.core
def testCoreProject_Open(monkeypatch, caplog, mockGUI, fncPath, mockRnd):
"""Test opening a project.
"""
"""Test opening a project."""
theProject = NWProject(mockGUI)
mockRnd.reset()
buildTestProject(theProject, fncPath)
@@ -259,8 +256,7 @@ def testCoreProject_Open(monkeypatch, caplog, mockGUI, fncPath, mockRnd):
@pytest.mark.core
def testCoreProject_Save(monkeypatch, mockGUI, mockRnd, fncPath):
"""Test saving a project.
"""
"""Test saving a project."""
theProject = NWProject(mockGUI)
# Nothing to save
@@ -289,8 +285,7 @@ def testCoreProject_Save(monkeypatch, mockGUI, mockRnd, fncPath):
@pytest.mark.core
def testCoreProject_AccessItems(mockGUI, fncPath, mockRnd):
"""Test helper functions for the project folder.
"""
"""Test helper functions for the project folder."""
theProject = NWProject(mockGUI)
buildTestProject(theProject, fncPath)
@@ -354,8 +349,7 @@ def testCoreProject_AccessItems(mockGUI, fncPath, mockRnd):
@pytest.mark.core
def testCoreProject_StatusImport(mockGUI, fncPath, mockRnd):
"""Test the status and importance flag handling.
"""
"""Test the status and importance flag handling."""
theProject = NWProject(mockGUI)
mockRnd.reset()
buildTestProject(theProject, fncPath)
@@ -506,7 +500,7 @@ def testCoreProject_Methods(monkeypatch, mockGUI, fncPath, mockRnd):
assert theProject.data.spellLang is None
theProject.data.setSpellLang(None)
assert theProject.data.spellLang is None
theProject.data.setSpellLang("None") # Should be interpreded as None
theProject.data.setSpellLang("None") # Should be interpreted as None
assert theProject.data.spellLang is None
theProject.data.setSpellLang("en_GB")
assert theProject.data.spellLang == "en_GB"
@@ -589,7 +583,7 @@ def testCoreProject_OrphanedFiles(mockGUI, prjLipsum):
assert theProject.tree["636b6aa9b697b"] is None
# Add a file with non-existent parent
# This file will be renoved from the project on open
# This file will be removed from the project on open
oHandle = theProject.newFile("Oops", "b3643d0f92e32")
theProject.tree[oHandle].setParent("1234567890abc")
@@ -663,7 +657,7 @@ def testCoreProject_OrphanedFiles(mockGUI, prjLipsum):
def testCoreProject_Backup(monkeypatch, mockGUI, fncPath, tstPaths):
"""Test the automated backup feature of the project class. The test
creates a backup of the Minimal test project, and then unzips the
backupd file and checks that the project XML file is identical to
backup file and checks that the project XML file is identical to
the original file.
"""
theProject = NWProject(mockGUI)
+2 -3
View File
@@ -89,7 +89,7 @@ def testCoreProjectXML_ReadCurrent(monkeypatch, tstPaths, fncPath):
assert xmlReader.read(data, content) is False
assert xmlReader.state == XMLReadState.UNKNOWN_VERSION
# Check parsing of unkown sections
# Check parsing of unknown sections
writeFile(xmlFile, (
"<novelWriterXML fileVersion='1.5'>"
" <project>"
@@ -243,8 +243,7 @@ def testCoreProjectXML_ReadCurrent(monkeypatch, tstPaths, fncPath):
@pytest.mark.core
def testCoreProjectXML_ReadLegacy10(tstPaths, fncPath, mockRnd):
"""Test reading the version 1.0 XML file format.
"""
"""Test reading the version 1.0 XML file format."""
refFile = tstPaths.filesDir / "nwProject-1.0.nwx"
xmlFile = fncPath / "nwProject-1.0.nwx"
outFile = fncPath / "nwProject.nwx"
+1 -1
View File
@@ -41,7 +41,7 @@ def testCoreSessions_Main(monkeypatch, mockGUI, fncPath):
logFile = project.storage.getMetaFile(nwFiles.SESS_FILE)
assert isinstance(logFile, Path)
# Set some moch word counts
# Set some mock word counts
project.data.setInitCounts(50, 60)
project.data.setCurrCounts(160, 150)
+11 -20
View File
@@ -35,8 +35,7 @@ class BareTokenizer(Tokenizer):
@pytest.mark.core
def testCoreToken_Setters(mockGUI):
"""Test all the setters for the Tokenizer class.
"""
"""Test all the setters for the Tokenizer class."""
theProject = NWProject(mockGUI)
theToken = BareTokenizer(theProject)
@@ -133,8 +132,7 @@ def testCoreToken_Setters(mockGUI):
@pytest.mark.core
def testCoreToken_TextOps(monkeypatch, mockGUI, mockRnd, fncPath):
"""Test handling files and text in the Tokenizer class.
"""
"""Test handling files and text in the Tokenizer class."""
theProject = NWProject(mockGUI)
mockRnd.reset()
buildTestProject(theProject, fncPath)
@@ -212,7 +210,7 @@ def testCoreToken_TextOps(monkeypatch, mockGUI, mockRnd, fncPath):
"# Notes: Plot\n\n"
)
# Ckeck abstract method
# Check abstract method
with pytest.raises(NotImplementedError):
theToken.doConvert()
@@ -221,8 +219,7 @@ def testCoreToken_TextOps(monkeypatch, mockGUI, mockRnd, fncPath):
@pytest.mark.core
def testCoreToken_StripEscape():
"""Test the stripEscape helper function.
"""
"""Test the stripEscape helper function."""
text1 = "This is text with escapes: \\** \\~~ \\__"
text2 = "This is text with escapes: ** ~~ __"
assert stripEscape(text1) == "This is text with escapes: ** ~~ __"
@@ -233,8 +230,7 @@ def testCoreToken_StripEscape():
@pytest.mark.core
def testCoreToken_HeaderFormat(mockGUI):
"""Test the tokenization of header formats in the Tokenizer class.
"""
"""Test the tokenization of header formats in the Tokenizer class."""
theProject = NWProject(mockGUI)
theToken = BareTokenizer(theProject)
theToken.setKeepMarkdown(True)
@@ -437,8 +433,7 @@ def testCoreToken_HeaderFormat(mockGUI):
@pytest.mark.core
def testCoreToken_MetaFormat(mockGUI):
"""Test the tokenization of meta formats in the Tokenizer class.
"""
"""Test the tokenization of meta formats in the Tokenizer class."""
theProject = NWProject(mockGUI)
theToken = BareTokenizer(theProject)
theToken.setKeepMarkdown(True)
@@ -456,7 +451,7 @@ def testCoreToken_MetaFormat(mockGUI):
theToken.tokenizeText()
assert theToken.theMarkdown[-1] == "% A comment\n\n"
# Symopsis
# Synopsis
theToken._text = "%synopsis: The synopsis\n"
theToken.tokenizeText()
assert theToken._tokens == [
@@ -506,8 +501,7 @@ def testCoreToken_MetaFormat(mockGUI):
@pytest.mark.core
def testCoreToken_MarginFormat(mockGUI):
"""Test the tokenization of margin formats in the Tokenizer class.
"""
"""Test the tokenization of margin formats in the Tokenizer class."""
theProject = NWProject(mockGUI)
theToken = BareTokenizer(theProject)
theToken.setKeepMarkdown(True)
@@ -561,8 +555,7 @@ def testCoreToken_MarginFormat(mockGUI):
@pytest.mark.core
def testCoreToken_TextFormat(mockGUI):
"""Test the tokenization of text formats in the Tokenizer class.
"""
"""Test the tokenization of text formats in the Tokenizer class."""
theProject = NWProject(mockGUI)
theToken = BareTokenizer(theProject)
theToken.setKeepMarkdown(True)
@@ -683,8 +676,7 @@ def testCoreToken_TextFormat(mockGUI):
@pytest.mark.core
def testCoreToken_SpecialFormat(mockGUI):
"""Test the tokenization of special formats in the Tokenizer class.
"""
"""Test the tokenization of special formats in the Tokenizer class."""
theProject = NWProject(mockGUI)
theToken = BareTokenizer(theProject)
@@ -886,8 +878,7 @@ def testCoreToken_SpecialFormat(mockGUI):
@pytest.mark.core
def testCoreToken_ProcessHeaders(mockGUI):
"""Test the header and page parser of the Tokenizer class.
"""
"""Test the header and page parser of the Tokenizer class."""
theProject = NWProject(mockGUI)
theProject.data.setLanguage("en")
theProject._loadProjectLocalisation()
+5 -7
View File
@@ -29,7 +29,8 @@ from novelwriter.core.project import NWProject
@pytest.mark.core
def testCoreToMarkdown_ConvertFormat(mockGUI):
"""Test the tokenizer and converter chain using the ToMarkdown class.
"""Test the tokenizer and converter chain using the ToMarkdown
class.
"""
theProject = NWProject(mockGUI)
theMD = ToMarkdown(theProject)
@@ -157,8 +158,7 @@ def testCoreToMarkdown_ConvertFormat(mockGUI):
@pytest.mark.core
def testCoreToMarkdown_ConvertDirect(mockGUI):
"""Test the converter directly using the ToMarkdown class.
"""
"""Test the converter directly using the ToMarkdown class."""
theProject = NWProject(mockGUI)
theMD = ToMarkdown(theProject)
@@ -208,8 +208,7 @@ def testCoreToMarkdown_ConvertDirect(mockGUI):
@pytest.mark.core
def testCoreToMarkdown_Complex(mockGUI, fncPath):
"""Test the save method of the ToMarkdown class.
"""
"""Test the save method of the ToMarkdown class."""
theProject = NWProject(mockGUI)
theMD = ToMarkdown(theProject)
theMD._isNovel = True
@@ -261,8 +260,7 @@ def testCoreToMarkdown_Complex(mockGUI, fncPath):
@pytest.mark.core
def testCoreToMarkdown_Format(mockGUI):
"""Test all the formatters for the ToMarkdown class.
"""
"""Test all the formatters for the ToMarkdown class."""
theProject = NWProject(mockGUI)
theMD = ToMarkdown(theProject)
+8 -16
View File
@@ -36,8 +36,7 @@ from novelwriter.core.project import NWProject
@pytest.fixture(scope="function")
def mockItems(mockGUI, mockRnd):
"""Create a list of mock items.
"""
"""Create a list of mock items."""
theProject = NWProject(mockGUI)
itemA = NWItem(theProject)
@@ -113,8 +112,7 @@ def mockItems(mockGUI, mockRnd):
@pytest.mark.core
def testCoreTree_BuildTree(mockGUI, mockItems):
"""Test building a project tree from a list of items.
"""
"""Test building a project tree from a list of items."""
theProject = NWProject(mockGUI)
theTree = NWTree(theProject)
@@ -232,8 +230,7 @@ def testCoreTree_BuildTree(mockGUI, mockItems):
@pytest.mark.core
def testCoreTree_PackUnpack(mockGUI, mockItems):
"""Test packing and unpacking data.
"""
"""Test packing and unpacking data."""
theProject = NWProject(mockGUI)
theTree = NWTree(theProject)
@@ -262,8 +259,7 @@ def testCoreTree_PackUnpack(mockGUI, mockItems):
@pytest.mark.core
def testCoreTree_Methods(mockGUI, mockItems):
"""Test various class methods.
"""
"""Test various class methods."""
theProject = NWProject(mockGUI)
theTree = NWTree(theProject)
@@ -343,8 +339,7 @@ def testCoreTree_Methods(mockGUI, mockItems):
@pytest.mark.core
def testCoreTree_MakeHandles(mockGUI):
"""Test generating item handles.
"""
"""Test generating item handles."""
random.seed(42)
theProject = NWProject(mockGUI)
theTree = NWTree(theProject)
@@ -373,8 +368,7 @@ def testCoreTree_MakeHandles(mockGUI):
@pytest.mark.core
def testCoreTree_Stats(mockGUI, mockItems):
"""Test project stats methods.
"""
"""Test project stats methods."""
theProject = NWProject(mockGUI)
theTree = NWTree(theProject)
@@ -394,8 +388,7 @@ def testCoreTree_Stats(mockGUI, mockItems):
@pytest.mark.core
def testCoreTree_Reorder(caplog, mockGUI, mockItems):
"""Test changing tree order.
"""
"""Test changing tree order."""
theProject = NWProject(mockGUI)
theTree = NWTree(theProject)
@@ -430,8 +423,7 @@ def testCoreTree_Reorder(caplog, mockGUI, mockItems):
@pytest.mark.core
def testCoreTree_ToCFile(monkeypatch, tstPaths, mockGUI, mockItems):
"""Test writing the ToC.txt file.
"""
"""Test writing the ToC.txt file."""
theProject = NWProject(mockGUI)
theTree = NWTree(theProject)
+3 -5
View File
@@ -32,8 +32,7 @@ from novelwriter.dialogs.about import GuiAbout
@pytest.mark.gui
def testDlgAbout_NWDialog(qtbot, monkeypatch, nwGUI):
"""Test the novelWriter about dialogs.
"""
"""Test the novelWriter about dialogs."""
# NW About
nwGUI.mainTheme.themeName = "A Theme"
nwGUI.mainTheme.themeAuthor = "An Author"
@@ -72,12 +71,11 @@ def testDlgAbout_NWDialog(qtbot, monkeypatch, nwGUI):
@pytest.mark.gui
def testDlgAbout_QtDialog(monkeypatch, nwGUI):
"""Test the Qt about dialogs.
"""
"""Test the Qt about dialogs."""
monkeypatch.setattr(QMessageBox, "aboutQt", lambda *a, **k: None)
# Open About
# All it can do is check aigainst a crash
# All it can do is check against a crash
assert nwGUI.showAboutQtDialog() is True
nwGUI.mainMenu.aAboutQt.activate(QAction.Trigger)
+3 -6
View File
@@ -31,8 +31,7 @@ from novelwriter.dialogs.editlabel import GuiEditLabel
@pytest.mark.gui
def testDlgOther_QuoteSelect(qtbot, nwGUI):
"""Test the quote symbols dialog.
"""
"""Test the quote symbols dialog."""
nwQuot = GuiQuoteSelect(nwGUI)
nwQuot.show()
@@ -58,8 +57,7 @@ def testDlgOther_QuoteSelect(qtbot, nwGUI):
@pytest.mark.gui
def testDlgOther_Updates(qtbot, monkeypatch, nwGUI):
"""Test the check for updates dialog.
"""
"""Test the check for updates dialog."""
nwUpdate = GuiUpdates(nwGUI)
nwUpdate.show()
@@ -97,8 +95,7 @@ def testDlgOther_Updates(qtbot, monkeypatch, nwGUI):
@pytest.mark.gui
def testDlgOther_EditLabel(qtbot, monkeypatch):
"""Test the label editor dialog.
"""
"""Test the label editor dialog."""
monkeypatch.setattr(GuiEditLabel, "exec_", lambda *a: None)
with monkeypatch.context() as mp:
+2 -3
View File
@@ -29,8 +29,7 @@ from novelwriter.dialogs.editlabel import GuiEditLabel
@pytest.mark.gui
def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, projPath, mockRnd):
"""Test the split document tool.
"""
"""Test the split document tool."""
monkeypatch.setattr(GuiEditLabel, "getLabel", lambda *a, text: (text, True))
# Create a new project
@@ -64,7 +63,7 @@ def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, projPath, mockRnd):
nwSplit.show()
qtbot.addWidget(nwSplit)
# By default, only up to level three headinsg should be listed
# By default, only up to level three headings should be listed
assert nwSplit.splitLevel.currentData() == 3
assert nwSplit.listBox.count() == 11
+12 -23
View File
@@ -39,8 +39,7 @@ KEY_DELAY = 1
@pytest.mark.gui
def testGuiEditor_Init(qtbot, nwGUI, projPath, ipsumText, mockRnd):
"""Test initialising the editor.
"""
"""Test initialising the editor."""
# Open project
buildTestProject(nwGUI, projPath)
assert nwGUI.openDocument(C.hSceneDoc)
@@ -82,8 +81,7 @@ def testGuiEditor_Init(qtbot, nwGUI, projPath, ipsumText, mockRnd):
@pytest.mark.gui
def testGuiEditor_LoadText(qtbot, monkeypatch, caplog, nwGUI, projPath, ipsumText, mockRnd):
"""Test loading text into the editor.
"""
"""Test loading text into the editor."""
buildTestProject(nwGUI, projPath)
assert nwGUI.openDocument(C.hSceneDoc) is True
@@ -137,8 +135,7 @@ def testGuiEditor_LoadText(qtbot, monkeypatch, caplog, nwGUI, projPath, ipsumTex
@pytest.mark.gui
def testGuiEditor_SaveText(qtbot, monkeypatch, caplog, nwGUI, projPath, ipsumText, mockRnd):
"""Test saving text from the editor.
"""
"""Test saving text from the editor."""
buildTestProject(nwGUI, projPath)
assert nwGUI.openDocument(C.hSceneDoc) is True
@@ -154,7 +151,7 @@ def testGuiEditor_SaveText(qtbot, monkeypatch, caplog, nwGUI, projPath, ipsumTex
assert nwGUI.docEditor.saveText() is False
nwGUI.docEditor._nwItem = nwItem
# Unkown handle
# Unknown handle
nwGUI.docEditor._docHandle = "0123456789abcdef"
assert nwGUI.docEditor.saveText() is False
nwGUI.docEditor._docHandle = C.hSceneDoc
@@ -181,8 +178,7 @@ def testGuiEditor_SaveText(qtbot, monkeypatch, caplog, nwGUI, projPath, ipsumTex
@pytest.mark.gui
def testGuiEditor_MetaData(qtbot, nwGUI, projPath, mockRnd):
"""Test extracting various meta data and other values.
"""
"""Test extracting various meta data and other values."""
buildTestProject(nwGUI, projPath)
assert nwGUI.openDocument(C.hSceneDoc) is True
@@ -461,8 +457,7 @@ def testGuiEditor_Actions(qtbot, nwGUI, projPath, ipsumText, mockRnd):
@pytest.mark.gui
def testGuiEditor_Insert(qtbot, monkeypatch, nwGUI, projPath, ipsumText, mockRnd):
"""Test the document insert functions.
"""
"""Test the document insert functions."""
buildTestProject(nwGUI, projPath)
assert nwGUI.openDocument(C.hSceneDoc) is True
@@ -544,8 +539,7 @@ def testGuiEditor_Insert(qtbot, monkeypatch, nwGUI, projPath, ipsumText, mockRnd
@pytest.mark.gui
def testGuiEditor_TextManipulation(qtbot, monkeypatch, nwGUI, projPath, ipsumText, mockRnd):
"""Test the text manipulation functions.
"""
"""Test the text manipulation functions."""
buildTestProject(nwGUI, projPath)
assert nwGUI.openDocument(C.hSceneDoc) is True
@@ -751,8 +745,7 @@ def testGuiEditor_TextManipulation(qtbot, monkeypatch, nwGUI, projPath, ipsumTex
@pytest.mark.gui
def testGuiEditor_BlockFormatting(qtbot, monkeypatch, nwGUI, projPath, ipsumText, mockRnd):
"""Test the block formatting function.
"""
"""Test the block formatting function."""
buildTestProject(nwGUI, projPath)
assert nwGUI.openDocument(C.hSceneDoc) is True
@@ -1064,8 +1057,7 @@ def testGuiEditor_BlockFormatting(qtbot, monkeypatch, nwGUI, projPath, ipsumText
@pytest.mark.gui
def testGuiEditor_Tags(qtbot, nwGUI, projPath, ipsumText, mockRnd):
"""Test the document editor tags functionality.
"""
"""Test the document editor tags functionality."""
buildTestProject(nwGUI, projPath)
assert nwGUI.openDocument(C.hSceneDoc) is True
@@ -1123,8 +1115,7 @@ def testGuiEditor_Tags(qtbot, nwGUI, projPath, ipsumText, mockRnd):
@pytest.mark.gui
def testGuiEditor_WordCounters(qtbot, monkeypatch, nwGUI, projPath, ipsumText, mockRnd):
"""Test saving text from the editor.
"""
"""Test saving text from the editor."""
class MockThreadPool:
def __init__(self):
@@ -1204,8 +1195,7 @@ def testGuiEditor_WordCounters(qtbot, monkeypatch, nwGUI, projPath, ipsumText, m
@pytest.mark.gui
def testGuiEditor_Search(qtbot, monkeypatch, nwGUI, prjLipsum):
"""Test the document editor search functionality.
"""
"""Test the document editor search functionality."""
monkeypatch.setattr(GuiDocEditor, "hasFocus", lambda *a: True)
assert nwGUI.openProject(prjLipsum) is True
@@ -1413,8 +1403,7 @@ def testGuiEditor_Search(qtbot, monkeypatch, nwGUI, prjLipsum):
@pytest.mark.gui
def testGuiEditor_StaticMethods():
"""Test the document editor's static methods.
"""
"""Test the document editor's static methods."""
# Check the method that decides if it is allowed to insert a space
# before a colon using the French, Spanish, etc language feature
assert GuiDocEditor._allowSpaceBeforeColon("", "") is True
+2 -3
View File
@@ -34,8 +34,7 @@ from novelwriter.core.tohtml import ToHtml
@pytest.mark.gui
def testGuiViewer_Main(qtbot, monkeypatch, nwGUI, prjLipsum):
"""Test the document viewer.
"""
"""Test the document viewer."""
# Open project
assert nwGUI.openProject(prjLipsum)
@@ -135,7 +134,7 @@ def testGuiViewer_Main(qtbot, monkeypatch, nwGUI, prjLipsum):
nwGUI.docViewer.updateDocInfo("4c4f28287af27")
assert nwGUI.docViewer.docHeader.theTitle.text() == "Characters Test Title"
# Ttile without full path
# Title without full path
CONFIG.showFullPath = False
nwGUI.docViewer.updateDocInfo("4c4f28287af27")
assert nwGUI.docViewer.docHeader.theTitle.text() == "Test Title"
+1
View File
@@ -94,6 +94,7 @@ def testGuiMenu_EditFormat(qtbot, monkeypatch, nwGUI, prjLipsum):
# Block Formats
# =============
# cSpell:ignore Pellentesque erat nulla posuere commodo
assert nwGUI.docEditor.setCursorPosition(42)
# Header 1
+1 -1
View File
@@ -97,7 +97,7 @@ def testGuiNovelTree_TreeItems(qtbot, monkeypatch, nwGUI, projPath, mockRnd):
assert novelTree.selectedItems()[0] == topItem
assert novelView.getSelectedHandle() == (C.hTitlePage, "T0001")
# Refresh using the slot for the butoom
# Refresh using the slot for the button
novelBar._refreshNovelTree()
assert novelTree.topLevelItem(0).isSelected()
+4 -4
View File
@@ -454,7 +454,7 @@ def testGuiProjTree_PermanentlyDeleteItem(qtbot, caplog, monkeypatch, nwGUI, pro
assert C.hTitlePage not in theProject.tree
assert nwGUI.docEditor.docHandle() is None
# Deleting folder + files recursiely is ok
# Deleting folder + files recursively is ok
assert projTree.permanentlyDeleteItem(C.hChapterDir) is True
assert C.hChapterDir not in theProject.tree
assert C.hChapterDoc not in theProject.tree
@@ -509,7 +509,7 @@ def testGuiProjTree_EmptyTrash(qtbot, caplog, monkeypatch, nwGUI, projPath, mock
assert C.hChapterDoc not in theProject.tree
assert C.hSceneDoc not in theProject.tree
# Running Emtpy Trash again is cancelled due to empty folder
# Running Empty Trash again is cancelled due to empty folder
assert projTree.emptyTrash() is False
nwGUI.closeProject()
@@ -557,7 +557,7 @@ def testGuiProjTree_ContextMenu(qtbot, monkeypatch, nwGUI, projPath, mockRnd):
# No item under menu
assert projTree._openContextMenu(projTree.viewport().rect().bottomRight()) is False
# Generate the possible menu combinarions
# Generate the possible menu combinations
assert projTree._openContextMenu(itemPos(hTrashRoot)) is True
assert projTree._openContextMenu(itemPos(C.hNovelRoot)) is True
assert projTree._openContextMenu(itemPos(hNovelNote)) is True
@@ -936,7 +936,7 @@ def testGuiProjTree_Other(qtbot, monkeypatch, nwGUI, projPath, mockRnd):
# Send invalid handle
assert projTree.revealNewTreeItem(C.hInvalid) is False
# Try to add an oprhaned file to the tree
# Try to add an orphaned file to the tree
nHandle = nwGUI.theProject.newFile("Test", C.hNovelRoot)
nwGUI.theProject.tree[nHandle].setParent(None)
assert projTree.revealNewTreeItem(nHandle) is False
+1 -1
View File
@@ -349,7 +349,7 @@ def testGuiTheme_Icons(qtbot, caplog, monkeypatch, nwGUI, tstPaths):
assert isinstance(qIcon, QIcon)
assert qIcon.isNull() is True
# Load an icon, it is likelyu already cached
# Load an icon, it is likely already cached
qIcon = iconCache.getIcon("add")
assert isinstance(qIcon, QIcon)
assert qIcon.isNull() is False
+1 -1
View File
@@ -151,7 +151,7 @@ def testManuscript_Builds(qtbot: QtBot, nwGUI: GuiMain, projPath: Path):
@pytest.mark.gui
def testManuscript_Features(monkeypatch, qtbot: QtBot, nwGUI: GuiMain, projPath: Path):
"""Test other featurs of the GuiManuscript dialog."""
"""Test other features of the GuiManuscript dialog."""
buildTestProject(nwGUI, projPath)
nwGUI.openProject(projPath)