Build 060.7: implement REST Trade Adapter

This commit is contained in:
2026-07-19 10:56:06 +03:00
parent 6b0d5badce
commit 7eee8ce36c
5 changed files with 2318 additions and 27 deletions

View File

@@ -0,0 +1,328 @@
# 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`, независимую от конкретной биржи.