doc: промпт code review #2 — polygon v0.2.2 после decouple
This commit is contained in:
@@ -0,0 +1,101 @@
|
|||||||
|
# Code Review #2: polygon v0.2.2 (после decouple)
|
||||||
|
|
||||||
|
> Адресат: Claude Sonnet 4.6 (новый чат)
|
||||||
|
> Дата: 2026-07-31
|
||||||
|
> Предыдущее ревью: v0.2.0 (12 находок, 2 крит. исправлены)
|
||||||
|
> ⛔ ОТВЕТ — ТОЛЬКО В ЧАТ. Не редактировать файлы.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Контекст
|
||||||
|
|
||||||
|
После первого ревью (v0.2.0) были исправлены 2 критических бага и проведён
|
||||||
|
decouple-рефакторинг: монолитный `app.py` (418 строк) разнесён на blueprint'ы
|
||||||
|
по шаблону app-autotest. CSS и HTML вынесены из Python-строк в отдельные файлы.
|
||||||
|
|
||||||
|
Актуальная версия: **v0.2.2**, задеплоена на `polygon.pythonk8s.dev.nubes.ru`.
|
||||||
|
23/23 curl-тестов PASS, 19/19 pytest PASS.
|
||||||
|
|
||||||
|
## Новая структура
|
||||||
|
|
||||||
|
```
|
||||||
|
polygon/site/
|
||||||
|
├── app.py # 57 строк: Flask(), 6 blueprint'ов, app.run()
|
||||||
|
├── routes/
|
||||||
|
│ ├── root.py # /health, / (Jinja2 render_template)
|
||||||
|
│ ├── services_routes.py # GET /api/v1/svc/services, /services/<id>
|
||||||
|
│ ├── instances_routes.py # GET/POST /api/v1/svc/instances, GET /instances/<uid>
|
||||||
|
│ ├── operations_routes.py # /instanceOperations/* (5 эндпоинтов: default, create, status, params, validate)
|
||||||
|
│ ├── run.py # POST /instanceOperations/<uid>/run
|
||||||
|
│ └── mock_routes.py # /_mock/* (reset, state, services, delay)
|
||||||
|
├── state/
|
||||||
|
│ ├── mock_state.py # MockState (in-memory, UUID v4, пагинация)
|
||||||
|
│ └── state_machine.py # apply_effect() + _merge_params()
|
||||||
|
├── config/
|
||||||
|
│ └── loader.py # load_services() + модульные переменные SERVICES/OPS_INDEX/DELAY
|
||||||
|
├── utils/
|
||||||
|
│ ├── now.py # now() — UTC ISO с 'Z'
|
||||||
|
│ └── pluralize.py # pluralize() — одна функция
|
||||||
|
├── converter/
|
||||||
|
│ └── from_stands.py # конвертер STANDS YAML → polygon config
|
||||||
|
├── static/
|
||||||
|
│ └── style.css # тёмная тема (из f-строки)
|
||||||
|
├── templates/
|
||||||
|
│ └── index.html # Jinja2-шаблон (из f-строки)
|
||||||
|
└── services/
|
||||||
|
└── 37 YAML-конфигов
|
||||||
|
```
|
||||||
|
|
||||||
|
## Что изменилось с прошлого ревью
|
||||||
|
|
||||||
|
| v0.2.0 | v0.2.2 |
|
||||||
|
|--------|--------|
|
||||||
|
| `app.py` 418 строк, всё в одном | `app.py` 57 строк, только скелет |
|
||||||
|
| 17 `@app.route(...)` в одном файле | 7 blueprint-файлов в `routes/` |
|
||||||
|
| CSS в f-строке `index()` | `static/style.css` |
|
||||||
|
| HTML в f-строке `index()` | `templates/index.html` (Jinja2) |
|
||||||
|
| `_now()` в app.py + mock_state.py | `utils/now.py` |
|
||||||
|
| `_pluralize()` в state_machine + from_stands | `utils/pluralize.py` |
|
||||||
|
| `config_loader.py` | `config/loader.py` (модульные переменные) |
|
||||||
|
| `--workers 2` в docstring | `--workers 1` + `WEB_CONCURRENCY=1` |
|
||||||
|
| `cfs_params[pid]` → KeyError | `cfs_params.get(pid)` → безопасно |
|
||||||
|
|
||||||
|
## Что проверять
|
||||||
|
|
||||||
|
### 1. Корректность blueprint-регистрации
|
||||||
|
- Все 17+ маршрутов на месте?
|
||||||
|
- Порядок `default/<int>` перед `<uid>` сохранён в operations_routes.py?
|
||||||
|
- Нет коллизий имён blueprint'ов?
|
||||||
|
- `url_prefix` не дублируется с путями в `@bp.route()`?
|
||||||
|
|
||||||
|
### 2. Импорты и зависимости
|
||||||
|
- Нет циклических импортов между модулями?
|
||||||
|
- `config/loader.py` — модульные переменные инициализируются ровно один раз?
|
||||||
|
- `routes/run.py` и `routes/mock_routes.py` правильно работают с `config.loader.DELAY` через `_cfg.DELAY = seconds`?
|
||||||
|
- Старый `config_loader.py` удалён — нигде не осталось импортов?
|
||||||
|
|
||||||
|
### 3. Порядок вызова функций
|
||||||
|
- При дроблении не нарушен ли порядок: validate → set_param → run → apply_effect?
|
||||||
|
- `apply_effect` вызывается с правильными аргументами (mock_state.state, SERVICES)?
|
||||||
|
- `_merge_params` не сломан после переноса в отдельный модуль?
|
||||||
|
|
||||||
|
### 4. CSS/HTML разделение
|
||||||
|
- `render_template("index.html", ...)` передаёт все нужные переменные?
|
||||||
|
- CSS не потерян при переносе?
|
||||||
|
- `url_for('static', filename='style.css')` корректный?
|
||||||
|
|
||||||
|
### 5. Качество кода новых файлов
|
||||||
|
- Комментарии к каждой функции на месте?
|
||||||
|
- Имена переменных понятные?
|
||||||
|
- Нет дублирования логики между blueprint'ами?
|
||||||
|
|
||||||
|
## Формат ответа
|
||||||
|
|
||||||
|
Сгруппируй находки:
|
||||||
|
- 🔴 Критические (сломает работу)
|
||||||
|
- 🟡 Средние (потенциальная проблема)
|
||||||
|
- 🔵 Минорные (стиль, имена)
|
||||||
|
|
||||||
|
Для каждой: файл, проблема, предлагаемое исправление.
|
||||||
|
|
||||||
|
Если по какой-то категории всё ок — напиши «проблем не найдено».
|
||||||
Reference in New Issue
Block a user