Remove support for datetime type and improve typing in several files.

This commit is contained in:
Davide Casale
2023-05-26 18:48:27 +02:00
parent bc0f83d408
commit 7059846843
5 changed files with 24 additions and 26 deletions

View File

@@ -1,12 +1,12 @@
from typing import Dict, List, Tuple, Union, Literal, Optional from typing import Dict, List, Tuple, Union, Literal, Optional
from decimal import Decimal from decimal import Decimal
from datetime import datetime
from ..middleware import Middleware from ..middleware import Middleware
from ..enums import Sort, OrderType, FundingOfferType from ..enums import Sort, OrderType, FundingOfferType
from ...types import JSON, Notification, \ from ...types import Notification, \
UserInfo, LoginHistory, BalanceAvailable, \ UserInfo, LoginHistory, BalanceAvailable, \
Order, Position, Trade, \ Order, Position, Trade, \
FundingTrade, OrderTrade, Ledger, \ FundingTrade, OrderTrade, Ledger, \
@@ -22,6 +22,8 @@ from ...types import serializers
from ...types.serializers import _Notification from ...types.serializers import _Notification
from ...utils.json_encoder import JSON
class RestAuthenticatedEndpoints(Middleware): class RestAuthenticatedEndpoints(Middleware):
def get_user_info(self) -> UserInfo: def get_user_info(self) -> UserInfo:
return serializers.UserInfo \ return serializers.UserInfo \
@@ -74,7 +76,7 @@ class RestAuthenticatedEndpoints(Middleware):
gid: Optional[int] = None, gid: Optional[int] = None,
cid: Optional[int] = None, cid: Optional[int] = None,
flags: Optional[int] = 0, flags: Optional[int] = 0,
tif: Optional[Union[datetime, str]] = None, tif: Optional[str] = None,
meta: Optional[JSON] = None) -> Notification[Order]: meta: Optional[JSON] = None) -> Notification[Order]:
body = { body = {
"type": type, "symbol": symbol, "amount": amount, "type": type, "symbol": symbol, "amount": amount,
@@ -100,7 +102,7 @@ class RestAuthenticatedEndpoints(Middleware):
delta: Optional[Union[Decimal, float, str]] = None, delta: Optional[Union[Decimal, float, str]] = None,
price_aux_limit: Optional[Union[Decimal, float, str]] = None, price_aux_limit: Optional[Union[Decimal, float, str]] = None,
price_trailing: Optional[Union[Decimal, float, str]] = None, price_trailing: Optional[Union[Decimal, float, str]] = None,
tif: Optional[Union[datetime, str]] = None) -> Notification[Order]: tif: Optional[str] = None) -> Notification[Order]:
body = { body = {
"id": id, "amount": amount, "price": price, "id": id, "amount": amount, "price": price,
"cid": cid, "cid_date": cid_date, "gid": gid, "cid": cid, "cid_date": cid_date, "gid": gid,

View File

@@ -1,4 +1,4 @@
from .dataclasses import JSON, \ from .dataclasses import \
PlatformStatus, TradingPairTicker, FundingCurrencyTicker, \ PlatformStatus, TradingPairTicker, FundingCurrencyTicker, \
TickersHistory, TradingPairTrade, FundingCurrencyTrade, \ TickersHistory, TradingPairTrade, FundingCurrencyTrade, \
TradingPairBook, FundingCurrencyBook, TradingPairRawBook, \ TradingPairBook, FundingCurrencyBook, TradingPairRawBook, \

View File

@@ -1,11 +1,11 @@
from typing import Union, Type, \ from typing import \
List, Dict, Literal, Optional, Any List, Dict, Literal, Optional, Any
from dataclasses import dataclass from dataclasses import dataclass
from .labeler import _Type, partial, compose from .labeler import _Type, partial, compose
JSON = Union[Dict[str, "JSON"], List["JSON"], bool, int, float, str, Type[None]] from ..utils.json_encoder import JSON
#region Dataclass definitions for types of public use #region Dataclass definitions for types of public use

View File

@@ -1,33 +1,32 @@
import json import json
from decimal import Decimal from decimal import Decimal
from datetime import datetime
from typing import Type, List, Dict, Union, Any from typing import List, Dict, Union
JSON = Union[Dict[str, "JSON"], List["JSON"], bool, int, float, str, Type[None]] JSON = Union[Dict[str, "JSON"], List["JSON"], bool, int, float, str, None]
_CustomJSON = Union[Dict[str, "_CustomJSON"], List["_CustomJSON"], \
bool, int, float, str, Decimal, None]
def _strip(dictionary: Dict) -> Dict: def _strip(dictionary: Dict) -> Dict:
return { key: value for key, value in dictionary.items() if value is not None } return { key: value for key, value in dictionary.items() if value is not None }
def _convert_data_to_json(data: JSON) -> JSON: def _convert_data_to_json(data: _CustomJSON) -> JSON:
if isinstance(data, bool): if isinstance(data, bool):
return int(data) return int(data)
if isinstance(data, float): if isinstance(data, float):
return format(Decimal(repr(data)), "f") return format(Decimal(repr(data)), "f")
if isinstance(data, Decimal):
return format(data, "f")
if isinstance(data, list): if isinstance(data, list):
return [ _convert_data_to_json(sub_data) for sub_data in data ] return [ _convert_data_to_json(sub_data) for sub_data in data ]
if isinstance(data, dict): if isinstance(data, dict):
return _strip({ key: _convert_data_to_json(value) for key, value in data.items() }) return _strip({ key: _convert_data_to_json(value) for key, value in data.items() })
return data return data
class JSONEncoder(json.JSONEncoder): class JSONEncoder(json.JSONEncoder):
def encode(self, o: JSON) -> str: def encode(self, o: _CustomJSON) -> str:
return json.JSONEncoder.encode(self, _convert_data_to_json(o)) return json.JSONEncoder.encode(self, _convert_data_to_json(o))
def default(self, o: Any) -> Any:
if isinstance(o, Decimal):
return format(o, "f")
if isinstance(o, datetime):
return str(o)
return json.JSONEncoder.default(self, o)

View File

@@ -5,12 +5,10 @@ if TYPE_CHECKING:
from bfxapi.enums import \ from bfxapi.enums import \
OrderType, FundingOfferType OrderType, FundingOfferType
from bfxapi.types import JSON from bfxapi.utils.json_encoder import JSON
from decimal import Decimal from decimal import Decimal
from datetime import datetime
class BfxWebSocketInputs: class BfxWebSocketInputs:
def __init__(self, handle_websocket_input: Callable[[str, Any], Awaitable[None]]) -> None: def __init__(self, handle_websocket_input: Callable[[str, Any], Awaitable[None]]) -> None:
self.__handle_websocket_input = handle_websocket_input self.__handle_websocket_input = handle_websocket_input
@@ -28,9 +26,8 @@ class BfxWebSocketInputs:
gid: Optional[int] = None, gid: Optional[int] = None,
cid: Optional[int] = None, cid: Optional[int] = None,
flags: Optional[int] = 0, flags: Optional[int] = 0,
tif: Optional[Union["datetime", str]] = None, tif: Optional[str] = None,
meta: Optional["JSON"] = None) -> None: meta: Optional["JSON"] = None) -> None:
await self.__handle_websocket_input("on", { await self.__handle_websocket_input("on", {
"type": type, "symbol": symbol, "amount": amount, "type": type, "symbol": symbol, "amount": amount,
"price": price, "lev": lev, "price_trailing": price_trailing, "price": price, "lev": lev, "price_trailing": price_trailing,
@@ -52,7 +49,7 @@ class BfxWebSocketInputs:
delta: Optional[Union["Decimal", float, str]] = None, delta: Optional[Union["Decimal", float, str]] = None,
price_aux_limit: Optional[Union["Decimal", float, str]] = None, price_aux_limit: Optional[Union["Decimal", float, str]] = None,
price_trailing: Optional[Union["Decimal", float, str]] = None, price_trailing: Optional[Union["Decimal", float, str]] = None,
tif: Optional[Union["datetime", str]] = None) -> None: tif: Optional[str] = None) -> None:
await self.__handle_websocket_input("ou", { await self.__handle_websocket_input("ou", {
"id": id, "amount": amount, "price": price, "id": id, "amount": amount, "price": price,
"cid": cid, "cid_date": cid_date, "gid": gid, "cid": cid, "cid_date": cid_date, "gid": gid,