Improve the Code Quality in Python Projects using Pre-Commit Hooks
Pre-commit hooks help identify simple issues before submission to code review.
Let’s say you’re working on a group project and wanted to enforce a specific code style check, in this case, Black code-formatter. Usually, when doing the project alone, you do that manually or automatically using your IDE plugins. But when you’re doing that with other people, things become complicated. Everyone has a different code style, and not everyone uses the same IDE configurations as yours.
Here’s where the pre-commit comes to the rescue! To put it simply, right before you commit files, it will check your code based on some configurations. If it passes, your files are being committed. If not, it will try to fix it automatically, and if it fails, it will ask you to resolve your issues, or else you can’t commit your changes.
Getting Started
Installing pre-commit
You can install it using pip:
pip install pre-commit
Then add the following to your requirements.txt
file (if you use one):
pre-commit
Creating configuration file
- Create a file named
.pre-commit-config.yaml
- You can fill the file with this sample config:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.2.0
hooks:
- id: trailing-whitespace
- id: check-added-large-files
- id: no-commit-to-branch
What is does basically is to check your code based on the specified hooks, in this case:
trailing-whitespace
will check if there’s a trailing whitespace at every end of lines in your changes.check-added-large-files
will prevent you for committing large files into the repository.no-commit-to-branch
will prevent you from committing to specific branches. By default, those branches aremain
andmaster
.
Those are some basic implementations of pre-commit. Now we want to add Black code-formatter to enforce our code style. We can do so by adding more config to the file:
- repo: https://github.com/psf/black
rev: 21.12b0
hooks:
- id: black
args: [“ — line-length=100”]
We can also customize the hooks by adding args
parameter. In this case, Black usually limit the length of the lines to 88 characters, but I want it to be 100 characters. We can do so by adding args: [“ — line-length=100”]
.
The final configuration file will look like this:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.2.0
hooks:
- id: trailing-whitespace
- id: check-added-large-files
- id: no-commit-to-branch
- repo: https://github.com/psf/black
rev: 21.12b0
hooks:
- id: black
args: [“ — line-length=100”]
Install the git hook scripts
The configuration is done, now we can install the hooks script by doing so:
pre-commit install
Let’s check if it works
Here I will use my project from software development course as an example. It uses a slightly different configurations but the general idea of how this works is the same.
Let’s run git status
to check the status of the current repository. We can see that we’re currently on the main
branch.
Let’s try commit the changes:
It fails to commit the changes because the last hook isn’t passed which is the no-commit-to-branch
. The hook will prevent you from committing directly from the main
branch.
Now let’s try to switch to a new branch, and try to commit again.
We can see that it passed all the checks, and the commit attempt is done successfully.
Closing
It may not be able to detect complex issues in the codebase. But having it installed can save us some time from detecting simple issues in the code review like inconsistent code styles, so we can be more focused on the algorithms or logic of the application itself.