diff --git a/.gitea/workflows/test-backend.yml b/.gitea/workflows/test-backend.yml index 739251c..43d8ef1 100644 --- a/.gitea/workflows/test-backend.yml +++ b/.gitea/workflows/test-backend.yml @@ -27,18 +27,27 @@ env: jobs: test-backend: runs-on: ubuntu-latest + # The floor `requires-python` declares and the newest release, so neither + # end of the supported range goes untested. + strategy: + fail-fast: false + matrix: + python-version: ["3.12", "3.14"] env: # Per run, so the `down -v` steps reach neither a dev stack nor a run # still going. Unique names cannot be recycled, hence the always-on # teardown below. COMPOSE_PROJECT_NAME: fluksio-app-ci-backend-${{ github.run_id }} + # uv would otherwise take a managed interpreter it already has over the + # one set up below. + UV_PYTHON: ${{ matrix.python-version }} steps: - name: Checkout uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: - python-version: "3.13" + python-version: ${{ matrix.python-version }} - name: Set up uv uses: astral-sh/setup-uv@v7 with: @@ -46,7 +55,9 @@ jobs: pyproject.toml backend/pyproject.toml uv.lock - - run: uv sync + # The extras too, as `make test-backend` does: the mail, MQTT and Influx + # tests import what only the `server` extra installs. + - run: uv sync --all-extras # Nothing to start: the suite names its own SQLite file in a temp # directory (backend/tests/__init__.py), the mail paths are patched, and # the flow engine falls back to in-memory state without a Redis host. diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 51c3733..dfbe63f 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -17,6 +17,7 @@ classifiers = [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Topic :: Home Automation", "Topic :: Scientific/Engineering", "Topic :: System :: Distributed Computing", diff --git a/development.md b/development.md index 6e2f00a..a43215a 100644 --- a/development.md +++ b/development.md @@ -173,7 +173,7 @@ contract between the two frontends, and that target is the only thing checking i ## CI `.gitea/workflows/` runs four jobs, each writing `.env` from `.env.example` first: -`test-backend.yml` (pytest, plus a check that both wheels build), `playwright.yml` (the e2e suite in +`test-backend.yml` (pytest on Python 3.12 and 3.14, plus a check that both wheels build), `playwright.yml` (the e2e suite in two shards, one compose project each, the browser loading the SPA from the nginx `frontend` service), `pre-commit.yml` (the hooks above, plus strict mypy, which they do not cover) and `test-compose.yml` (a smoke test that the production images actually come up). diff --git a/worker/pyproject.toml b/worker/pyproject.toml index 58850cf..fd344c6 100644 --- a/worker/pyproject.toml +++ b/worker/pyproject.toml @@ -17,6 +17,7 @@ classifiers = [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Topic :: Home Automation", "Topic :: Scientific/Engineering", "Topic :: System :: Distributed Computing",