Rename bfxapi/websocket/typings.py to types.py. Replace TypedDicts with dataclasses (with _Type as base class). Update demos in examples/websocket to use new implementation.

This commit is contained in:
Davide Casale
2023-01-16 17:07:16 +01:00
parent 1613a56d81
commit e185da4cc9
4 changed files with 77 additions and 49 deletions

View File

@@ -2,7 +2,7 @@ from decimal import Decimal
from datetime import datetime from datetime import datetime
from typing import Union, Optional, List, Tuple from typing import Union, Optional, List, Tuple
from .typings import JSON from .types import JSON
from .enums import OrderType, FundingOfferType from .enums import OrderType, FundingOfferType
def _strip(dictionary): def _strip(dictionary):

View File

@@ -1,3 +1,7 @@
from typing import List
from .types import *
from . import serializers from . import serializers
from .enums import Channels from .enums import Channels
from .exceptions import BfxWebsocketException from .exceptions import BfxWebsocketException
@@ -174,13 +178,15 @@ class AuthenticatedChannelsHandler(object):
raise BfxWebsocketException(f"Event of type <{type}> not found in self.__handlers.") raise BfxWebsocketException(f"Event of type <{type}> not found in self.__handlers.")
def __notification(self, stream): def __notification(self, stream):
type, serializer = "notification", serializers._Notification(serializer=None)
if stream[1] == "on-req" or stream[1] == "ou-req" or stream[1] == "oc-req": if stream[1] == "on-req" or stream[1] == "ou-req" or stream[1] == "oc-req":
return self.event_emitter.emit(f"{stream[1]}-notification", serializers._Notification(serializer=serializers.Order).parse(*stream)) type, serializer = f"{stream[1]}-notification", serializers._Notification[Order](serializer=serializers.Order)
if stream[1] == "oc_multi-req": if stream[1] == "oc_multi-req":
return self.event_emitter.emit(f"{stream[1]}-notification", serializers._Notification(serializer=serializers.Order, iterate=True).parse(*stream)) type, serializer = f"{stream[1]}-notification", serializers._Notification[List[Order]](serializer=serializers.Order, iterate=True)
if stream[1] == "fon-req" or stream[1] == "foc-req": if stream[1] == "fon-req" or stream[1] == "foc-req":
return self.event_emitter.emit(f"{stream[1]}-notification", serializers._Notification(serializer=serializers.FundingOffer).parse(*stream)) type, serializer = f"{stream[1]}-notification", serializers._Notification[FundingOffer](serializer=serializers.FundingOffer)
return self.event_emitter.emit("notification", serializers._Notification(serializer=None).parse(*stream)) return self.event_emitter.emit(type, serializer.parse(*stream))

View File

@@ -1,4 +1,4 @@
from . import typings from . import types
from .. labeler import _Serializer from .. labeler import _Serializer
@@ -6,7 +6,7 @@ from .. notification import _Notification
#region Serializers definition for Websocket Public Channels #region Serializers definition for Websocket Public Channels
TradingPairTicker = _Serializer[typings.TradingPairTicker]("TradingPairTicker", labels=[ TradingPairTicker = _Serializer[types.TradingPairTicker]("TradingPairTicker", labels=[
"BID", "BID",
"BID_SIZE", "BID_SIZE",
"ASK", "ASK",
@@ -19,7 +19,7 @@ TradingPairTicker = _Serializer[typings.TradingPairTicker]("TradingPairTicker",
"LOW" "LOW"
]) ])
FundingCurrencyTicker = _Serializer[typings.FundingCurrencyTicker]("FundingCurrencyTicker", labels=[ FundingCurrencyTicker = _Serializer[types.FundingCurrencyTicker]("FundingCurrencyTicker", labels=[
"FRR", "FRR",
"BID", "BID",
"BID_PERIOD", "BID_PERIOD",
@@ -38,14 +38,14 @@ FundingCurrencyTicker = _Serializer[typings.FundingCurrencyTicker]("FundingCurre
"FRR_AMOUNT_AVAILABLE" "FRR_AMOUNT_AVAILABLE"
]) ])
TradingPairTrade = _Serializer[typings.TradingPairTrade]("TradingPairTrade", labels=[ TradingPairTrade = _Serializer[types.TradingPairTrade]("TradingPairTrade", labels=[
"ID", "ID",
"MTS", "MTS",
"AMOUNT", "AMOUNT",
"PRICE" "PRICE"
]) ])
FundingCurrencyTrade = _Serializer[typings.FundingCurrencyTrade]("FundingCurrencyTrade", labels=[ FundingCurrencyTrade = _Serializer[types.FundingCurrencyTrade]("FundingCurrencyTrade", labels=[
"ID", "ID",
"MTS", "MTS",
"AMOUNT", "AMOUNT",
@@ -53,33 +53,33 @@ FundingCurrencyTrade = _Serializer[typings.FundingCurrencyTrade]("FundingCurrenc
"PERIOD" "PERIOD"
]) ])
TradingPairBook = _Serializer[typings.TradingPairBook]("TradingPairBook", labels=[ TradingPairBook = _Serializer[types.TradingPairBook]("TradingPairBook", labels=[
"PRICE", "PRICE",
"COUNT", "COUNT",
"AMOUNT" "AMOUNT"
]) ])
FundingCurrencyBook = _Serializer[typings.FundingCurrencyBook]("FundingCurrencyBook", labels=[ FundingCurrencyBook = _Serializer[types.FundingCurrencyBook]("FundingCurrencyBook", labels=[
"RATE", "RATE",
"PERIOD", "PERIOD",
"COUNT", "COUNT",
"AMOUNT" "AMOUNT"
]) ])
TradingPairRawBook = _Serializer[typings.TradingPairRawBook]("TradingPairRawBook", labels=[ TradingPairRawBook = _Serializer[types.TradingPairRawBook]("TradingPairRawBook", labels=[
"ORDER_ID", "ORDER_ID",
"PRICE", "PRICE",
"AMOUNT" "AMOUNT"
]) ])
FundingCurrencyRawBook = _Serializer[typings.FundingCurrencyRawBook]("FundingCurrencyRawBook", labels=[ FundingCurrencyRawBook = _Serializer[types.FundingCurrencyRawBook]("FundingCurrencyRawBook", labels=[
"OFFER_ID", "OFFER_ID",
"PERIOD", "PERIOD",
"RATE", "RATE",
"AMOUNT" "AMOUNT"
]) ])
Candle = _Serializer[typings.Candle]("Candle", labels=[ Candle = _Serializer[types.Candle]("Candle", labels=[
"MTS", "MTS",
"OPEN", "OPEN",
"CLOSE", "CLOSE",
@@ -88,7 +88,7 @@ Candle = _Serializer[typings.Candle]("Candle", labels=[
"VOLUME" "VOLUME"
]) ])
DerivativesStatus = _Serializer[typings.DerivativesStatus]("DerivativesStatus", labels=[ DerivativesStatus = _Serializer[types.DerivativesStatus]("DerivativesStatus", labels=[
"TIME_MS", "TIME_MS",
"_PLACEHOLDER", "_PLACEHOLDER",
"DERIV_PRICE", "DERIV_PRICE",
@@ -118,7 +118,7 @@ DerivativesStatus = _Serializer[typings.DerivativesStatus]("DerivativesStatus",
#region Serializers definition for Websocket Authenticated Channels #region Serializers definition for Websocket Authenticated Channels
Order = _Serializer[typings.Order]("Order", labels=[ Order = _Serializer[types.Order]("Order", labels=[
"ID", "ID",
"GID", "GID",
"CID", "CID",
@@ -153,7 +153,7 @@ Order = _Serializer[typings.Order]("Order", labels=[
"META" "META"
]) ])
Position = _Serializer[typings.Position]("Position", labels=[ Position = _Serializer[types.Position]("Position", labels=[
"SYMBOL", "SYMBOL",
"STATUS", "STATUS",
"AMOUNT", "AMOUNT",
@@ -176,7 +176,7 @@ Position = _Serializer[typings.Position]("Position", labels=[
"META" "META"
]) ])
TradeExecuted = _Serializer[typings.TradeExecuted]("TradeExecuted", labels=[ TradeExecuted = _Serializer[types.TradeExecuted]("TradeExecuted", labels=[
"ID", "ID",
"SYMBOL", "SYMBOL",
"MTS_CREATE", "MTS_CREATE",
@@ -191,7 +191,7 @@ TradeExecuted = _Serializer[typings.TradeExecuted]("TradeExecuted", labels=[
"CID" "CID"
]) ])
TradeExecutionUpdate = _Serializer[typings.TradeExecutionUpdate]("TradeExecutionUpdate", labels=[ TradeExecutionUpdate = _Serializer[types.TradeExecutionUpdate]("TradeExecutionUpdate", labels=[
"ID", "ID",
"SYMBOL", "SYMBOL",
"MTS_CREATE", "MTS_CREATE",
@@ -206,7 +206,7 @@ TradeExecutionUpdate = _Serializer[typings.TradeExecutionUpdate]("TradeExecution
"CID" "CID"
]) ])
FundingOffer = _Serializer[typings.FundingOffer]("FundingOffer", labels=[ FundingOffer = _Serializer[types.FundingOffer]("FundingOffer", labels=[
"ID", "ID",
"SYMBOL", "SYMBOL",
"MTS_CREATED", "MTS_CREATED",
@@ -230,7 +230,7 @@ FundingOffer = _Serializer[typings.FundingOffer]("FundingOffer", labels=[
"_PLACEHOLDER" "_PLACEHOLDER"
]) ])
FundingCredit = _Serializer[typings.FundingCredit]("FundingCredit", labels=[ FundingCredit = _Serializer[types.FundingCredit]("FundingCredit", labels=[
"ID", "ID",
"SYMBOL", "SYMBOL",
"SIDE", "SIDE",
@@ -255,7 +255,7 @@ FundingCredit = _Serializer[typings.FundingCredit]("FundingCredit", labels=[
"POSITION_PAIR" "POSITION_PAIR"
]) ])
FundingLoan = _Serializer[typings.FundingLoan]("FundingLoan", labels=[ FundingLoan = _Serializer[types.FundingLoan]("FundingLoan", labels=[
"ID", "ID",
"SYMBOL", "SYMBOL",
"SIDE", "SIDE",
@@ -279,7 +279,7 @@ FundingLoan = _Serializer[typings.FundingLoan]("FundingLoan", labels=[
"NO_CLOSE" "NO_CLOSE"
]) ])
Wallet = _Serializer[typings.Wallet]("Wallet", labels=[ Wallet = _Serializer[types.Wallet]("Wallet", labels=[
"WALLET_TYPE", "WALLET_TYPE",
"CURRENCY", "CURRENCY",
"BALANCE", "BALANCE",
@@ -289,7 +289,7 @@ Wallet = _Serializer[typings.Wallet]("Wallet", labels=[
"META" "META"
]) ])
BalanceInfo = _Serializer[typings.BalanceInfo]("BalanceInfo", labels=[ BalanceInfo = _Serializer[types.BalanceInfo]("BalanceInfo", labels=[
"AUM", "AUM",
"AUM_NET", "AUM_NET",
]) ])

View File

@@ -1,6 +1,10 @@
from typing import Type, Tuple, List, Dict, TypedDict, Union, Optional, Any from typing import Type, Tuple, List, Dict, TypedDict, Union, Optional, Any
from .. notification import Notification from dataclasses import dataclass
from ..labeler import _Type
from ..notification import Notification
JSON = Union[Dict[str, "JSON"], List["JSON"], bool, int, float, str, Type[None]] JSON = Union[Dict[str, "JSON"], List["JSON"], bool, int, float, str, Type[None]]
@@ -48,7 +52,8 @@ class Subscriptions:
#region Type hinting for Websocket Public Channels #region Type hinting for Websocket Public Channels
class TradingPairTicker(TypedDict): @dataclass
class TradingPairTicker(_Type):
BID: float BID: float
BID_SIZE: float BID_SIZE: float
ASK: float ASK: float
@@ -60,7 +65,8 @@ class TradingPairTicker(TypedDict):
HIGH: float HIGH: float
LOW: float LOW: float
class FundingCurrencyTicker(TypedDict): @dataclass
class FundingCurrencyTicker(_Type):
FRR: float FRR: float
BID: float BID: float
BID_PERIOD: int BID_PERIOD: int
@@ -76,42 +82,49 @@ class FundingCurrencyTicker(TypedDict):
LOW: float LOW: float
FRR_AMOUNT_AVAILABLE: float FRR_AMOUNT_AVAILABLE: float
class TradingPairTrade(TypedDict): @dataclass
class TradingPairTrade(_Type):
ID: int ID: int
MTS: int MTS: int
AMOUNT: float AMOUNT: float
PRICE: float PRICE: float
class FundingCurrencyTrade(TypedDict): @dataclass
class FundingCurrencyTrade(_Type):
ID: int ID: int
MTS: int MTS: int
AMOUNT: float AMOUNT: float
RATE: float RATE: float
PERIOD: int PERIOD: int
class TradingPairBook(TypedDict): @dataclass
class TradingPairBook(_Type):
PRICE: float PRICE: float
COUNT: int COUNT: int
AMOUNT: float AMOUNT: float
class FundingCurrencyBook(TypedDict): @dataclass
class FundingCurrencyBook(_Type):
RATE: float RATE: float
PERIOD: int PERIOD: int
COUNT: int COUNT: int
AMOUNT: float AMOUNT: float
class TradingPairRawBook(TypedDict): @dataclass
class TradingPairRawBook(_Type):
ORDER_ID: int ORDER_ID: int
PRICE: float PRICE: float
AMOUNT: float AMOUNT: float
class FundingCurrencyRawBook(TypedDict): @dataclass
class FundingCurrencyRawBook(_Type):
OFFER_ID: int OFFER_ID: int
PERIOD: int PERIOD: int
RATE: float RATE: float
AMOUNT: float AMOUNT: float
class Candle(TypedDict): @dataclass
class Candle(_Type):
MTS: int MTS: int
OPEN: float OPEN: float
CLOSE: float CLOSE: float
@@ -119,7 +132,8 @@ class Candle(TypedDict):
LOW: float LOW: float
VOLUME: float VOLUME: float
class DerivativesStatus(TypedDict): @dataclass
class DerivativesStatus(_Type):
TIME_MS: int TIME_MS: int
DERIV_PRICE: float DERIV_PRICE: float
SPOT_PRICE: float SPOT_PRICE: float
@@ -136,8 +150,8 @@ class DerivativesStatus(TypedDict):
#endregion #endregion
#region Type hinting for Websocket Authenticated Channels #region Type hinting for Websocket Authenticated Channels
@dataclass
class Order(TypedDict): class Order(_Type):
ID: int ID: int
GID: int GID: int
CID: int CID: int
@@ -161,7 +175,8 @@ class Order(TypedDict):
ROUTING: str ROUTING: str
META: JSON META: JSON
class Position(TypedDict): @dataclass
class Position(_Type):
SYMBOL: str SYMBOL: str
STATUS: str STATUS: str
AMOUNT: float AMOUNT: float
@@ -180,7 +195,8 @@ class Position(TypedDict):
COLLATERAL_MIN: float COLLATERAL_MIN: float
META: JSON META: JSON
class TradeExecuted(TypedDict): @dataclass
class TradeExecuted(_Type):
ID: int ID: int
SYMBOL: str SYMBOL: str
MTS_CREATE: int MTS_CREATE: int
@@ -192,7 +208,8 @@ class TradeExecuted(TypedDict):
MAKER:int MAKER:int
CID: int CID: int
class TradeExecutionUpdate(TypedDict): @dataclass
class TradeExecutionUpdate(_Type):
ID: int ID: int
SYMBOL: str SYMBOL: str
MTS_CREATE: int MTS_CREATE: int
@@ -206,7 +223,8 @@ class TradeExecutionUpdate(TypedDict):
FEE_CURRENCY: str FEE_CURRENCY: str
CID: int CID: int
class FundingOffer(TypedDict): @dataclass
class FundingOffer(_Type):
ID: int ID: int
SYMBOL: str SYMBOL: str
MTS_CREATED: int MTS_CREATED: int
@@ -222,7 +240,8 @@ class FundingOffer(TypedDict):
HIDDEN: int HIDDEN: int
RENEW: int RENEW: int
class FundingCredit(TypedDict): @dataclass
class FundingCredit(_Type):
ID: int ID: int
SYMBOL: str SYMBOL: str
SIDE: int SIDE: int
@@ -242,7 +261,8 @@ class FundingCredit(TypedDict):
NO_CLOSE: int NO_CLOSE: int
POSITION_PAIR: str POSITION_PAIR: str
class FundingLoan(TypedDict): @dataclass
class FundingLoan(_Type):
ID: int ID: int
SYMBOL: str SYMBOL: str
SIDE: int SIDE: int
@@ -261,7 +281,8 @@ class FundingLoan(TypedDict):
RATE_REAL: float RATE_REAL: float
NO_CLOSE: int NO_CLOSE: int
class Wallet(TypedDict): @dataclass
class Wallet(_Type):
WALLET_TYPE: str WALLET_TYPE: str
CURRENCY: str CURRENCY: str
BALANCE: float BALANCE: float
@@ -270,7 +291,8 @@ class Wallet(TypedDict):
DESCRIPTION: str DESCRIPTION: str
META: JSON META: JSON
class BalanceInfo(TypedDict): @dataclass
class BalanceInfo(_Type):
AUM: float AUM: float
AUM_NET: float AUM_NET: float