Gradually formatting your codebase with black
I’ve just created my first Github Action: https://github.com/rocioar/gradual-black-formatter. It’s called “Gradual Black Formatter”, and it allows you to gradually format your code using black via Github Actions.
If your codebase is small and well tested, this Github Action would be of no use to you, as you could just format your code on a single PR. On the other hand, if you have a big enough codebase in which making a big PR with lots of formatting changes is a risk. Then look no further.
How does it work?⌗
The Github Action just does one thing: runs black on the x least recently modified files.
Example action that runs black on the 10 least recently modified files:
- name: Apply Black Gradually
uses: rocioar/gradual-black-formatter@v1
with:
number_of_files: 10
ignore_files_regex: *test*,*migrations*
As you can see on the example above, it accepts two parameters:
number_of_files
to indicate how many files you wantblack
to format each time.ignore_files_regex
to indicate the files you want to ignore, if any. You might want to exclude tests since they are low-risk and you could make a single PR to format all tests at once.
How can I use it on my project?⌗
To use it, you can combine it with a few other actions to accomplish the following workflow:
- Checkout the code
- Apply Black to x files
- Commit the code to a branch
- Send a PR
Here is an example workflow that uses actions/checkout@v2 to checkout the code and peter-evans/create-pull-request@v2 to make a commit and create a PR:
name: Apply Black Gradually
on:
pull_request:
types: [closed]
jobs:
apply-black:
if: github.head_ref == 'black'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
ref: master
fetch-depth: 0
- name: Apply Black Gradually
id: black
uses: rocioar/gradual-black-formatter@v1
with:
number_of_files: 3
ignore_files_regex: *test*,*migrations*
- name: Create Pull Request
uses: peter-evans/create-pull-request@v2
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: Apply black to ${{ steps.black.outputs.number_of_modified_files }} files
committer: GitHub <noreply@github.com>
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
title: Apply black to ${{ steps.black.outputs.number_of_modified_files }} files
body: "Auto-generated PR that applies black to: ${{ steps.black.outputs.modified_file_names }}."
branch: black
Important Note
If you want the files to be formatted in order starting from the least recently modified files, make sure you pass fetch-depth: 0
to the checkout action so that all the revision history is retrieved.
When will the action be executed?⌗
As configured on the example above the action will be executed every time a PR to the black
branch is closed.
To start it off, you can make a PR with the workflow to the black
branch, once you merge it, the process will start:
- The action will create a PR with the formatted files.
- You will review the PR and merge it.
- It will go back to step 1 until all files have been formatted.
On the following image you can see an example of a PR that was created by the action:
Wrapping up⌗
Formatting your code with black
will make your codebase more consistent, and help you avoid many derails during code reviews. This Github Action will help you format your code with the least disruption.