diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml new file mode 100644 index 0000000..7c4409f --- /dev/null +++ b/.github/workflows/autofix.yml @@ -0,0 +1,36 @@ +# Ruff rewrites quote styles and capitalises docstrings without any help +# from a person, so a contributor should never have to. This hands those +# fixes to the autofix.ci app, which commits them to the pull request +# branch, forks included. The existing lint gate still reports any +# findings that ruff cannot fix. +# +# The filename and the workflow name are both fixed by autofix.ci, which +# uses them to identify the workflow it trusts. Renaming either one stops +# the app from accepting the patch. +name: autofix.ci # needed to securely identify the workflow + +on: + pull_request: + push: + branches: [develop, master] + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + autofix: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + persist-credentials: false + - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1 + with: + python-version: '3.13' + - run: uvx --with tox-uv tox -e ruff-fix + - uses: autofix-ci/action@c5b2d67aa2274e7b5a18224e8171550871fc7e4a # v1.3.4 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fc58ff4..2675fe5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -85,7 +85,13 @@ jobs: activate-environment: true - name: Install tox run: uv pip install '.[tox]' + - name: Apply Ruff fixes to pull requests + if: github.event_name == 'pull_request' + run: tox -e ruff-fix - name: Lint + env: + RUFF_OUTPUT_FORMAT: >- + ${{ github.event_name == 'pull_request' && 'github' || 'full' }} run: tox -e lint type-check: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 525e764..f9a274d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -142,3 +142,16 @@ Include: - Steps to reproduce - Expected versus actual behaviour - The statsd server you are sending to, if the problem is on the wire + +## Automatic formatting + +Pull requests apply Ruff fixes before the lint check. With the autofix.ci +app installed for this repository, those fixes are committed to the pull +request branch, including forks. Findings Ruff cannot fix still fail CI. +Push builds check the committed files without applying fixes. + +Apply the same fixes locally with: + +```console +uvx --with tox-uv tox -e ruff-fix +``` diff --git a/tox.ini b/tox.ini index c12a1ef..0ed58e7 100644 --- a/tox.ini +++ b/tox.ini @@ -37,6 +37,7 @@ commands = coverage lcov -o {toxworkdir}/coverage.lcov [testenv:lint] +pass_env = RUFF_OUTPUT_FORMAT description = Lint with ruff skip_install = true deps = ruff>=0.15.0 @@ -79,3 +80,13 @@ deps = .[docs] changedir = docs commands = sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html + + +[testenv:ruff-fix] +labels = fix +description = Apply the available Ruff fixes +skip_install = true +deps = ruff>=0.15.0 +commands = + ruff check --fix --exit-zero statsd tests conftest.py + ruff format statsd tests conftest.py