#!/usr/bin/env bash # Статический анализ Python-кода в изолированном контейнере — гейт CI перед деплоем. # 1) ruff — линт всего кода (services + scripts), конфиг ruff.toml # 2) mypy — проверка типов (пока только чистая логика L1/L2 + ГОСТ), конфиг mypy.ini # область растёт по мере типизации кода; запуск per-service, чтобы # резолвился локальный пакет `app`. # # PIP_INDEX_URL переопределяется при необходимости (по умолчанию Tsinghua-зеркало). set -euo pipefail MIRROR="${PIP_INDEX_URL:-https://pypi.tuna.tsinghua.edu.cn/simple/}" ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" RUFF_VERSION="0.16.2" MYPY_VERSION="1.13.0" docker run --rm \ -v "$ROOT":/repo -w /repo \ -e PIP_INDEX_URL="$MIRROR" \ -e PIP_DISABLE_PIP_VERSION_CHECK=1 \ python:3.11-slim bash -c " set -e pip install --no-cache-dir --timeout 60 -q ruff==$RUFF_VERSION mypy==$MYPY_VERSION echo '▶ ruff (services/ scripts/)' ruff check services/ scripts/ echo '▶ mypy (чистая логика L1/L2 + ГОСТ + скоринг + OAuth + прогресс заливки)' ( cd services/worker-indexer && mypy --config-file /repo/mypy.ini app/algorithms/ app/fragments.py app/staging.py app/progress.py ) ( cd services/worker-gost && mypy --config-file /repo/mypy.ini app/formatters/ app/bibliography.py ) ( cd services/worker-gpu && mypy --config-file /repo/mypy.ini app/scoring.py ) ( cd services/api && mypy --config-file /repo/mypy.ini app/core/oauth.py app/core/progress.py ) " echo "✅ Линт (ruff + mypy) пройден"