chore: миграция на ruff 0.16 — фиксы новых дефолтов, верхняя граница пина - #38
Merged
Conversation
ruff 0.16.0 расширил дефолтный набор правил — 170 находок по репо. Автофиксы: I001 (сортировка импортов), UP035/UP037/UP045 (PEP 604 и современные импорты typing), ASYNC115 (anyio.sleep(0) → lowlevel.checkpoint()), RUF022, RUF100 (снятые noqa; смысловые обоснования возвращены обычными комментариями). Руками: - errors.py/gen_pages.py: _is_union() — интроспекция типового дерева понимает обе формы Union (typing.Union и types.UnionType): PEP 604 аннотации схемы в рантайме дают types.UnionType, без этого падал рендер конфиг-ошибок и генератор доков (11 тестов). - BLE001/S110: намеренные broad-catch в адаптерах получили noqa с причиной (реконнект, teardown, best-effort меню/реакции). - DTZ004: deprecated utcfromtimestamp → fromtimestamp(tz=UTC), строка вывода идентична. - DTZ001: тестовые даты aiogram-сообщений теперь aware-UTC (как в реальном API). - B008: RateSpec-дефолты хелперов → модульный _DEFAULT_RATE. - RUF059: неиспользуемые распаковки → «_». - UP007: алиасы Member/Subscriber → PEP 604. - AGENTS.md: упоминание снятого noqa в описании mirror_to_messenger. Проверено: ruff 0.15.22 и 0.16.0 — оба clean; pytest 363 passed; mypy strict clean. beads: LoRa-Bridge-9qw Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Кодовая база совместима с дефолтами 0.16 (предыдущий коммит). Верхняя граница <0.17 вместо открытой: минорные релизы ruff меняют дефолтный набор правил, а uv.lock в gitignore — без границы CI дрейфует и краснеет сам по себе (как случилось с 0.16.0). beads: LoRa-Bridge-9qw Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
По ревью: _is_union был объявлен дважды (config/errors.py и docs/gen_pages.py). Дубль на деле старше миграции — _strip_annotated и _unwrap_annotated в тех же файлах имели идентичные тела. Оба примитива вынесены публично в lora_bridge/config/introspect.py (is_union_origin, strip_annotated); errors.py, gen_pages.py и test_config_errors_unit.py переключены на общий модуль. Одноимённые _pretty_type не тронуты — это разные рендеры (RU-текст vs markdown). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что изменилось
Два коммита, оба зелёные:
ruff>=0.16,<0.17— временный<0.16из chore(ci): пин ruff <0.16 — дефолты 0.16.0 уронили CI #37 снят; граница по минору осталась, т.к. минорные релизы ruff меняют дефолтные правила, аuv.lockв gitignore.Ключевое для ревью
str | None) в рантайме даютtypes.UnionTypeвместоtyping.Union— рендер конфиг-ошибок и генератор доков перестали распознавать Union (падало 11 тестов). Добавлен_is_union()вconfig/errors.pyиdocs/gen_pages.py, понимающий обе формы.bridge.py— обоснования возвращены обычными комментариями («миррор не должен валить поток», «на shutdown не валим остальные stop()»); упоминание# noqa: BLE001в AGENTS.md поправлено.noqa: BLE001/S110с причиной, по правилу «ни одного голого подавления».utcfromtimestamp(deprecated с 3.12) →fromtimestamp(ts, tz=UTC)в журнале модерации — строка вывода идентична.Optional[X]→X | None,anyio.sleep(0)→lowlevel.checkpoint(),_DEFAULT_RATE-синглтоны вместо вызова в дефолтах,_для неиспользуемых распаковок, PEP 604 алиасыMember/Subscriber.selectв[tool.ruff]решили не заводить: дефолты + граница по минору дают осознанные апгрейды без своего списка правил.Проверено
ruff check: 0.15.22 и 0.16.0 — оба clean (первый коммит совместим с обеими версиями).pytest -q: 363 passed;mypy lora_bridge(strict): clean.beads: LoRa-Bridge-9qw
🤖 Generated with Claude Code