Files
wildminder-ComfyUI-KEEP/.github/workflows/tests.yml
T
WildAi e7c08682d8 plan(P1): address review findings
Seven review findings of the P1 phase, each fixed at its root:

1. (high) The CI install list omitted PyYAML, but the vendored tree imports
   yaml eagerly (modules/deps/basicsr/utils/options.py:5), so the CI job
   failed on its first run. pyyaml is now installed and asserted by
   tests/test_ci_workflow.py.
2. (medium) tests/test_ci_workflow.py skipped the whole module without
   PyYAML. The module never skips now: a minimal indentation parser is the
   fallback, and it is cross-checked against the PyYAML parse.
3. (medium) Guard (e)'s self-test asserted that the tree still contains
   breakage (it would break exactly at P2.1). It now proves the guard
   instead; P2.1's work list is the scanner output and
   test_guard_e_flip_owner_covers_every_current_finding keeps plan and tree
   in sync.
4. (medium) The mock-fidelity tripwire skipped the comfy_api.latest
   symbols. Every mocked symbol is now checked against the real source
   (re-export / definition / instance attribute), including io.ComfyNode,
   ComfyExtension, ComfyAPI and ComfyAPISync, plus the reverse check that
   the mock invents nothing.
5. (low) The phase review listed committed work as outstanding and
   misstated the ruff ignore list; both are corrected.
6. (low) The reported whole-suite count was impossible; the phase review
   now carries the measured numbers.
7. (low) The root conftest installed the mocks unconditionally. The
   KEEP_NO_COMFY_MOCKS=1 opt-out lets the headless tier import the real
   comfy/comfy_api modules in-process.

tools/ci_env_sim.py runs the gate in an environment without the packages
the CI install list omits.
2026-10-23 16:34:37 +03:00

87 lines
2.9 KiB
YAML

name: tests
on:
push:
branches: [master, main, feat/v3-modernization]
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
# P1.5 - lint gate. ruff is pinned to a major version: an unpinned ruff
# drifts the pip cache and can turn a green branch red without a code change.
lint:
name: Lint (ruff)
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install ruff (pinned major)
run: |
python -m pip install --upgrade pip
python -m pip install "ruff==0.8.*"
- name: Lint
run: python -m ruff check .
# P1.5 - the test tiers of the modernization plan (section 4):
# unit | mock_integration | headless
# The headless tier needs a real ComfyUI checkout; COMFYUI_ROOT is empty
# here, so those tests skip themselves instead of failing.
test:
name: Test (python ${{ matrix.python-version }})
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]
python-version: ["3.10", "3.12", "3.13"]
runs-on: ${{ matrix.os }}
env:
COMFYUI_ROOT: ""
steps:
- name: Check out code
uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Cache pip (CPU torch wheel)
uses: actions/cache@v4
with:
path: ~/.cache/pip
key: pip-cpu-torch-${{ runner.os }}-${{ matrix.python-version }}-v1
restore-keys: |
pip-cpu-torch-${{ runner.os }}-${{ matrix.python-version }}-
- name: Install CPU-only torch and the test dependencies
run: |
python -m pip install --upgrade pip
# CPU wheels are ~200 MB instead of ~2.5 GB of CUDA.
# torchvision is a runtime dependency of the package
# (modules/keep_processor.py imports it).
python -m pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu
# numpy 2.4 has no 3.10 wheel -> pin <2.3 on the 3.10 job.
# tomli backs tomllib on python 3.10.
if [ "${{ matrix.python-version }}" = "3.10" ]; then
python -m pip install "numpy<2.3" tomli
else
python -m pip install numpy
fi
# PyYAML: the vendored tree imports it eagerly
# (modules/deps/basicsr/utils/options.py:5 -> basicsr/utils/__init__.py:8),
# so the unit tier fails with "No module named 'yaml'" without it.
python -m pip install opencv-python-headless einops scipy Pillow tqdm pytest pyyaml
- name: Run the unit, mock_integration and headless tiers
run: python -m pytest -q -m "unit or mock_integration or headless"