chore(tooling): pre-commit пинит ruff v0.7.4, в venv 0.15.12 — хук переформатирует чужие строки #2864

Closed
opened 2026-08-13 11:38:20 +00:00 by bot-backend · 1 comment
Collaborator

Симптом

Любой коммит, трогающий питон-файл, где есть assert ..., "сообщение", получает в дифф
хунки на нетронутых строках. Поймал на PR #2863: три посторонних хунка в
backend/tests/api/v1/test_analyze_competitors_status.py (строки 90, 110, 234).

Причина

.pre-commit-config.yaml пинит ruff-pre-commit v0.7.4 (ноябрь 2024).
backend/pyproject.toml объявляет ruff>=0.5.0, и в backend/.venv разрешается
0.15.12. Они расходятся в форматировании длинных assert-сообщений:

# 0.15.x (так лежит в main)
assert val is None or isinstance(val, datetime.date), (
    f"ready_dt имеет неожиданный тип {type(val)}: {val}"
)

# 0.7.4 (так переписывает хук)
assert val is None or isinstance(
    val, datetime.date
), f"ready_dt имеет неожиданный тип {type(val)}: {val}"

Файлы в main отформатированы новым ruff → старый хук их «чинит» обратно на каждом
коммите, который их касается. Пинг-понг: следующий, кто запустит uv run ruff format,
вернёт как было.

Почему это не поймали раньше

ruff format --check намеренно не в CI-гейте (.forgejo/workflows/ci.yml:210-212:
«format-pass = future enhancement»). Гейтится только ruff check .. Поэтому расхождение
форматтеров не краснеет нигде — оно просто добавляет шум в каждый дифф.

Что сделать

  1. Поднять rev: в .pre-commit-config.yaml до версии, совпадающей с той, что
    разрешается в backend/.venv (сейчас 0.15.12), и прогнать
    uv run ruff format . по backend/ + tradein-mvp/backend/ одним коммитом-нормализацией.
  2. Заодно решить, пинить ли ruff точной версией в pyproject.toml вместо >=0.5.0
    иначе дрейф повторится, как только выйдет следующий релиз с изменением стиля.

Оценка: S. Шумный, но безопасный коммит — трогает только форматирование.

## Симптом Любой коммит, трогающий питон-файл, где есть `assert ..., "сообщение"`, получает в дифф хунки на **нетронутых строках**. Поймал на PR #2863: три посторонних хунка в `backend/tests/api/v1/test_analyze_competitors_status.py` (строки 90, 110, 234). ## Причина `.pre-commit-config.yaml` пинит `ruff-pre-commit` **v0.7.4** (ноябрь 2024). `backend/pyproject.toml` объявляет `ruff>=0.5.0`, и в `backend/.venv` разрешается **0.15.12**. Они расходятся в форматировании длинных assert-сообщений: ```python # 0.15.x (так лежит в main) assert val is None or isinstance(val, datetime.date), ( f"ready_dt имеет неожиданный тип {type(val)}: {val}" ) # 0.7.4 (так переписывает хук) assert val is None or isinstance( val, datetime.date ), f"ready_dt имеет неожиданный тип {type(val)}: {val}" ``` Файлы в `main` отформатированы новым ruff → старый хук их «чинит» обратно на каждом коммите, который их касается. Пинг-понг: следующий, кто запустит `uv run ruff format`, вернёт как было. ## Почему это не поймали раньше `ruff format --check` **намеренно не в CI-гейте** (`.forgejo/workflows/ci.yml:210-212`: «format-pass = future enhancement»). Гейтится только `ruff check .`. Поэтому расхождение форматтеров не краснеет нигде — оно просто добавляет шум в каждый дифф. ## Что сделать 1. Поднять `rev:` в `.pre-commit-config.yaml` до версии, совпадающей с той, что разрешается в `backend/.venv` (сейчас 0.15.12), и прогнать `uv run ruff format .` по `backend/` + `tradein-mvp/backend/` одним коммитом-нормализацией. 2. Заодно решить, пинить ли ruff точной версией в `pyproject.toml` вместо `>=0.5.0` — иначе дрейф повторится, как только выйдет следующий релиз с изменением стиля. Оценка: S. Шумный, но безопасный коммит — трогает только форматирование.
lekss361 added the
chore
ci
dx
priority/p3
tech-debt
labels 2026-08-16 10:25:27 +00:00
Author
Collaborator

Закрываю: хук, CI и lock'и на одном ruff 0.15.20, main нормализован

  • PR #3021 (1782dae0): rev v0.15.20, ruff==0.15.20 в обоих pyproject, uv lock (в lock'ах изменился только ruff); гейт test_2864_ruff_version_alignment.py держит три источника истины равными (на старом состоянии красный по значению: v0.7.4 vs 0.15.12/0.15.20).
  • PR #3022 (cdf493f3): ruff format 0.15.20 по backend/ и tradein-mvp/backend/ — 161 файл, только формат.
  • Проверка на свежем origin/main (21.08 14:0x UTC): uvx ruff@0.15.20 format --check backend/ tradein-mvp/backend/1002 files already formatted; ruff check — зелёный. Коммиты, сделанные после через хук (#3023, #3024), прошли без переформатирования чужих строк.

Пункт 2 постановки («пинить ли точной версией») решён пином ==: с >= любой uv lock --upgrade снова уводил бы lock от хука; теперь бамп — осознанное действие втроём (rev + pyproject×2 + lock), и гейт напоминает, если забыли одно из трёх.

## Закрываю: хук, CI и lock'и на одном ruff 0.15.20, main нормализован - PR #3021 (`1782dae0`): rev `v0.15.20`, `ruff==0.15.20` в обоих pyproject, `uv lock` (в lock'ах изменился только ruff); гейт `test_2864_ruff_version_alignment.py` держит три источника истины равными (на старом состоянии красный по значению: `v0.7.4` vs `0.15.12`/`0.15.20`). - PR #3022 (`cdf493f3`): `ruff format` 0.15.20 по `backend/` и `tradein-mvp/backend/` — 161 файл, только формат. - Проверка на свежем `origin/main` (21.08 14:0x UTC): `uvx ruff@0.15.20 format --check backend/ tradein-mvp/backend/` → **1002 files already formatted**; `ruff check` — зелёный. Коммиты, сделанные после через хук (#3023, #3024), прошли без переформатирования чужих строк. Пункт 2 постановки («пинить ли точной версией») решён пином `==`: с `>=` любой `uv lock --upgrade` снова уводил бы lock от хука; теперь бамп — осознанное действие втроём (rev + pyproject×2 + lock), и гейт напоминает, если забыли одно из трёх.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2864
No description provided.