Autohooks
Library for managing and writing git hooks
in Python using pyproject.toml
for its settings.
Looking for automatic formatting and linting, e.g., with black and ruff,
while creating a git commit using a pure Python implementation? Do you just want
to have your git hook settings in the pyproject.toml
file too?
Welcome to autohooks!
Why?
Several outstanding libraries for managing and executing git hooks exist already.
To name a few: husky,
lint-staged,
precise-commits or
pre-commit.
However, they need another interpreter besides python (like husky), require a
different config file besides pyproject.toml
or are too ambiguous (like
pre-commit). pre-commit is written in python but has support hooks written in
all kind of languages. Additionally, it maintains the dependencies by itself and
does not install them in the current environment.
Solution
autohooks is a pure python library that installs a minimal
executable git hook.
It allows the decision of how to maintain the hook dependencies
by supporting different modes and stores its settings in the well known
pyproject.toml
file.
Requirements
Python 3.9+ is required for autohooks.
Plugins
-
Python code formatting via black
-
Python code formatting via autopep8
-
Python code linting via ruff
-
Python code linting via pylint
-
Python code linting via flake8
-
Python code linting via mypy
-
Python import sorting via isort
-
Running tests via pytest
Installing autohooks
Quick installation of ruff and black plugins using poetry:
poetry add --dev autohooks autohooks-plugin-black autohooks-plugin-ruff
poetry run autohooks activate --mode poetry
poetry run autohooks plugins add autohooks.plugins.black autohooks.plugins.ruff
The output of autohooks activate
should be similar to
✓ autohooks pre-commit hook installed at /autohooks-test/.git/hooks/pre-commit using poetry mode.
Autohooks has an extensible plugin model. Each plugin provides different
functionality which often requires to install additional dependencies.
For managing these dependencies currently three modes are supported by
autohooks:
pythonpath
for dependency management via pippoetry
for dependency management via poetry (recommended)pipenv
for dependency management via pipenv
These modes handle how autohooks, the plugins and their dependencies are loaded
during git hook execution.
If no mode is specified in the pyproject.toml
config file
and no mode is set during activation, autohooks
will use the pythonpath mode by default.
For more details on using pip, poetry or pipenv in conjunction with these
modes see the documentation.
Command Completion
autohooks
comes with support for command line completion in bash
and zsh.
Setup for bash
echo "source ~/.autohooks-complete.bash" >> ~/.bashrc
autohooks --print-completion bash > ~/.autohooks-complete.bash
Alternatively, you can use the result of the completion command directly with
the eval function of your bash shell:
eval "$(autohooks --print-completion bash)"
Setup for zsh
echo 'fpath=("$HOME/.zsh.d" $fpath)' >> ~/.zsh
mkdir -p ~/.zsh.d/
autohooks --print-completion zsh > ~/.zsh.d/_autohooks
Alternatively, you can use the result of the completion command directly with
the eval function of your zsh shell:
eval "$(autohooks --print-completion zsh)"
Maintainer
This project is maintained by Greenbone AG.
Contributing
Your contributions are highly appreciated. Please
create a pull request
on GitHub. Bigger changes need to be discussed with the development team via the
issues section at GitHub
first.
License
Copyright (C) 2019 - 2024 Greenbone AG
Licensed under the GNU General Public License v3.0 or later.