Skip to content

docs(lanes): settle this repo's lane-artifact root at docs/lanes/ (aof) #124

docs(lanes): settle this repo's lane-artifact root at docs/lanes/ (aof)

docs(lanes): settle this repo's lane-artifact root at docs/lanes/ (aof) #124

Workflow file for this run

name: CI
on:
push:
branches: [main]
pull_request:
jobs:
test:
name: pytest (${{ matrix.os }}, py${{ matrix.python-version }})
runs-on: ${{ matrix.os }}
# Typical runtime is ~20-30s. A hang must fail LOUDLY and fast, not sit
# burning runner time until the 6h default limit -- macOS minutes bill at
# 10x, and a job stuck at "in_progress" reads as "not done yet" rather
# than "broken", which is how a false green gets merged.
timeout-minutes: 10
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
# requires-python = ">=3.11" in pyproject.toml -- cover the floor
# and the latest supported minor.
python-version: ["3.11", "3.12"]
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: uv sync --all-extras --dev
- name: Run test suite
# No exclusions. The whole suite runs on every push and PR, on both
# platforms. If you are tempted to add a --deselect here, fix the test
# or fix the product instead -- an excluded test is a test nobody is
# watching, which is how a total macOS breakage (#247) shipped.
run: uv run pytest -q
integration:
name: pytest -m integration (${{ matrix.os }})
runs-on: ${{ matrix.os }}
# These fork real pty children. A pty child whose output is never drained
# can wedge unreapably on macOS (state ``?Es``), so this job is the most
# likely place in the repo for a hang to appear. Bound it.
timeout-minutes: 10
strategy:
fail-fast: false
matrix:
# No windows-latest here, deliberately. Every test this job selects
# (`-m integration`) forks a real child process and, in most of the
# files, allocates a real pty pair via the POSIX-only `pty`/`termios`
# stdlib modules -- there is no Windows equivalent of either
# mechanism. `test_ctrlc_functional_integration.py` and
# `test_terminal_echo_integration.py` already `pytest.skip(...,
# allow_module_level=True)` on win32 (they import `pty`/`termios` at
# module scope, so skipping is the only way to avoid a collection
# error). `test_stdout_offload_freeze_integration.py` calls
# `os.fork()` directly with no platform guard at all, and `os.fork`
# simply does not exist on Windows -- it fails with
# `AttributeError: module 'os' has no attribute 'fork'`
# (confirmed on a real windows-latest run, job id 94301234220).
# A Windows leg of this job would therefore either run zero tests
# (all skipped) or hard-fail on the one file missing a guard -- pure
# CI theatre, burning runner minutes to report a "green" (or "red")
# that says nothing about Windows support. If a genuinely
# cross-platform integration test is ever added to this job, add
# windows-latest back for it specifically.
os: [ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v5
with:
python-version: "3.12"
- name: Install dependencies
run: uv sync --all-extras --dev
- name: Run integration tests
# pyproject.toml sets `addopts = -m "not integration"`, so these tests
# -- the ones that fork a real pty child and probe real termios state
# -- are skipped by default and, before this job existed, ran nowhere.
# They are exactly the tests that guard the dedicated-tty-input
# mechanism, so they get their own job (POSIX only -- see the
# `matrix.os` comment above for why Windows is excluded).
run: uv run pytest -m integration -q