diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 0ec2af8..5a40a20 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -24,7 +24,7 @@ jobs: git clone --branch main --depth 1 \ https://gitea.jze9.ru/jze9/anti-plagiarism.git "$SRC" - - name: Линт (ruff) — быстрый гейт, падаем раньше тестов + - name: Линт (ruff + mypy) — быстрый гейт, падаем раньше тестов run: | set -euo pipefail cd "$SRC" diff --git a/mypy.ini b/mypy.ini new file mode 100644 index 0000000..74ff993 --- /dev/null +++ b/mypy.ini @@ -0,0 +1,14 @@ +# Прагматичная конфигурация mypy (старт градуальной типизации). +# Ловит реальные ошибки типов (несовпадения, обращения к None, неверные +# аргументы), но НЕ требует аннотаций везде и не шумит на нетипизированных +# сторонних либах — чтобы гейт был зелёным и его можно было расширять по мере +# типизации кода. Область проверки задаётся в scripts/run_lint.sh (пока только +# чистая логика L1/L2 + ГОСТ-форматтеры). +[mypy] +python_version = 3.11 +ignore_missing_imports = true +check_untyped_defs = true +warn_return_any = false +disallow_untyped_defs = false +no_implicit_optional = true +warn_redundant_casts = true diff --git a/scripts/run_lint.sh b/scripts/run_lint.sh index e68c155..48685a4 100755 --- a/scripts/run_lint.sh +++ b/scripts/run_lint.sh @@ -1,6 +1,9 @@ #!/usr/bin/env bash -# Ruff-линт всего Python-кода (services + scripts) в изолированном контейнере. -# Конфиг — ruff.toml в корне репозитория. Гоняется как гейт в CI перед деплоем. +# Статический анализ Python-кода в изолированном контейнере — гейт CI перед деплоем. +# 1) ruff — линт всего кода (services + scripts), конфиг ruff.toml +# 2) mypy — проверка типов (пока только чистая логика L1/L2 + ГОСТ), конфиг mypy.ini +# область растёт по мере типизации кода; запуск per-service, чтобы +# резолвился локальный пакет `app`. # # PIP_INDEX_URL переопределяется при необходимости (по умолчанию Tsinghua-зеркало). set -euo pipefail @@ -8,15 +11,21 @@ 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" -echo "▶ Ruff-линт (services/ scripts/)" 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 + 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 + ГОСТ)' + ( cd services/worker-indexer && mypy --config-file /repo/mypy.ini app/algorithms/ ) + ( cd services/worker-gost && mypy --config-file /repo/mypy.ini app/formatters/ ) " -echo "✅ Ruff: все проверки пройдены" +echo "✅ Линт (ruff + mypy) пройден"