name: Tests permissions: contents: read on: pull_request: branches: [main] push: branches: [main] jobs: test: name: py${{ matrix.python-version }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] python-version: ["3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v7 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v7 with: python-version: ${{ matrix.python-version }} cache: pip cache-dependency-path: requirements-dev.txt - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements-dev.txt - name: Run tests run: python -m unittest discover -s tests -v coverage: name: coverage gate (85%) runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - uses: actions/setup-python@v7 with: python-version: "3.12" cache: pip cache-dependency-path: requirements-dev.txt - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements-dev.txt - name: Measure coverage run: | python -m coverage run -m unittest discover -s tests python -m coverage combine python -m coverage report --fail-under=85 lint: name: black and flake8 runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - uses: actions/setup-python@v7 with: python-version: "3.12" - run: pip install black flake8 - run: black --check . - run: flake8 . js-test: name: frontend modules runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 # Pure-JS frontend modules, tested with the runner's preinstalled Node - name: Run JS tests run: node --test tests/js/*.test.js