102 lines
5.3 KiB
Markdown
102 lines
5.3 KiB
Markdown
# 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'ами?
|
||
|
||
## Формат ответа
|
||
|
||
Сгруппируй находки:
|
||
- 🔴 Критические (сломает работу)
|
||
- 🟡 Средние (потенциальная проблема)
|
||
- 🔵 Минорные (стиль, имена)
|
||
|
||
Для каждой: файл, проблема, предлагаемое исправление.
|
||
|
||
Если по какой-то категории всё ок — напиши «проблем не найдено».
|