Вышел Ruff v0.16.0 — сверхбыстрый Python-линтер и форматер на Rust. Установить можно из PyPI или командой uv tool install ruff@latest. Набор правил по умолчанию резко расширили: теперь их 413 вместо 59. Включены правила из популярных наборов flake8-bugbear (B), pyupgrade (UP) и собственной категории RUF. Многие из них отлавливают синтаксические и фатальные ошибки времени выполнения, которые раньше не активировались без ручной настройки. Если такой объём не нужен, старый «дефолтный» набор легко вернуть через select = ["E4", "E7", "E9", "F"].
Одна из главных новых возможностей — форматирование Python-блоков прямо внутри Markdown-файлов. Ruff понимает огороженные блоки кода с метками python, py, python3, py3, pyi и pycon. Блоки pyi форматируются как stub-файлы, pycon — как сессии REPL, остальные — как обычный Python-код. Это работает и с Quarto-ноутбуками, даже если язык указан в фигурных скобках вроде {python}. Подавить форматирование можно привычными fmt: off / fmt: on внутри блока, HTML-комментариями или исключением .md-файлов через extend-exclude.
Система подавления диагностик тоже прокачалась. Появились комментарии ruff: ignore для игнорирования ошибки на текущей или следующей логической строке и ruff: file-ignore — для всего файла. К каждому можно дописать причину. Добавлять ruff: ignore автоматически позволяет новый флаг --add-ignore. В preview-режиме эти комментарии понимают даже названия правил вместо кодов, например unused-import.
Вывод check и format --check теперь сразу показывает диффы предлагаемых исправлений, не требуя отдельного флага --diff. Для format --check стали доступны все форматы вывода, которые поддерживает линтер: можно получить машиночитаемый JSON или аннотации для GitHub и GitLab в CI. В JSON-выводе есть маленькое ломающее изменение: поля filename, location, end_location и вложенные координаты внутри fix.edits теперь могут быть null, а не дефолтными значениями вроде первой строки и первого столбца.
В релизе стабилизировали несколько правил и поведенческих фич, которые раньше были доступны только в preview-режиме. Все подробности — в чейнджлоге на GitHub. Авторы благодарят всех, кто тестировал preview-режим, а также контрибьюторов Zanie Blue, David Peter, Micha Reiser и Alex Waygood.