/
systemsstrategyy
/
Treker
Обзор
Документация
Войти
/
systemsstrategyy
/
Treker
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
scripts/dump_openapi.py
50 строк
2 KB
SystemsStrategy
Initial import
02 июл 2026, 15:15
02 июл 2026, 15:15
9624ed1
Код
Авторство
О чём код?
"""Dump current OpenAPI schema to stdout — для CI workflows. Проблема: `python -c "from api.main import app; print(json.dumps(...))"` + stdout-redirect в файл собирает мусор из логов. `api.core.logging.setup_logging()` ставит handler на `sys.stdout` (для прода это правильно), а Procrastinate при import `workers.queue` логирует INFO про регистрацию задач. Результат — ANSI-coloured структурные логи **перед** JSON в выходном файле, и diff-bot спамит fake-diff'ами на каждом PR'е (issues #77 #78). Этот скрипт **отключает все loggers до import** и пишет JSON напрямую в stdout с правильным encoding. CI workflows вызывают так: python scripts/dump_openapi.py > /tmp/openapi-new.json Никакого `2>/dev/null` не нужно — stderr остаётся чистым для error reporting. """ from __future__ import annotations import logging import sys def main() -> int: # КРИТИЧНО: глушим все loggers ДО любого import-а из `api.*` или `workers.*`. # `logging.disable(CRITICAL)` отключает все стандартные log-калли с уровнем # <= CRITICAL, что включает все INFO/DEBUG/WARNING/ERROR от Procrastinate, # SQLAlchemy, structlog stdlib factory, etc. logging.disable(logging.CRITICAL) # Дополнительная страховка: replace root handlers сразу после первого import. # Если кто-то делает `print(...)` напрямую (не через logger) — мы поймать не # можем, но это редкий паттерн в библиотеках. import json # noqa: PLC0415 — намеренно после logging.disable from api.main import app # noqa: PLC0415 — намеренно после logging.disable # На случай если import всё-таки что-то записал в stdout до сюда: flush # и проверка, что первый символ нашего вывода — `{`. Файл-потребитель # (`openapi-snapshot.yml`) уже делает sanity-check `head -c 1 == '{'`. sys.stdout.flush() json.dump(app.openapi(), sys.stdout, indent=2, sort_keys=True) sys.stdout.write("\n") return 0 if __name__ == "__main__": sys.exit(main())