Skip to content

Use Ruff formatting and linting. Install configuration moved to pyproject.toml #2799

Use Ruff formatting and linting. Install configuration moved to pyproject.toml

Use Ruff formatting and linting. Install configuration moved to pyproject.toml #2799

# Run static tests for code quality: Isort, ruff (formatting and linting), mypy.
name: Static tests
# Controls when the action will run. Triggers the workflow on push or pull request
# events for the main and develop branches
on:
workflow_dispatch:
# run jobs manually
push:
branches:
- develop
- main
pull_request:
branches:
- develop
- main
schedule:
# Do a nightly run of the tests
- cron: '0 1 * * *'
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# Assert no docs/ directory on branches main and develop for conflict-free downstream
# https://stackoverflow.com/questions/70708306/github-actions-run-step-job-in-a-workflow-if-changes-happen-in-specific-folde
no_docs_on_develop_and_main:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dorny/paths-filter@v3
id: filter
with:
filters: |
docs:
- 'docs/**'
- name: assert no docs/ directory on branches 'develop' and 'main'
if: steps.filter.outputs.docs == 'true'
run: echo "::error::No 'docs/' directory allowed on branches 'develop' and 'main'." && exit 1
# Assert successful build and proper code layout
build:
name: Static tests
# The type of runner that the job will run on
runs-on: ubuntu-latest
# https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#specifying-a-python-version
strategy:
matrix:
# Run the tests only on the latest supported Python version.
python-version: ["3.13"]
# Complete all versions in matrix even if one fails.
fail-fast: false
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it.
- uses: actions/checkout@v4
- name: Setup Python ${{ matrix.python-version}}
uses: actions/setup-python@v5
with:
# Version range or exact version of a Python version to use, using SemVer's version range syntax.
python-version: ${{ matrix.python-version}}
architecture: x64
cache: 'pip'
# Cache pip dependencies
# Source: https://github.com/actions/cache/blob/main/examples.md#python---pip
- name: Cache dependencies
uses: actions/cache@v4
id: cache
with:
path: ${{ env.pythonLocation }}
key: ${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml') }}
- name: Cache mypy
uses: actions/cache@v4
id: cache-mypy
with:
path: mypy-cache-${{ matrix.python-version}}
key: ${{ runner.os }}-mypy
# Install the dependencies, which is needed to make mypy happy. Unravelling of the
# second command: The expression in the angular brackets is a python command that
# fetches the dependencies section in pyproject.toml; this is then made available to
# pip via -r. Option --no-bulid-isolation makes pip not use an isolated environment
# for the install (hence the installed packages are sure to be available also after
# the build), while --no-deps will only install the specified packages (in this
# case, the dependencies of PorePy). The third line similarly installs the
# development dependencies.
#
# Thanks, copilot!
- name: Install requirements
run: |
pip install -U pip
pip install toml
pip install --no-build-isolation --no-deps -r <(python -c "import toml; print('\n'.join(toml.load('pyproject.toml')['project']['dependencies']))")
pip install --no-build-isolation --no-deps -r <(python -c "import toml; print('\n'.join(toml.load('pyproject.toml')['project']['optional-dependencies']['development']))")
pip freeze
# Run the various checks
- name: Ruff linting
if: ${{ always() }}
run: ruff check src
- name: Ruff formatting
if: ${{always()}}
run: ruff format --check src
# EK note to self: Ruff may introduce sorting of imports in the future, if so, we
# we should use that instead of isort.
- name: isort
if: ${{ always() }}
run: isort src
- name: mypy
if: ${{ always() }}
run: mypy src --cache-dir mypy-cache-${{ matrix.python-version}}