diff --git a/.github/workflows/mypy-type-check.yml b/.github/workflows/mypy-type-check.yml index 2950fbb2a..336c1de2c 100644 --- a/.github/workflows/mypy-type-check.yml +++ b/.github/workflows/mypy-type-check.yml @@ -18,7 +18,7 @@ jobs: strategy: matrix: - python-version: ["3.11", "3.12", "3.13"] + python-version: ["3.11", "3.12", "3.13", "3.14"] steps: diff --git a/.github/workflows/pip-install.yml b/.github/workflows/pip-install.yml index c13da9b44..f3bf7fee7 100644 --- a/.github/workflows/pip-install.yml +++ b/.github/workflows/pip-install.yml @@ -31,7 +31,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.11", "3.12", "3.13"] + python-version: ["3.11", "3.12", "3.13", "3.14"] os: [ubuntu-24.04, windows-latest, macos-latest] # Force UTF-8 everywhere (Windows is the one that really needs it) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 0fde8c9f7..23beaf373 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -20,7 +20,7 @@ jobs: strategy: fail-fast: true matrix: - python-version: ["3.11", "3.12", "3.13"] + python-version: ["3.11", "3.12", "3.13", "3.14"] steps: - uses: actions/checkout@v4 diff --git a/docs/installation.rst b/docs/installation.rst index 41d85e232..340afb5f8 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -59,7 +59,7 @@ MacPorts Installing Stable Release ========================= -Please note that TIAToolbox is currently tested with Python versions 3.11, 3.12, and 3.13. For the full range of supported Python versions, please refer to the package metadata (for example, the ``python_requires`` setting in ``setup.py`` or ``pyproject.toml``) +Please note that TIAToolbox is tested for Python versions 3.11, 3.12, 3.13 and 3.14. For the full range of supported Python versions, please refer to the package metadata (for example, the ``python_requires`` setting in ``setup.py`` or ``pyproject.toml``) Recommended ----------- diff --git a/requirements/requirements.conda.yml b/requirements/requirements.conda.yml index e1160bf51..b1b3e4d99 100644 --- a/requirements/requirements.conda.yml +++ b/requirements/requirements.conda.yml @@ -8,6 +8,6 @@ dependencies: - cython - pip>=20.0.2 - pixman>=0.39.0 - - python>=3.11, <=3.13 + - python>=3.11, <=3.14 - pip: - -r requirements.txt diff --git a/requirements/requirements.dev.conda.yml b/requirements/requirements.dev.conda.yml index fd8162d5b..6c6188b83 100644 --- a/requirements/requirements.dev.conda.yml +++ b/requirements/requirements.dev.conda.yml @@ -8,6 +8,6 @@ dependencies: - cython - pip>=20.0.2 - pixman>=0.39.0 - - python>=3.11, <=3.13 + - python>=3.11, <=3.14 - pip: - -r requirements_dev.txt diff --git a/requirements/requirements.win64.conda.yml b/requirements/requirements.win64.conda.yml index 3bf2d9484..fb84ea073 100644 --- a/requirements/requirements.win64.conda.yml +++ b/requirements/requirements.win64.conda.yml @@ -9,6 +9,6 @@ dependencies: - openjpeg>=2.4.0 - pip>=20.0.2 - pixman>=0.39.0 - - python>=3.11, <=3.13 + - python>=3.11, <=3.14 - pip: - -r requirements.txt diff --git a/requirements/requirements.win64.dev.conda.yml b/requirements/requirements.win64.dev.conda.yml index 48999206a..bc7f34d85 100644 --- a/requirements/requirements.win64.dev.conda.yml +++ b/requirements/requirements.win64.dev.conda.yml @@ -9,6 +9,6 @@ dependencies: - openjpeg>=2.4.0 - pip>=20.0.2 - pixman>=0.39.0 - - python>=3.11, <=3.13 + - python>=3.11, <=3.14 - pip: - -r requirements_dev.txt diff --git a/setup.py b/setup.py index 8f2302e3f..4736707cb 100644 --- a/setup.py +++ b/setup.py @@ -34,7 +34,7 @@ setup( author="TIA Centre", author_email="TIA@warwick.ac.uk", - python_requires=">=3.11, <3.14", + python_requires=">=3.11, <3.15", classifiers=[ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", @@ -43,6 +43,7 @@ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", ], description="Computational pathology toolbox developed by TIA Centre.", dependency_links=dependency_links, diff --git a/tests/test_app_bokeh.py b/tests/test_app_bokeh.py index 90a66e0b0..d49db0673 100644 --- a/tests/test_app_bokeh.py +++ b/tests/test_app_bokeh.py @@ -9,6 +9,7 @@ import multiprocessing import re import shutil +import sys import time import types from pathlib import Path @@ -225,8 +226,11 @@ def doc(data_path: dict[str, object]) -> Generator[Document, object, None]: p = multiprocessing.Process(target=run_app, daemon=True) p.start() # wait until server is ready + # Increase timeout for Python 3.14+ to account for stricter multiprocessing + timeout = 100 if sys.version_info >= (3, 14) else 10 start = time.time() url = f"http://127.0.0.1:{main.port}/tileserver/session_id" + while True: try: resp = requests.get(url, timeout=1) @@ -234,9 +238,9 @@ def doc(data_path: dict[str, object]) -> Generator[Document, object, None]: break except requests.RequestException: pass - if time.time() - start > 10: + if time.time() - start > timeout: p.terminate() - msg = f"Tileserver failed to start within 10s: {url}" + msg = f"Tileserver failed to start within {timeout}s: {url}" raise RuntimeError(msg) time.sleep(0.2)