Files
dzentra_bot/docs/migrations/build_060_5.md

328 lines
7.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Build 060.5 — REST Trade Value Validation
## Цель
Реализовать слой проверки допустимости значений (`Value Validation`) для REST aggTrades после завершения этапов структурной проверки (`Schema Validation`) и преобразования в transport-модели (`REST Parser`).
Build завершает третий этап конвейера обработки REST Trades и обеспечивает, что все transport-модели содержат только корректные значения перед передачей в Mapper.
---
# Место Build в общей архитектуре
До Build 060.5 конвейер выглядел следующим образом:
```text
REST JSON
Schema Validation
ValidatedRestAggTradesDocument
REST Parser
tuple[DzengiRestAggTrade]
```
После Build 060.5:
```text
REST JSON
Schema Validation
ValidatedRestAggTradesDocument
REST Parser
tuple[DzengiRestAggTrade]
REST Trade Value Validation
tuple[DzengiRestAggTrade]
```
Следующим этапом станет:
```text
Mapper
Canonical Trade
```
---
# Архитектурная ответственность
Value Validation отвечает исключительно за проверку допустимости значений transport-моделей.
Validator:
- не изменяет transport-модель;
- не выполняет mapping;
- не преобразует данные в canonical-модель;
- не нормализует значения;
- не возвращает преобразованные объекты.
При успешной проверке функция завершается без результата.
При обнаружении ошибки выбрасывается специализированное исключение.
---
# Добавлено новое исключение
Файл:
```text
src/market_data/acquisition/exceptions.py
```
Добавлено:
```python
TradeValueError
```
Назначение:
- ошибки проверки допустимости значений REST Trade transport-моделей.
---
# Новый публичный API
Файл:
```text
src/market_data/acquisition/validation/values.py
```
Добавлена функция:
```python
validate_rest_agg_trade_values(
trades: tuple[DzengiRestAggTrade, ...],
) -> None
```
Ответственность функции:
- проверить все transport-модели;
- при первой ошибке выбросить `TradeValueError`;
- при отсутствии ошибок успешно завершиться.
---
# Внутренняя архитектура
Реализация построена по тому же принципу, что уже используется для Instrument, Quote и Candle.
```text
validate_rest_agg_trade_values()
_validate_rest_agg_trade()
├────────────► _trade_positive_int()
├────────────► _trade_positive_decimal()
└────────────► _trade_decimal()
```
Каждая helper-функция отвечает только за одну проверку.
---
# Проверяемые поля
## aggregate_trade_id
Проверяется:
- тип int (bool исключается);
- значение больше нуля.
---
## price
Проверяется:
- успешное преобразование в Decimal;
- конечность числа;
- значение больше нуля.
Поддерживаются значения:
- str
- int
- float
---
## quantity
Проверяется аналогично полю price.
---
## timestamp
Проверяется:
- тип int (bool исключается);
- значение больше нуля.
---
## buyer_is_maker
Дополнительная проверка отсутствует.
Корректность типа bool уже гарантируется предыдущим этапом — REST Parser.
---
# Что НЕ входит в Value Validation
Build сознательно не выполняет:
- преобразование transport-моделей;
- mapping;
- создание Canonical Trade;
- преобразование чисел в Decimal для дальнейшей обработки;
- проверку возраста сделки;
- проверку порядка timestamp;
- проверку последовательности aggregateTradeId;
- проверку дубликатов.
Все перечисленные задачи относятся к последующим слоям Acquisition Pipeline.
---
# Диагностика ошибок
Все сообщения содержат полный путь до ошибочного поля.
Примеры:
```text
$[0].price должно быть больше нуля.
$[1].quantity должно быть корректным числом.
$[2].timestamp должно быть целым числом больше нуля.
```
Такой формат полностью соответствует существующей архитектуре Validation Layer.
---
# Unit Tests
Добавлены тесты для:
## Позитивных сценариев
- одна корректная сделка;
- несколько корректных сделок;
- пустой tuple;
- строковые числовые значения;
- int;
- float;
- оба значения buyer_is_maker.
---
## Негативных сценариев
Проверяются:
- aggregate_trade_id ≤ 0;
- timestamp ≤ 0;
- price ≤ 0;
- quantity ≤ 0;
- NaN;
- Infinity;
- -Infinity;
- некорректные числовые строки;
- корректное формирование пути ошибки.
---
# Результаты проверки
Target tests:
```text
68 passed
```
Полная регрессия проекта:
```text
1072 passed
```
Дополнительно выполнено:
```text
python -m compileall src
```
Результат:
```text
OK
```
Также выполнено:
```text
git diff --check
```
Ошибок форматирования не обнаружено.
---
# Архитектурный результат Build
После завершения Build 060.5 REST Trades получили полностью независимый трехуровневый pipeline проверки данных.
```text
REST JSON
Schema Validation
ValidatedRestAggTradesDocument
REST Parser
tuple[DzengiRestAggTrade]
REST Trade Value Validation
tuple[DzengiRestAggTrade]
```
Каждый этап отвечает исключительно за собственную область ответственности.
Следующий Build (060.6) впервые переведет transport-модели в внутреннюю каноническую модель `Trade`, независимую от конкретной биржи.