Replace SimpleNamespaces with dataclasses. Add base class _Typing in labeler.py to convert dictionaries to dataclasses. Remove SimpleNamespace references.

This commit is contained in:
Davide Casale
2023-01-16 16:30:06 +01:00
parent 903f68c6e3
commit 0bb9f65a19
3 changed files with 66 additions and 36 deletions

View File

@@ -2,10 +2,13 @@ from .exceptions import LabelerSerializerException
from typing import Generic, TypeVar, Iterable, Optional, List, Tuple, Any, cast from typing import Generic, TypeVar, Iterable, Optional, List, Tuple, Any, cast
from types import SimpleNamespace
T = TypeVar("T") T = TypeVar("T")
class _Typing(object):
def __init__(self, **kwargs):
for key, value in kwargs.items():
self.__setattr__(key,value)
class _Serializer(Generic[T]): class _Serializer(Generic[T]):
def __init__(self, name: str, labels: List[str], IGNORE: List[str] = [ "_PLACEHOLDER" ]): def __init__(self, name: str, labels: List[str], IGNORE: List[str] = [ "_PLACEHOLDER" ]):
self.name, self.__labels, self.__IGNORE = name, labels, IGNORE self.name, self.__labels, self.__IGNORE = name, labels, IGNORE
@@ -21,4 +24,4 @@ class _Serializer(Generic[T]):
yield label, args[index] yield label, args[index]
def parse(self, *values: Any, skip: Optional[List[str]] = None) -> T: def parse(self, *values: Any, skip: Optional[List[str]] = None) -> T:
return cast(T, SimpleNamespace(**dict(self._serialize(*values, skip=skip)))) return cast(T, _Typing(**dict(self._serialize(*values, skip=skip))))

View File

@@ -1,12 +1,13 @@
from typing import List, Dict, Union, Optional, Any, TypedDict, Generic, TypeVar, cast from typing import List, Dict, Union, Optional, Any, TypedDict, Generic, TypeVar, cast
from types import SimpleNamespace from dataclasses import dataclass
from .labeler import _Serializer from .labeler import _Typing, _Serializer
T = TypeVar("T") T = TypeVar("T")
class Notification(SimpleNamespace, Generic[T]): @dataclass
class Notification(_Typing, Generic[T]):
MTS: int MTS: int
TYPE: str TYPE: str
MESSAGE_ID: Optional[int] MESSAGE_ID: Optional[int]
@@ -24,7 +25,7 @@ class _Notification(_Serializer, Generic[T]):
self.serializer, self.iterate = serializer, iterate self.serializer, self.iterate = serializer, iterate
def parse(self, *values: Any, skip: Optional[List[str]] = None) -> Notification[T]: def parse(self, *values: Any, skip: Optional[List[str]] = None) -> Notification[T]:
notification = cast(Notification[T], SimpleNamespace(**dict(self._serialize(*values)))) notification = cast(Notification[T], _Typing(**dict(self._serialize(*values))))
if isinstance(self.serializer, _Serializer): if isinstance(self.serializer, _Serializer):
NOTIFY_INFO = cast(List[Any], notification.NOTIFY_INFO) NOTIFY_INFO = cast(List[Any], notification.NOTIFY_INFO)
@@ -33,7 +34,7 @@ class _Notification(_Serializer, Generic[T]):
if len(NOTIFY_INFO) == 1 and isinstance(NOTIFY_INFO[0], list): if len(NOTIFY_INFO) == 1 and isinstance(NOTIFY_INFO[0], list):
NOTIFY_INFO = NOTIFY_INFO[0] NOTIFY_INFO = NOTIFY_INFO[0]
notification.NOTIFY_INFO = cast(T, SimpleNamespace(**dict(self.serializer._serialize(*NOTIFY_INFO, skip=skip)))) notification.NOTIFY_INFO = cast(T, _Typing(**dict(self.serializer._serialize(*NOTIFY_INFO, skip=skip))))
else: notification.NOTIFY_INFO = cast(T, [ SimpleNamespace(**dict(self.serializer._serialize(*data, skip=skip))) for data in NOTIFY_INFO ]) else: notification.NOTIFY_INFO = cast(T, [ _Typing(**dict(self.serializer._serialize(*data, skip=skip))) for data in NOTIFY_INFO ])
return notification return notification

View File

@@ -1,6 +1,8 @@
from typing import Type, Tuple, List, Dict, TypedDict, Union, Optional, Any from typing import Type, Tuple, List, Dict, TypedDict, Union, Optional, Any
from types import SimpleNamespace from dataclasses import dataclass
from .. labeler import _Typing
from .. notification import Notification from .. notification import Notification
@@ -8,10 +10,12 @@ JSON = Union[Dict[str, "JSON"], List["JSON"], bool, int, float, str, Type[None]]
#region Type hinting for Rest Public Endpoints #region Type hinting for Rest Public Endpoints
class PlatformStatus(SimpleNamespace): @dataclass
class PlatformStatus(_Typing):
OPERATIVE: int OPERATIVE: int
class TradingPairTicker(SimpleNamespace): @dataclass
class TradingPairTicker(_Typing):
SYMBOL: Optional[str] SYMBOL: Optional[str]
BID: float BID: float
BID_SIZE: float BID_SIZE: float
@@ -24,7 +28,8 @@ class TradingPairTicker(SimpleNamespace):
HIGH: float HIGH: float
LOW: float LOW: float
class FundingCurrencyTicker(SimpleNamespace): @dataclass
class FundingCurrencyTicker(_Typing):
SYMBOL: Optional[str] SYMBOL: Optional[str]
FRR: float FRR: float
BID: float BID: float
@@ -41,52 +46,61 @@ class FundingCurrencyTicker(SimpleNamespace):
LOW: float LOW: float
FRR_AMOUNT_AVAILABLE: float FRR_AMOUNT_AVAILABLE: float
class TickersHistory(SimpleNamespace): @dataclass
class TickersHistory(_Typing):
SYMBOL: str SYMBOL: str
BID: float BID: float
ASK: float ASK: float
MTS: int MTS: int
class TradingPairTrade(SimpleNamespace): @dataclass
class TradingPairTrade(_Typing):
ID: int ID: int
MTS: int MTS: int
AMOUNT: float AMOUNT: float
PRICE: float PRICE: float
class FundingCurrencyTrade(SimpleNamespace): @dataclass
class FundingCurrencyTrade(_Typing):
ID: int ID: int
MTS: int MTS: int
AMOUNT: float AMOUNT: float
RATE: float RATE: float
PERIOD: int PERIOD: int
class TradingPairBook(SimpleNamespace): @dataclass
class TradingPairBook(_Typing):
PRICE: float PRICE: float
COUNT: int COUNT: int
AMOUNT: float AMOUNT: float
class FundingCurrencyBook(SimpleNamespace): @dataclass
class FundingCurrencyBook(_Typing):
RATE: float RATE: float
PERIOD: int PERIOD: int
COUNT: int COUNT: int
AMOUNT: float AMOUNT: float
class TradingPairRawBook(SimpleNamespace): @dataclass
class TradingPairRawBook(_Typing):
ORDER_ID: int ORDER_ID: int
PRICE: float PRICE: float
AMOUNT: float AMOUNT: float
class FundingCurrencyRawBook(SimpleNamespace): @dataclass
class FundingCurrencyRawBook(_Typing):
OFFER_ID: int OFFER_ID: int
PERIOD: int PERIOD: int
RATE: float RATE: float
AMOUNT: float AMOUNT: float
class Statistic(SimpleNamespace): @dataclass
class Statistic(_Typing):
MTS: int MTS: int
VALUE: float VALUE: float
class Candle(SimpleNamespace): @dataclass
class Candle(_Typing):
MTS: int MTS: int
OPEN: float OPEN: float
CLOSE: float CLOSE: float
@@ -94,7 +108,8 @@ class Candle(SimpleNamespace):
LOW: float LOW: float
VOLUME: float VOLUME: float
class DerivativesStatus(SimpleNamespace): @dataclass
class DerivativesStatus(_Typing):
KEY: Optional[str] KEY: Optional[str]
MTS: int MTS: int
DERIV_PRICE: float DERIV_PRICE: float
@@ -109,7 +124,8 @@ class DerivativesStatus(SimpleNamespace):
CLAMP_MIN: float CLAMP_MIN: float
CLAMP_MAX: float CLAMP_MAX: float
class Liquidation(SimpleNamespace): @dataclass
class Liquidation(_Typing):
POS_ID: int POS_ID: int
MTS: int MTS: int
SYMBOL: str SYMBOL: str
@@ -119,14 +135,16 @@ class Liquidation(SimpleNamespace):
IS_MARKET_SOLD: int IS_MARKET_SOLD: int
PRICE_ACQUIRED: float PRICE_ACQUIRED: float
class Leaderboard(SimpleNamespace): @dataclass
class Leaderboard(_Typing):
MTS: int MTS: int
USERNAME: str USERNAME: str
RANKING: int RANKING: int
VALUE: float VALUE: float
TWITTER_HANDLE: Optional[str] TWITTER_HANDLE: Optional[str]
class FundingStatistic(SimpleNamespace): @dataclass
class FundingStatistic(_Typing):
TIMESTAMP: int TIMESTAMP: int
FRR: float FRR: float
AVG_PERIOD: float AVG_PERIOD: float
@@ -138,7 +156,8 @@ class FundingStatistic(SimpleNamespace):
#region Type hinting for Rest Authenticated Endpoints #region Type hinting for Rest Authenticated Endpoints
class Wallet(SimpleNamespace): @dataclass
class Wallet(_Typing):
WALLET_TYPE: str WALLET_TYPE: str
CURRENCY: str CURRENCY: str
BALANCE: float BALANCE: float
@@ -147,7 +166,8 @@ class Wallet(SimpleNamespace):
LAST_CHANGE: str LAST_CHANGE: str
TRADE_DETAILS: JSON TRADE_DETAILS: JSON
class Order(SimpleNamespace): @dataclass
class Order(_Typing):
ID: int ID: int
GID: int GID: int
CID: int CID: int
@@ -171,7 +191,8 @@ class Order(SimpleNamespace):
ROUTING: str ROUTING: str
META: JSON META: JSON
class Position(SimpleNamespace): @dataclass
class Position(_Typing):
SYMBOL: str SYMBOL: str
STATUS: str STATUS: str
AMOUNT: float AMOUNT: float
@@ -190,7 +211,8 @@ class Position(SimpleNamespace):
COLLATERAL_MIN: float COLLATERAL_MIN: float
META: JSON META: JSON
class FundingOffer(SimpleNamespace): @dataclass
class FundingOffer(_Typing):
ID: int ID: int
SYMBOL: str SYMBOL: str
MTS_CREATE: int MTS_CREATE: int
@@ -206,7 +228,8 @@ class FundingOffer(SimpleNamespace):
HIDDEN: int HIDDEN: int
RENEW: bool RENEW: bool
class Trade(SimpleNamespace): @dataclass
class Trade(_Typing):
ID: int ID: int
SYMBOL: str SYMBOL: str
MTS_CREATE: int MTS_CREATE: int
@@ -220,7 +243,8 @@ class Trade(SimpleNamespace):
FEE_CURRENCY: str FEE_CURRENCY: str
CID: int CID: int
class OrderTrade(SimpleNamespace): @dataclass
class OrderTrade(_Typing):
ID: int ID: int
SYMBOL: str SYMBOL: str
MTS_CREATE: int MTS_CREATE: int
@@ -232,7 +256,8 @@ class OrderTrade(SimpleNamespace):
FEE_CURRENCY: str FEE_CURRENCY: str
CID: int CID: int
class Ledger(SimpleNamespace): @dataclass
class Ledger(_Typing):
ID: int ID: int
CURRENCY: str CURRENCY: str
MTS: int MTS: int
@@ -240,7 +265,8 @@ class Ledger(SimpleNamespace):
BALANCE: float BALANCE: float
description: str description: str
class FundingCredit(SimpleNamespace): @dataclass
class FundingCredit(_Typing):
ID: int ID: int
SYMBOL: str SYMBOL: str
SIDE: int SIDE: int