AGENTS.md was a per-module tour of the code, which restated what the code says and had already drifted: it described the example as emitting three inputs when it emits five. It is now the conventions an agent cannot infer -- dora version, uv, ruff, numpy docstrings, the platform requirement, act, and what not to do -- and nothing else. The gotchas it carried are explained at their point of use in the code instead. pymarkdown lints the markdown, configured in pyproject.toml and run in CI beside ruff. It caught a fenced block with no language and an over-long table row. ruff's pydocstyle convention moves to numpy. GEMINI.md is removed.
90 lines
3.3 KiB
YAML
90 lines
3.3 KiB
YAML
# Three gates, none of which needs a camera or a display: the example dataflow
|
|
# still matches the typed contracts in the two dora-node.yml files, it still
|
|
# runs end to end, and the node's own unit tests pass.
|
|
#
|
|
# All three share one job on purpose. The work itself is trivial -- the unit
|
|
# tests take under a second -- and is dwarfed by preparing the runner, so
|
|
# splitting the gates across jobs mostly buys a second checkout and a second
|
|
# OpenCV install. A step that fails is still named in the log.
|
|
name: validate
|
|
|
|
# A pull request would otherwise run this twice on the same commit: once for
|
|
# the branch push and once for the PR.
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
pull_request:
|
|
|
|
env:
|
|
DORA_VERSION: v1.0.1
|
|
DORA_TARGET: x86_64-unknown-linux-gnu
|
|
|
|
jobs:
|
|
validate:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
# The opencv-python wheel links against libGL at import time, so cv2
|
|
# cannot even be imported on the bare runner image. This is the most
|
|
# expensive step in the job by a wide margin; see AGENTS.md for the
|
|
# headless-wheel alternative that would remove it.
|
|
- name: Install the OpenCV shared libraries
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y --no-install-recommends libgl1 libglib2.0-0
|
|
|
|
- uses: astral-sh/setup-uv@v5
|
|
with:
|
|
enable-cache: true
|
|
|
|
# The CLI is a single static binary pinned to DORA_VERSION, so the cache
|
|
# hit is exact and the download only happens when the version changes.
|
|
- name: Cache the dora CLI
|
|
id: dora-cache
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ~/.local/bin/dora
|
|
key: dora-cli-${{ env.DORA_VERSION }}-${{ env.DORA_TARGET }}
|
|
|
|
- name: Install the dora CLI
|
|
if: steps.dora-cache.outputs.cache-hit != 'true'
|
|
run: |
|
|
curl -fsSL -o dora-cli.tar.gz \
|
|
"https://github.com/dora-rs/dora/releases/download/${DORA_VERSION}/dora-cli-${DORA_TARGET}.tar.gz"
|
|
tar xzf dora-cli.tar.gz
|
|
mkdir -p "$HOME/.local/bin"
|
|
install -m 755 "dora-cli-${DORA_TARGET}/dora" "$HOME/.local/bin/dora"
|
|
rm -rf dora-cli.tar.gz "dora-cli-${DORA_TARGET}"
|
|
|
|
- name: Put the dora CLI on PATH
|
|
run: echo "$HOME/.local/bin" >> "$GITHUB_PATH"
|
|
|
|
- run: dora --version
|
|
|
|
# --locked fails if uv.lock is out of date with pyproject.toml, so a
|
|
# dependency change that was never locked cannot reach main.
|
|
- name: Install
|
|
run: uv sync --locked --group dev
|
|
|
|
- run: uv run ruff check .
|
|
|
|
- run: uv run pymarkdown scan *.md
|
|
|
|
- run: uv run pytest -q
|
|
|
|
# strict_types: true in the dataflow turns a type warning into a non-zero
|
|
# exit, so a mismatched annotation fails here rather than at runtime.
|
|
# Both nodes are path nodes with a manifest, so both contracts are
|
|
# injected and compared against each other.
|
|
- name: Validate the dataflow
|
|
run: dora validate dataflow.yml
|
|
|
|
# CI=true is already set by the runner, which keeps the viewer from trying
|
|
# to open a window; SOURCE_FRAMES bounds the source so the run ends on its
|
|
# own. Everything the dataflow needs is in the checkout.
|
|
- name: Run the dataflow headless
|
|
env:
|
|
SOURCE_FRAMES: 30
|
|
run: dora run dataflow.yml --uv
|