name: CI on: push: branches: ["**"] pull_request: branches: ["**"] jobs: lint: runs-on: ubuntu-latest # Custom image (see .gitea/ci-image/Dockerfile): the official # sagemath/sagemath image is amd64-only and this runner is arm64, and # ruff/pytest are baked in here so jobs don't reinstall them every run. container: image: gitea.piribauer.ch/julian/sage-ci:latest steps: - name: Checkout uses: actions/checkout@v4 - name: Preparse .sage files # Turns each *.sage file into real Python (*.sage.py) so ruff can # parse it, and prepends the `from sage.all import *` that `sage` # normally injects at runtime, so Sage's globals (ZZ, var, matrix, ...) # resolve instead of looking like undefined names. # # The conda-forge `sage` CLI has no `--preparse` flag (unlike the # classical sage script the image was originally written against), so # this calls the same preparser Sage itself uses, directly in Python. run: | python - <<'PYEOF' import pathlib from sage.repl.preparse import preparse_file for f in pathlib.Path(".").rglob("*.sage"): if f.parts and f.parts[0] == "playground": continue out = preparse_file(f.read_text()) f.with_suffix(f.suffix + ".py").write_text( "from sage.all import * # noqa: F401,F403\n" + out ) PYEOF - name: ruff check # --no-respect-gitignore: *.sage.py is gitignored (it's generated, see # the previous step) but that's exactly what we need to lint here. # `python` here is the conda env's own interpreter -- it already has # sage/ruff/pytest importable, `sage --python` isn't a real flag on # the conda-forge sage CLI. run: python -m ruff check --no-respect-gitignore . test: runs-on: ubuntu-latest needs: lint container: image: gitea.piribauer.ch/julian/sage-ci:latest steps: - name: Checkout uses: actions/checkout@v4 - name: Run tests run: python -m pytest tests/