Switched from pipx to uv for installing development tools, and added tox-uv for speeding up test environment creation.

This commit is contained in:
2025-07-18 15:16:45 -07:00
parent 9a80fec91b
commit 2d8b455e44
7 changed files with 37 additions and 24 deletions

3
NEWS
View File

@@ -3,6 +3,9 @@
use.
* When running tests, use Ruff for faster and more comprehensive code linting and formatting,
replacing Flake8, Black, isort, etc.
* Switched from pipx to uv for installing development tools, and added tox-uv for speeding up test
environment creation. See the developer documentation for more information:
https://torsion.org/borgmatic/docs/how-to/develop-on-borgmatic/
2.0.7
* #1032: Fix a bug in which a Borg archive gets created even when a database hook fails.

View File

@@ -8,9 +8,8 @@ eleventyNavigation:
## Source code
To get set up to develop on borgmatic, first [`install
pipx`](https://torsion.org/borgmatic/docs/how-to/set-up-backups/#installation)
to make managing your borgmatic environment easier without impacting other
Python applications on your system.
uv`](https://docs.astral.sh/uv/) to make managing your borgmatic environment
easier without impacting other Python applications on your system.
Then, clone borgmatic via HTTPS or SSH:
@@ -31,8 +30,8 @@ changes work:
```bash
cd borgmatic
pipx ensurepath
pipx install --editable .
uv tool ensurepath
uv tool install --editable .
```
Or to work on the [Apprise
@@ -40,7 +39,7 @@ hook](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#apprise-ho
change that last line to:
```bash
pipx install --editable .[Apprise]
uv tool install --editable .[Apprise]
```
To get oriented with the borgmatic source code, have a look at the [source
@@ -50,29 +49,37 @@ code reference](https://torsion.org/borgmatic/docs/reference/source-code/).
## Automated tests
Assuming you've cloned the borgmatic source code as described above and you're
in the `borgmatic/` working copy, install [tox](https://tox.wiki/), which is
used for setting up testing environments. You can either install a system
package of tox (likely called `tox` or `python-tox`) or you can install tox with
pipx:
in the `borgmatic/` working copy, install [tox](https://tox.wiki/) and
[tox-uv](https://github.com/tox-dev/tox-uv) using uv, which are used for setting
up testing environments:
```bash
pipx install tox
uv tool install tox --with tox-uv
```
Also install [Ruff](https://docs.astral.sh/ruff/), which tox calls for code
Also install [Ruff](https://docs.astral.sh/ruff/), which borgmatic uses for code
linting and formatting:
```bash
pipx install ruff
uv tool install ruff
```
Finally, to actually run tests, run tox from inside the borgmatic
source directory:
Finally, to actually run tests, run tox from inside the borgmatic source
directory:
```bash
tox
```
That runs tests against all supported versions of Python, which takes a while.
So if you'd only like to run tests against a single version of Python, e.g.
Python 3.13:
```bash
tox -e py313
```
### Code style
If when running tests, you get an error from Ruff's linter about files that
@@ -80,7 +87,7 @@ don't meet linting requirements, you can ask Ruff to attempt to fix them for you
via the following:
```bash
tox -e lint
tox -e lint-fix
```
And if you get an error from the Ruff's code formatter about files that would be
@@ -122,7 +129,6 @@ you may need to run with `sudo`.
#### Podman
<span class="minilink minilink-addedin">New in version 1.7.12</span>
borgmatic's end-to-end tests optionally support using
[rootless](https://github.com/containers/podman/blob/main/docs/tutorials/rootless_tutorial.md)
[Podman](https://podman.io/) instead of Docker.
@@ -145,8 +151,9 @@ will automatically use your non-root Podman socket instead of a Docker socket.
## Code style
Start with [PEP 8](https://www.python.org/dev/peps/pep-0008/). But then, apply
the following deviations from it:
When writing code for borgmatic, start with [PEP
8](https://www.python.org/dev/peps/pep-0008/). But then, apply the following
deviations from it:
* For strings, prefer single quotes over double quotes.
* Limit all lines to a maximum of 100 characters.
@@ -183,6 +190,7 @@ which runs the test suite and updates
from the [commits for the main
branch](https://projects.torsion.org/borgmatic-collective/borgmatic/commits/branch/main).
## Documentation development
Updates to borgmatic's documentation are welcome. It's formatted in Markdown
@@ -210,7 +218,6 @@ additional documentation changes to take effect.
#### Podman
<span class="minilink minilink-addedin">New in version 1.7.12</span>
borgmatic's developer build for documentation optionally supports using
[rootless](https://github.com/containers/podman/blob/main/docs/tutorials/rootless_tutorial.md)
[Podman](https://podman.io/) instead of Docker.

View File

@@ -94,6 +94,7 @@ installing borgmatic:
* [NixOS](https://search.nixos.org/packages?show=borgmatic&sort=relevance&type=packages&query=borgmatic)
* [Ansible role](https://github.com/borgbase/ansible-role-borgbackup)
* [Unraid](https://unraid.net/community/apps?q=borgmatic#r)
* [uv tool install](https://docs.astral.sh/uv/)
## Hosting providers

View File

@@ -18,7 +18,9 @@ if [ -z "$TEST_CONTAINER" ]; then
fi
apk add --no-cache python3 py3-pip borgbackup postgresql17-client mariadb-client mongodb-tools \
py3-mongo py3-regex py3-ruamel.yaml py3-ruamel.yaml.clib py3-tox py3-yaml ruff sqlite bash fish
py3-mongo py3-regex py3-ruamel.yaml py3-ruamel.yaml.clib py3-tox py3-yaml ruff sqlite uv bash \
fish
uv tool install tox --with tox-uv
export COVERAGE_FILE=/tmp/.coverage
tox --workdir /tmp/.tox --sitepackages

View File

@@ -2,7 +2,7 @@ apprise==1.9.3
attrs==25.3.0
certifi==2025.7.14
charset-normalizer==3.4.2
click==8.2.1
click>=8.1.8
codespell==2.4.1
coverage==7.9.2
flexmock==0.12.2

View File

@@ -7,7 +7,6 @@ from flexmock import flexmock
from borgmatic.commands.completion import fish as module
OptionType = namedtuple('OptionType', ['file', 'choice', 'unknown_required'])
TestCase = tuple[Action, OptionType]
test_data = [
(Action('--flag', 'flag'), OptionType(file=False, choice=False, unknown_required=False)),

View File

@@ -5,6 +5,7 @@ package = editable
min_version = 4.0
[testenv]
runner = uv-venv-runner
deps =
-r test_requirements.txt
allowlist_externals =
@@ -32,7 +33,7 @@ pass_env = COVERAGE_FILE
commands =
pytest {posargs} --no-cov tests/end-to-end
[testenv:lint]
[testenv:lint-fix]
deps = []
skip_install = true
commands =