Drop Python 3.9 (#2182)

This commit is contained in:
Veronica Berglyd Olsen
2025-01-11 19:02:08 +01:00
committed by GitHub
11 changed files with 16 additions and 32 deletions
+1 -1
View File
@@ -14,7 +14,7 @@ jobs:
testLinux: testLinux:
strategy: strategy:
matrix: matrix:
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] python-version: ["3.10", "3.11", "3.12", "3.13"]
fail-fast: false fail-fast: false
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
+1 -1
View File
@@ -40,7 +40,7 @@ documentation.
## Implementation ## Implementation
novelWriter is written with Python 3 (3.9+) using Qt5 and PyQt5 (5.15 only), and is released on novelWriter is written with Python 3 (3.10+) using Qt5 and PyQt5 (5.15 only), and is released on
Linux, Windows and macOS. It can in principle run on any Operating System that also supports Qt, Linux, Windows and macOS. It can in principle run on any Operating System that also supports Qt,
PyQt and Python. PyQt and Python.
+2 -2
View File
@@ -201,9 +201,9 @@ def main(sysArgs: list | None = None) -> GuiMain | None:
# Check Packages and Versions # Check Packages and Versions
errorData = [] errorData = []
errorCode = 0 errorCode = 0
if sys.hexversion < 0x030900f0: if sys.hexversion < 0x030a00f0:
errorData.append( errorData.append(
"At least Python 3.9 is required, found %s" % CONFIG.verPyString "At least Python 3.10 is required, found %s" % CONFIG.verPyString
) )
errorCode |= 0x04 errorCode |= 0x04
if CONFIG.verQtValue < 0x050f00: if CONFIG.verQtValue < 0x050f00:
+1 -4
View File
@@ -33,7 +33,7 @@ from collections.abc import Callable
from configparser import ConfigParser from configparser import ConfigParser
from datetime import datetime from datetime import datetime
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING, Any, Literal, TypeVar from typing import Any, Literal, TypeGuard, TypeVar
from urllib.parse import urljoin from urllib.parse import urljoin
from urllib.request import pathname2url from urllib.request import pathname2url
@@ -44,9 +44,6 @@ from novelwriter.constants import nwConst, nwLabels, nwUnicode, trConst
from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType
from novelwriter.error import logException from novelwriter.error import logException
if TYPE_CHECKING: # pragma: no cover
from typing import TypeGuard # Requires Python 3.10
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
_Type = TypeVar("_Type") _Type = TypeVar("_Type")
+1 -3
View File
@@ -60,9 +60,7 @@ NODE_FLAGS = Qt.ItemFlag.ItemIsEnabled
NODE_FLAGS |= Qt.ItemFlag.ItemIsSelectable NODE_FLAGS |= Qt.ItemFlag.ItemIsSelectable
NODE_FLAGS |= Qt.ItemFlag.ItemIsDropEnabled NODE_FLAGS |= Qt.ItemFlag.ItemIsDropEnabled
if TYPE_CHECKING: # pragma: no cover T_NodeData = str | QIcon | QFont | Qt.AlignmentFlag | None
# Requires Python 3.10
T_NodeData = str | QIcon | QFont | Qt.AlignmentFlag | None
class ProjectNode: class ProjectNode:
+1 -5
View File
@@ -30,7 +30,6 @@ from enum import Enum
from functools import partial from functools import partial
from pathlib import Path from pathlib import Path
from time import time from time import time
from typing import TYPE_CHECKING
from PyQt5.QtCore import QCoreApplication from PyQt5.QtCore import QCoreApplication
@@ -45,15 +44,12 @@ from novelwriter.core.options import OptionState
from novelwriter.core.projectdata import NWProjectData from novelwriter.core.projectdata import NWProjectData
from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLReadState from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLReadState
from novelwriter.core.sessions import NWSessionLog from novelwriter.core.sessions import NWSessionLog
from novelwriter.core.status import T_StatusKind, T_UpdateEntry
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 nwItemClass, nwItemLayout, nwItemType from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType
from novelwriter.error import logException from novelwriter.error import logException
if TYPE_CHECKING: # pragma: no cover
# Requires Python 3.10
from novelwriter.core.status import T_StatusKind, T_UpdateEntry
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
+3 -8
View File
@@ -29,7 +29,7 @@ import logging
import random import random
from collections.abc import Iterable from collections.abc import Iterable
from typing import TYPE_CHECKING, Literal from typing import Literal, TypeGuard
from PyQt5.QtCore import QPointF, Qt from PyQt5.QtCore import QPointF, Qt
from PyQt5.QtGui import QColor, QIcon, QPainter, QPainterPath, QPixmap, QPolygonF from PyQt5.QtGui import QColor, QIcon, QPainter, QPainterPath, QPixmap, QPolygonF
@@ -39,9 +39,6 @@ from novelwriter.common import simplified
from novelwriter.enum import nwStatusShape from novelwriter.enum import nwStatusShape
from novelwriter.types import QtPaintAntiAlias, QtTransparent from novelwriter.types import QtPaintAntiAlias, QtTransparent
if TYPE_CHECKING: # pragma: no cover
from typing import TypeGuard # Requires Python 3.10
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -65,10 +62,8 @@ class StatusEntry:
NO_ENTRY = StatusEntry("", QColor(0, 0, 0), nwStatusShape.SQUARE, QIcon(), 0) NO_ENTRY = StatusEntry("", QColor(0, 0, 0), nwStatusShape.SQUARE, QIcon(), 0)
if TYPE_CHECKING: # pragma: no cover T_UpdateEntry = list[tuple[str | None, StatusEntry]]
# Requires Python 3.10 T_StatusKind = Literal["s", "i"]
T_UpdateEntry = list[tuple[str | None, StatusEntry]]
T_StatusKind = Literal["s", "i"]
class NWStatus: class NWStatus:
+1 -2
View File
@@ -12,7 +12,6 @@ readme = {file = "setup/description_pypi.md", content-type = "text/markdown"}
license = {text = "GNU General Public License v3"} license = {text = "GNU General Public License v3"}
classifiers = [ classifiers = [
"Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.12",
@@ -25,7 +24,7 @@ classifiers = [
"Natural Language :: English", "Natural Language :: English",
"Topic :: Text Editors", "Topic :: Text Editors",
] ]
requires-python = ">=3.9" requires-python = ">=3.10"
dependencies = [ dependencies = [
"pyqt5>=5.15", "pyqt5>=5.15",
"pyenchant>=3.0.0", "pyenchant>=3.0.0",
+3 -3
View File
@@ -2,14 +2,14 @@ Source: novelwriter
Maintainer: Veronica Berglyd Olsen <code@vkbo.net> Maintainer: Veronica Berglyd Olsen <code@vkbo.net>
Section: text Section: text
Priority: optional Priority: optional
Build-Depends: dh-python, python3-setuptools, python3-all, debhelper (>= 9), python3 (>=3.9), python3-pyqt5 (>= 5.15), python3-enchant (>= 2.0) Build-Depends: dh-python, python3-setuptools, python3-all, debhelper (>= 9), python3 (>=3.10), python3-pyqt5 (>= 5.15), python3-enchant (>= 2.0)
Standards-Version: 4.5.1 Standards-Version: 4.5.1
Homepage: https://novelwriter.io Homepage: https://novelwriter.io
X-Python3-Version: >= 3.9 X-Python3-Version: >= 3.10
Package: novelwriter Package: novelwriter
Architecture: all Architecture: all
Depends: ${misc:Depends}, ${python3:Depends}, python3 (>=3.9), python3-pyqt5 (>= 5.15), python3-enchant (>= 2.0) Depends: ${misc:Depends}, ${python3:Depends}, python3 (>=3.10), python3-pyqt5 (>= 5.15), python3-enchant (>= 2.0)
Description: A markdown-like text editor for planning and writing novels Description: A markdown-like text editor for planning and writing novels
novelWriter is a plain text editor designed for writing novels assembled from novelWriter is a plain text editor designed for writing novels assembled from
many smaller text documents. It uses a minimal formatting syntax inspired by many smaller text documents. It uses a minimal formatting syntax inspired by
+1 -1
View File
@@ -10,7 +10,7 @@ synchronisation tools. All text is saved as plain text files with a meta data he
project structure is stored in a single project XML file, and other meta data is primarily saved as project structure is stored in a single project XML file, and other meta data is primarily saved as
JSON files. JSON files.
The application is written with Python 3 (3.9+) using Qt5 and PyQt5 (5.10+). It is developed on The application is written with Python 3 (3.10+) using Qt5 and PyQt5 (5.10+). It is developed on
Linux, but should in principle work fine on other operating systems as well as long as dependencies Linux, but should in principle work fine on other operating systems as well as long as dependencies
are met. It is regularly tested on Debian and Ubuntu Linux, Windows, and MacOS. are met. It is regularly tested on Debian and Ubuntu Linux, Windows, and MacOS.
+1 -2
View File
@@ -11,7 +11,6 @@ license_files = LICENSE.md
license = GNU General Public License v3 license = GNU General Public License v3
classifiers = classifiers =
Programming Language :: Python :: 3 :: Only Programming Language :: Python :: 3 :: Only
Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.10
Programming Language :: Python :: 3.11 Programming Language :: Python :: 3.11
Programming Language :: Python :: 3.12 Programming Language :: Python :: 3.12
@@ -30,7 +29,7 @@ project_urls =
[options] [options]
zip_safe = False zip_safe = False
python_requires = >=3.9 python_requires = >=3.10
include_package_data = True include_package_data = True
packages = find_namespace: packages = find_namespace:
install_requires = install_requires =