name: CI # `paths-ignore` keeps doc-only / website / README / CHANGELOG churn from # burning runner minutes. Source / config / workflow changes always run. # `workflow_dispatch` gives a manual re-run button for flake debugging. on: push: branches: [main] paths-ignore: - "README.md" - "CHANGELOG.md" - "AGENTS.md" - "ROADMAP.md" - "website/**" - "docs/**" - "assets/**" - "deploy/**/README.md" - "**/*.md" - "**/*.mdx" pull_request: branches: [main] paths-ignore: - "README.md" - "CHANGELOG.md" - "AGENTS.md" - "ROADMAP.md" - "website/**" - "docs/**" - "assets/**" - "deploy/**/README.md" - "**/*.md" - "**/*.mdx" workflow_dispatch: # Cancel in-flight PR runs when a force-push lands. Keep push runs to # protect against partial state on main. concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: test: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: pip install -e ".[dev]" - name: Run tests run: pytest tests/ -v --tb=short - name: Build package run: | pip install build python -m build