refactor(make): корень — про стенд, генератор — за своей дверью

- Зачем:
  - корневые цели смешивали два уровня: пять из шестнадцати начинались с cd generator.
  - цель, названная общерепозиторной, охватывала 31 файл Python из 34: даги и Superset не видел ни линт, ни типы.
- Что:
  - lint, typecheck, test, docs и inventory переехали в новый generator/Makefile.
  - корневой lint заведён по коду стенда — dags и infra/superset — с явными путями и закреплённой версией ruff.
  - заведён корневой ruff.toml: тот же список правил, target-version по младшему Python в образах стенда.
  - цели корня сгруппированы по использованию, осталось двенадцать.
  - два файла дагов переформатированы под новую проверку.
  - карта проверок, оба README, спека генератора и AGENTS.md приведены к двум дверям.
- Проверка:
  - make lint; make config-test — зелёные.
  - make -C generator lint; typecheck; test — зелёные, 407 тестов.
  - ruff check --show-files: из корня ровно три файла стенда, из generator/ — только его.
  - цена корневого lint замерена (0,4 с) и вписана в карту проверок.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-09 21:31:07 +03:00
co-authored by Claude Opus 5
parent 368fb1a66b
commit 6a708cd5aa
13 changed files with 154 additions and 66 deletions
+27
View File
@@ -0,0 +1,27 @@
# Цели генератора. Дверь у него своя, потому что своя и сущность: пакет с
# собственными `pyproject.toml`, `uv.lock` и образом, заменяемый целиком
# (спека генератора, раздел 1). Отсюда и короткие имена — каталог уже сказал,
# о ком речь, и суффикс `-generator` был бы вторым разом про то же.
.PHONY: lint typecheck test docs inventory
# --- Проверки ---
lint:
uv run ruff check
uv run ruff format --check
typecheck:
uv run ty check
test:
uv run pytest
# --- Сборка из кода ---
docs:
uv run python -m clickstream_generator.schema_doc \
../docs/formats/clickstream-event.md
inventory:
uv run python -m clickstream_generator.inventory \
../data/world-inventory.json
+7 -2
View File
@@ -92,12 +92,17 @@ D0 живёт предыстория, поэтому любой день соб
Проиграть день — [быстрый старт](../README.md#как-позвать-генератор) и `--help`.
Из корня репозитория:
Из этого каталога — цели генератора живут здесь, а не в корне:
- `make test` — тесты генератора;
- `make lint` — ruff: проверка и формат;
- `make typecheck` — ty: проверка типов;
- `make docs` — пересобрать описание выгрузки.
- `make docs` — пересобрать описание выгрузки;
- `make inventory` — пересобрать опись мира.
В корне репозитория `make lint` тоже есть, но он про код стенда — даги и
Superset. Одноимённые цели за разными дверями охватывают разное:
[карта проверок](../docs/architecture/testing.md).
Python и зависимости — через `uv`, версии закреплены в `uv.lock`: на этом
держится обещание побайтовой воспроизводимости (спека, раздел 2).
@@ -26,7 +26,7 @@
пересчитывается он и обычным `sha256sum` по сыгранному в файл дню (как
именно — в README репозитория).
Собирается опись из корня репозитория целью `make inventory`, а свежесть её
Собирается опись из каталога генератора целью `make inventory`, а свежесть её
сторожит тест — как и у «описания выгрузки».
"""
@@ -5,7 +5,7 @@
содержание берётся из контракта (`schema`), правится только там; свежесть
документа сторожит тест.
Запуск из корня репозитория целью `make docs`.
Запуск из каталога генератора целью `make docs`.
"""
import argparse
@@ -18,7 +18,7 @@ PREAMBLE = """# Описание выгрузки: событие кликстр
Документ собран из контракта схемы генератора
(`generator/src/clickstream_generator/schema.py`). Руками не править
пересобрать: `make docs`.
пересобрать: `make docs` из каталога `generator/`.
Одно событие одна строка: хит по образцу облачной выгрузки Яндекс Метрики.
Многозначное лежит в параллельных массивах, плюс одно сырое JSON-поле