Awesome
sync-pre-commit-lock
PDM and Poetry plugin to sync your pre-commit versions with your lockfile and automatically install pre-commit hooks.
Features
- 🔁 Sync pre-commit versions (including
additional_dependencies
) with your lockfile - ⏩ Run every time you run the lockfile is updated, not as a pre-commit hook
- 🔄 Install pre-commit hooks automatically, no need to run
pre-commit install
manually - 💫 Preserve your pre-commit config file formatting
- 🍃 Lightweight, only depends on strictyaml and packaging
Supported versions
- Python 3.9+
- PDM 2.7.4+
- Poetry 1.6.0+
Installation
For PDM
Install it just like any other PDM plugin:
pdm self add "sync-pre-commit-lock"
Optionally, you can also specify the plugin in your project pyproject.toml
, to make it installable with pdm install --plugins
:
[tool.pdm]
plugins = [
"sync-pre-commit-lock"
]
Note: we have an extra group
[pdm]
, that adds PDM version constraints. While it's safer, it might result in PDM being installed twice.
For Poetry
Install like any other Poetry plugin, e.g.:
poetry self add "sync-pre-commit-lock[poetry]"
Only Poetry 1.6.0+ is supported.
Configuration
This plugin is configured using the tool.sync-pre-commit-lock
section in your pyproject.toml
file.
Here is the default configuration:
[tool.sync-pre-commit-lock]
# Run `pre-commit install` automatically if applicable
automatically-install-hooks = true
# Should we sync your pre-commit versions with your lockfile (when running lock, add, update, remove, etc.)?
disable-sync-from-lock = false
# Packages to ignore when syncing from lock
ignore = []
# Name of the pre-commit config file to sync with
pre-commit-config-file = ".pre-commit-config.yaml"
# Additional mapping of URLs to python packages
# Default is empty, but will merge with the default mapping
# "rev" indicates the format of the Git tags
dependency-mapping = {"package-name"= {"repo"= "https://github.com/example/package-name", "rev"= "v${rev}"}}
Note: the
dependency-mapping
is merged with the default mapping, so you don't need to specify the default mapping if you want to add a new mapping. Repos urls will be normalized to http(s), with the trailing slash removed.
From environment
Some settings are overridable by environment variables with the following SYNC_PRE_COMMIT_LOCK_*
prefixed environment variables:
toml setting | environment | format |
---|---|---|
automatically-install-hooks | SYNC_PRE_COMMIT_LOCK_INSTALL | bool as string (true , 1 ...) |
disable-sync-from-lock | SYNC_PRE_COMMIT_LOCK_DISABLED | bool as string (true , 1 ...) |
ignore | SYNC_PRE_COMMIT_LOCK_IGNORE | comma-separated list |
pre-commit-config-file | SYNC_PRE_COMMIT_LOCK_PRE_COMMIT_FILE | str |
Usage
Once installed, and optionally configured, the plugin usage should be transparent, and trigger when you run applicable PDM or Poetry commands, like pdm lock
, or poetry lock
.
There should be a message in the output, when the sync or install or pre-commit is triggered.
You can manually trigger the sync with the CLI command:
pdm sync-pre-commit
or
poetry sync-pre-commit
Both commands support --dry-run
and verbosity options.
PDM Github Action support
If you use pdm-project/update-deps-actions Github Action, you can get automatically update your .pre-commit-config.yaml
file by adding the plugin in your pyproject.toml
and setting a flag in your workflow:
# In your workflow
- name: Update dependencies
uses: pdm-project/update-deps-action@main
with:
# Whether to install PDM plugins before update (defaults to "false")
install-plugins: "true"
# In your pyproject.toml
[tool.pdm]
plugins = ["sync-pre-commit-lock"]
Supported packages for pre-commits
Here is the list of default packages supported by this plugin, from db.py
. You can add more packages using the dependency-mapping
configuration.
- autopep8
- bandit
- black
- check-jsonschema
- codespell
- commitizen
- djade
- djhtml
- docformatter
- flake8
- flakeheaven
- isort
- mypy
- pdm
- poetry
- pycln
- pyroma
- pyupgrade
- rtscheck
- ruff
- yamllint
Note:
pdm
orpoetry
version will be added, from the current instance version, and not from the lockfile.
Improvement ideas
Feel free to open an issue or a PR if you have any idea, or if you want to help!
Release / CI / DX
- Add a changelog
- Add "E2E" tests
- Add docs
Features or fixes
- Support hooks URL aliases for the same Python package
- Support user configuration of aliases
- Support
pdm config
and clear configuration precedence - Create a more verbose command
- Add support for other lockfiles / project managers (pipenv, flit, hatch, etc.)
- Expose a pre-commit hook to sync the lockfile
- Support nested
additional_dependencies
, (i.e. mypy types) - Support reading DB from a Python module?
- Support reordering DB inputs (file/global config/python module/cli)?
- Test using SSH/file dependencies?
- Check ref existence before writing?
- New feature to convert from pre-commit online to local?
- Warning if pre-commit CI auto update is also set?
- Support automatic repository URL update (from legacy aliased repositories)
Inspiration
This project is inspired by @floatingpurr's sync_with_pdm and sync_with_poetry.
The code to install pre-commit hooks automatically is adapted from @vstrimaitis's poetry-pre-commit-plugin, licensed under GPL-3.