From e79f254af6872bf637a70ff0cde13be3d67f615b Mon Sep 17 00:00:00 2001 From: jze9 Date: Tue, 11 Aug 2026 20:07:44 +0500 Subject: [PATCH] =?UTF-8?q?chore(lint):=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20mypy=20=D0=B2=20CI-=D0=B3=D0=B5=D0=B9?= =?UTF-8?q?=D1=82=20=E2=80=94=20=D1=81=D1=82=D0=B0=D1=80=D1=82=20=D0=B3?= =?UTF-8?q?=D1=80=D0=B0=D0=B4=D1=83=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20?= =?UTF-8?q?=D1=82=D0=B8=D0=BF=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ruff уже стоял; теперь рядом mypy как проверка типов. Прагматичный конфиг mypy.ini (ловит реальные несовпадения типов/обращения к None/неверные аргументы, но не требует аннотаций везде и не шумит на сторонних либах) — чтобы гейт был зелёным и расширяемым. Область на старте — только чистая логика, которая уже типобезопасна: worker-indexer/app/algorithms (L1 winnowing, L2 minhash) и worker-gost/app/formatters (ГОСТ 7.1 / 7.0.5). Запуск per-service, чтобы резолвился локальный пакет app. faiss_manager вне области пока — требует Optional-рефактора _index; на следующий заход. run_lint.sh теперь гоняет ruff + mypy в одном контейнере; шаг CI переименован. Co-Authored-By: Claude Opus 4.8 --- .gitea/workflows/deploy.yml | 2 +- mypy.ini | 14 ++++++++++++++ scripts/run_lint.sh | 19 ++++++++++++++----- 3 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 mypy.ini 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) пройден"