testsAndMisc/.github/workflows/python-tests.yml
Krzysztof kuhy Rudnicki c50be1ee7f
Some checks are pending
dependency freshness / dependencies on newest stable (push) Waiting to run
md-naming / markdown naming convention (push) Waiting to run
Pre-commit checks / pre-commit (${{ matrix.group }}) (mypy, mypy) (push) Waiting to run
Pre-commit checks / pre-commit (${{ matrix.group }}) (pylint, pylint) (push) Waiting to run
Pre-commit checks / pre-commit (${{ matrix.group }}) (rest, ) (push) Waiting to run
Pre-commit checks / pre-commit (${{ matrix.group }}) (shellcheck, shellcheck) (push) Waiting to run
Python tests / test (push) Waiting to run
Shell tests / shell-tests (push) Waiting to run
Shell tests / lib-tests (push) Waiting to run
Shell tests / arch-tests (push) Waiting to run
ci: split pre-commit into hook groups, uv installs, xdist, parallel shell jobs
Target: every push workflow <= 60 s. No check removed or weakened.

- Pre-commit checks (164 s): mypy, pylint and shellcheck each get a
  matrix job, everything else runs in `rest` with SKIP=<those three>
  (pytest-coverage stays skipped everywhere, as before). The full
  requirements.txt install (49 s, plus the SDL headers for a pygame
  source build) is replaced by `pre-commit pyyaml packaging` -- the only
  third-party imports of the language: system hooks. Per-group
  pre-commit cache with same-interpreter restore-keys; SDL headers only
  on a pylint env rebuild; zsh only in rest; shellcheck only in its group.
- Python tests (87 s): setup-uv with a cached wheel store instead of pip,
  pytest -n auto -q -p no:sugar (2051 tests, 100.00% under xdist locally
  across three seeds), apt install tried before `apt-get update`.
- Shell tests (63 s): the lib/tests runner loop moves to its own job so
  it overlaps with bats and the side-effect-free tests; runners still run
  sequentially within it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KFwA9nymhUdTrVF65kigTV
2026-09-27 08:44:09 +02:00

76 lines
3.2 KiB
YAML

name: Python tests
on:
push:
branches: [main]
paths:
- "python_pkg/lichess_bot/**"
- "python_pkg/**"
- "tests/**"
- "linux_configuration/tests/**"
# Both spellings: the root requirements.txt is a SYMLINK into meta/,
# and GitHub matches path filters against the changed path as git
# records it. Editing meta/requirements.txt therefore did NOT match
# "requirements.txt", so a dependency fix silently skipped this
# workflow and the red run stayed on an older commit.
- "requirements.txt"
- "meta/requirements.txt"
- "meta/requirements-test.txt"
- ".github/workflows/python-tests.yml"
pull_request:
branches: [main]
paths:
- "python_pkg/lichess_bot/**"
- "python_pkg/**"
- "tests/**"
- "linux_configuration/tests/**"
# Both spellings: the root requirements.txt is a SYMLINK into meta/,
# and GitHub matches path filters against the changed path as git
# records it. Editing meta/requirements.txt therefore did NOT match
# "requirements.txt", so a dependency fix silently skipped this
# workflow and the red run stayed on an older commit.
- "requirements.txt"
- "meta/requirements.txt"
- "meta/requirements-test.txt"
- ".github/workflows/python-tests.yml"
workflow_dispatch: {}
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.x"
# uv with a cached wheel store replaces pip + setup-python's pip cache.
# Keyed on meta/requirements-test.txt, not the root requirements.txt
# symlink: the key is hashed from the file at this path, and hashing a
# symlink is not the same as hashing its target.
- uses: astral-sh/setup-uv@v10.2.0
with:
enable-cache: true
cache-dependency-glob: meta/requirements-test.txt
# The runner image ships apt lists, so the install is tried against them
# first; `apt-get update` (~14 s of a 31 s step) runs only if that fails.
- name: Install system dependencies
run: |
set -euo pipefail
sudo apt-get install -y librsvg2-bin ||
{ sudo apt-get update && sudo apt-get install -y librsvg2-bin; }
rsvg-convert --version
# The TEST subset, not the full requirements.txt. This job runs pytest
# and nothing else, so the ~62 linters and formatters in the full list
# were pure install time. See meta/requirements-test.txt.
- name: Install dependencies
run: uv pip install --system -r meta/requirements-test.txt
# -n auto spreads the suite over every runner core (pytest-xdist is in
# requirements-test.txt; pytest-cov merges the workers' coverage):
# 26.8 s -> 13.8 s locally, same 2051 tests, same 100.00%. -q cancels
# the -v in pyproject's addopts, so 2000+ PASSED lines are not streamed
# to the log; -p no:sugar keeps pytest-sugar's redraws out of it too.
- name: Run pytest with coverage
run: >-
pytest -n auto -q -p no:sugar
--cov=python_pkg --cov-branch --cov-report=term-missing --cov-fail-under=100