mirror of
https://github.com/jbranchaud/til
synced 2026-07-07 01:30:32 +00:00
Add Lint And Format Project With Ruff as a Python TIL
This commit is contained in:
@@ -10,7 +10,7 @@ working across different projects via [VisualMode](https://www.visualmode.dev/).
|
|||||||
|
|
||||||
For a steady stream of TILs, [sign up for my newsletter](https://visualmode.kit.com/newsletter).
|
For a steady stream of TILs, [sign up for my newsletter](https://visualmode.kit.com/newsletter).
|
||||||
|
|
||||||
_1810 TILs and counting..._
|
_1811 TILs and counting..._
|
||||||
|
|
||||||
See some of the other learning resources I work on:
|
See some of the other learning resources I work on:
|
||||||
|
|
||||||
@@ -1084,6 +1084,7 @@ If you've learned something here, support my efforts writing daily TILs by
|
|||||||
- [Iterate First N Items From Enumerable](python/iterate-first-n-items-from-enumerable.md)
|
- [Iterate First N Items From Enumerable](python/iterate-first-n-items-from-enumerable.md)
|
||||||
- [Iterate Over A Dictionary](python/iterate-over-a-dictionary.md)
|
- [Iterate Over A Dictionary](python/iterate-over-a-dictionary.md)
|
||||||
- [Keep A Tally With collections.Counter](python/keep-a-tally-with-collections-counter.md)
|
- [Keep A Tally With collections.Counter](python/keep-a-tally-with-collections-counter.md)
|
||||||
|
- [Lint And Format Project With Ruff](python/lint-and-format-project-with-ruff.md)
|
||||||
- [Load A File Into The Python REPL](python/load-a-file-into-the-python-repl.md)
|
- [Load A File Into The Python REPL](python/load-a-file-into-the-python-repl.md)
|
||||||
- [Look Inside Pytest tmp_path](python/look-inside-pytest-tmp-path.md)
|
- [Look Inside Pytest tmp_path](python/look-inside-pytest-tmp-path.md)
|
||||||
- [Make Dataclass Sortable By Specific Field](python/make-dataclass-sortable-by-specific-field.md)
|
- [Make Dataclass Sortable By Specific Field](python/make-dataclass-sortable-by-specific-field.md)
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
# Lint And Format Project With Ruff
|
||||||
|
|
||||||
|
[Ruff](https://docs.astral.sh/ruff/) is "an extremely fast Python linter and
|
||||||
|
code formatter, written in Rust." I recently added it to my [`py-vmt` CLI project](https://github.com/jbranchaud/py-vmt) and here are some of the commands
|
||||||
|
I used right out of the box.
|
||||||
|
|
||||||
|
First, I use `uv` and so I installed it like so:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
❯ uv add --dev ruff
|
||||||
|
```
|
||||||
|
|
||||||
|
First, I checked for linting errors. There were a bunch. The output looked like
|
||||||
|
this:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
❯ uv run ruff check
|
||||||
|
F841 Local variable `frozen_datetime` is assigned to but never used
|
||||||
|
--> tests/src/py_vmt/test_cli.py:88:43
|
||||||
|
|
|
||||||
|
86 | 2026, 3, 14, 15, 5, 11, 0, datetime.timezone.utc
|
||||||
|
87 | )
|
||||||
|
88 | with freeze_time(initial_datetime) as frozen_datetime:
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
89 | # cancel session without one started
|
||||||
|
90 | cancel_result = runner.invoke(cli, ["cancel"])
|
||||||
|
|
|
||||||
|
help: Remove assignment to unused variable `frozen_datetime`
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
Found 11 errors.
|
||||||
|
[*] 2 fixable with the `--fix` option (7 hidden fixes can be enabled with the `--unsafe-fixes` option).
|
||||||
|
```
|
||||||
|
|
||||||
|
Some of them could be automatically fixed, so I dealt with those first using the
|
||||||
|
`--fix` flag.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
❯ uv run ruff check --fix
|
||||||
|
```
|
||||||
|
|
||||||
|
The remaining lint issues I had to deal with manually. Once I had addressed all
|
||||||
|
of them I got this message:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
❯ uv run ruff check
|
||||||
|
All checks passed!
|
||||||
|
```
|
||||||
|
|
||||||
|
With the lint issues out of the way, the next stuff was to use `ruff` to apply
|
||||||
|
consistent auto-formatting across the entire project. Because I hadn't been
|
||||||
|
using any auto-formatter up to this point on this project, I can expect the diff
|
||||||
|
to be significant.
|
||||||
|
|
||||||
|
I can start with a dry run using the `--check` flag. This gives a summary of how
|
||||||
|
much formatting churn there is going to be.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
❯ uv run ruff format --check
|
||||||
|
Would reformat: src/py_vmt/cli.py
|
||||||
|
Would reformat: src/py_vmt/session.py
|
||||||
|
Would reformat: src/py_vmt/time_helpers.py
|
||||||
|
Would reformat: tests/src/py_vmt/test_cli.py
|
||||||
|
Would reformat: tests/src/py_vmt/test_session.py
|
||||||
|
Would reformat: tests/src/py_vmt/test_time_helpers.py
|
||||||
|
6 files would be reformatted, 3 files already formatted
|
||||||
|
```
|
||||||
|
|
||||||
|
I'm using git and I have a clean working copy, so there is no real harm in just
|
||||||
|
going for it either.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
❯ uv run ruff format
|
||||||
|
6 files reformatted, 3 files left unchanged
|
||||||
|
```
|
||||||
|
|
||||||
|
That makes all the formatting changes and I can use `git diff` to browse through
|
||||||
|
them before eventually committing them.
|
||||||
|
|
||||||
|
See `uv run ruff check --help` and `uv run ruff format --help` for more details.
|
||||||
Reference in New Issue
Block a user