Build 060.2: add REST trade transport model
This commit is contained in:
@@ -150,6 +150,17 @@ class DzengiKlinesResponse:
|
|||||||
items: tuple[DzengiKline, ...]
|
items: tuple[DzengiKline, ...]
|
||||||
|
|
||||||
|
|
||||||
|
# Транспортное представление одной агрегированной сделки
|
||||||
|
# Dzengi GET /api/v2/aggTrades.
|
||||||
|
@dataclass(frozen=True, slots=True)
|
||||||
|
class DzengiRestAggTrade:
|
||||||
|
aggregate_trade_id: int
|
||||||
|
price: DzengiRawNumeric
|
||||||
|
quantity: DzengiRawNumeric
|
||||||
|
timestamp: int
|
||||||
|
buyer_is_maker: bool
|
||||||
|
|
||||||
|
|
||||||
# Транспортное представление одного события Dzengi WebSocket ohlc.event.
|
# Транспортное представление одного события Dzengi WebSocket ohlc.event.
|
||||||
#
|
#
|
||||||
# Событие содержит завершённую OHLC-свечу без объёма и поэтому не является
|
# Событие содержит завершённую OHLC-свечу без объёма и поэтому не является
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ from src.market_data.acquisition.adapters.dzengi.models import (
|
|||||||
DzengiLotSizeFilter,
|
DzengiLotSizeFilter,
|
||||||
DzengiMinNotionalFilter,
|
DzengiMinNotionalFilter,
|
||||||
DzengiRateLimit,
|
DzengiRateLimit,
|
||||||
|
DzengiRestAggTrade,
|
||||||
DzengiUnknownFilter,
|
DzengiUnknownFilter,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -204,3 +205,48 @@ def test_raw_models_are_immutable() -> None:
|
|||||||
|
|
||||||
with pytest.raises(FrozenInstanceError):
|
with pytest.raises(FrozenInstanceError):
|
||||||
response.status = "OK" # type: ignore[misc]
|
response.status = "OK" # type: ignore[misc]
|
||||||
|
|
||||||
|
def test_rest_agg_trade_stores_complete_transport_contract() -> None:
|
||||||
|
trade = DzengiRestAggTrade(
|
||||||
|
aggregate_trade_id=2134857062,
|
||||||
|
price="64497.25",
|
||||||
|
quantity="0.005",
|
||||||
|
timestamp=1784218066823,
|
||||||
|
buyer_is_maker=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert trade.aggregate_trade_id == 2134857062
|
||||||
|
assert trade.price == "64497.25"
|
||||||
|
assert trade.quantity == "0.005"
|
||||||
|
assert trade.timestamp == 1784218066823
|
||||||
|
assert trade.buyer_is_maker is False
|
||||||
|
|
||||||
|
|
||||||
|
def test_rest_agg_trade_preserves_raw_numeric_values() -> None:
|
||||||
|
trade = DzengiRestAggTrade(
|
||||||
|
aggregate_trade_id=2134846831,
|
||||||
|
price=64555.55,
|
||||||
|
quantity=2,
|
||||||
|
timestamp=1784218012030,
|
||||||
|
buyer_is_maker=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert trade.price == 64555.55
|
||||||
|
assert isinstance(trade.price, float)
|
||||||
|
assert trade.quantity == 2
|
||||||
|
assert isinstance(trade.quantity, int)
|
||||||
|
|
||||||
|
|
||||||
|
def test_rest_agg_trade_is_immutable_and_uses_slots() -> None:
|
||||||
|
trade = DzengiRestAggTrade(
|
||||||
|
aggregate_trade_id=2134857062,
|
||||||
|
price="64497.25",
|
||||||
|
quantity="0.005",
|
||||||
|
timestamp=1784218066823,
|
||||||
|
buyer_is_maker=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert not hasattr(trade, "__dict__")
|
||||||
|
|
||||||
|
with pytest.raises(FrozenInstanceError):
|
||||||
|
trade.price = "1.00" # type: ignore[misc]
|
||||||
|
|||||||
1401
docs/migrations/build_060_2.md
Normal file
1401
docs/migrations/build_060_2.md
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user