Skip to content

Commit f7b68ca

Browse files
committed
feat: update websocket types
1 parent 14d2ef6 commit f7b68ca

14 files changed

+99
-41
lines changed

cryptomarket/websockets/callback_cache.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
class CallbackCache:
99
def __init__(self):
1010
self.reusable_callbacks: Dict[int, ReusableCallback[Any]] = {}
11-
self.subscription_callbacks: Dict[int, Callback[Any]] = {}
11+
self.subscription_callbacks: Dict[str, Callback[Any]] = {}
1212
self._id = 1
1313

1414
def next_id(self):
@@ -31,10 +31,10 @@ def get_callback(self, id: int) -> Optional[Callback[Any]]:
3131
del self.reusable_callbacks[id]
3232
return callback
3333

34-
def save_subscription_callback(self, key: int, callback: Callback[Any]):
34+
def save_subscription_callback(self, key: str, callback: Callback[Any]):
3535
self.subscription_callbacks[key] = callback
3636

37-
def get_subscription_callback(self, key: int) -> Optional[Callback[Any]]:
37+
def get_subscription_callback(self, key: str) -> Optional[Callback[Any]]:
3838
if key not in self.subscription_callbacks:
3939
return None
4040
return self.subscription_callbacks[key]

cryptomarket/websockets/client_auth.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import time
22
from datetime import datetime, timedelta
3-
from typing import Any, Callable, Dict, Optional
3+
from typing import Any, Callable, Dict, Optional, Union
44

55
from cryptomarket.exceptions import (CryptomarketAPIException,
66
CryptomarketSDKException)
77
from cryptomarket.hmac_auth import HmacAuth
8-
from cryptomarket.websockets.client_base import ClientBase
8+
from cryptomarket.websockets.client_base import ClientBase, OnErrorException
99
from cryptomarket.websockets.subscriptionMethodData import SubscriptionMethodData
1010

1111

@@ -17,9 +17,9 @@ def __init__(
1717
api_secret: str,
1818
window: Optional[int] = None,
1919
subscription_methods_data: Dict[str, SubscriptionMethodData] = {},
20-
on_connect=None,
21-
on_error=None,
22-
on_close=None
20+
on_connect: Optional[Callable[[], None]] = None,
21+
on_error: Optional[Callable[[OnErrorException], None]] = None,
22+
on_close: Optional[Callable[[int, str], None]] = None,
2323
):
2424
super(ClientAuthenticable, self).__init__(
2525
uri,

cryptomarket/websockets/client_base.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import time
22
from datetime import datetime, timedelta
3-
from typing import Any, Callable, Dict, Optional
3+
from typing import Any, Callable, Dict, Optional, Union
44

55
from cryptomarket.exceptions import (CryptomarketAPIException,
66
CryptomarketSDKException)
@@ -9,30 +9,32 @@
99
from cryptomarket.websockets.subscriptionMethodData import \
1010
SubscriptionMethodData
1111

12+
OnErrorException = Union[Exception, KeyboardInterrupt, SystemExit]
13+
1214

1315
class ClientBase:
1416
def __init__(
1517
self,
1618
uri: str,
1719
subscription_methods_data: Dict[str, SubscriptionMethodData] = {},
18-
on_connect=None,
19-
on_error=None,
20-
on_close=None
20+
on_connect: Optional[Callable[[], None]] = None,
21+
on_error: Optional[Callable[[OnErrorException], None]] = None,
22+
on_close: Optional[Callable[[int, str], None]] = None,
2123
):
2224
if on_connect is not None:
2325
self.on_connect = on_connect
2426
else:
25-
self.on_connect = lambda: None
27+
self.on_connect = None
2628

2729
if on_error is not None:
2830
self.error = on_error
2931
else:
30-
self._on_error = lambda err: None
32+
self._on_error = None
3133

3234
if on_close is not None:
3335
self.on_close = on_close
3436
else:
35-
self.on_close = lambda: None
37+
self.on_close = None
3638
self._ws_manager = WebsocketManager(self, uri)
3739
self._callback_cache = CallbackCache()
3840
self._subscription_methods_data = subscription_methods_data
@@ -65,7 +67,8 @@ def _on_open(self):
6567
"""
6668
internal use only
6769
"""
68-
self.on_connect()
70+
if self.on_connect:
71+
self.on_connect()
6972

7073
# SENDS #
7174

@@ -104,7 +107,8 @@ def _handle_notification(self, message):
104107
if key != 'subscription':
105108
method_type = self._subscription_methods_data[method].method_type
106109
callback = self._callback_cache.get_subscription_callback(key)
107-
callback(params, method_type)
110+
if callback:
111+
callback(params, method_type)
108112

109113
def _handle_response(self, response):
110114
id = response['id']

cryptomarket/websockets/manager.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ def on_error(ws, error):
2424
self._log.error("websocket error: " + error)
2525
handler.on_error(error)
2626

27-
def on_close(ws):
27+
def on_close(ws, code: int, message: str):
2828
self._log.debug('websocket connection closed')
29-
handler.on_close()
29+
handler.on_close(code, message)
3030

3131
def on_open(ws):
3232
self._log.debug(f'websocket connection open at: {ws.url}')

cryptomarket/websockets/trading_client.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from typing import Any, Callable, List, Optional, Union
33

44
from dacite import Config, DaciteError, from_dict
5+
from dacite.data import Data
56
from typing_extensions import Literal
67

78
import cryptomarket.args as args
@@ -11,9 +12,10 @@
1112
from cryptomarket.exceptions import CryptomarketAPIException
1213
from cryptomarket.websockets.callback import Callback
1314
from cryptomarket.websockets.client_auth import ClientAuthenticable
15+
from cryptomarket.websockets.client_base import OnErrorException
1416
from cryptomarket.websockets.subscriptionMethodData import \
1517
SubscriptionMethodData
16-
from dacite.data import Data
18+
1719
_REPORTS = 'reports'
1820
_BALANCES = 'balances'
1921

@@ -38,8 +40,8 @@ def __init__(
3840
api_secret: str,
3941
window: Optional[int] = None,
4042
on_connect: Optional[Callable[[], None]] = None,
41-
on_error: Optional[Callable[[], None]] = None,
42-
on_close: Optional[Callable[[], None]] = None,
43+
on_error: Optional[Callable[[OnErrorException], None]] = None,
44+
on_close: Optional[Callable[[int, str], None]] = None,
4345
):
4446
super(TradingClient, self).__init__(
4547
"wss://api.exchange.cryptomkt.com/api/3/ws/trading",

cryptomarket/websockets/wallet_client.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from enum import Enum
2-
from typing import Callable, List, Optional, Union
2+
from typing import Any, Callable, List, Optional, Union
33

44
from dacite import Config, from_dict
55
from typing_extensions import Literal
@@ -9,6 +9,7 @@
99
from cryptomarket.dataclasses.transaction import Transaction
1010
from cryptomarket.websockets.callback import Callback
1111
from cryptomarket.websockets.client_auth import ClientAuthenticable
12+
from cryptomarket.websockets.client_base import OnErrorException
1213
from cryptomarket.websockets.subscriptionMethodData import \
1314
SubscriptionMethodData
1415

@@ -30,8 +31,8 @@ def __init__(
3031
api_secret: str,
3132
window: Optional[int] = None,
3233
on_connect: Optional[Callable[[], None]] = None,
33-
on_error: Optional[Callable[[], None]] = None,
34-
on_close: Optional[Callable[[], None]] = None,
34+
on_error: Optional[Callable[[OnErrorException], None]] = None,
35+
on_close: Optional[Callable[[int, str], None]] = None,
3536
):
3637
super(WalletClient, self).__init__(
3738
"wss://api.exchange.cryptomkt.com/api/3/ws/wallet",
@@ -185,7 +186,7 @@ def get_transactions(
185186
currencies: Optional[List[str]] = None,
186187
order_by: Optional[Union[args.OrderBy, Literal[
187188
'created_at', 'updated_at', 'last_updated_at', 'id']]] = None,
188-
sort: Optional[Literal['ASC', 'DESC']] = None,
189+
sort: Optional[args.Sort] = None,
189190
id_from: Optional[int] = None,
190191
id_till: Optional[int] = None,
191192
since: Optional[str] = None,

tests/rest/test_helpers.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
PriceHistory, PricePoint, PublicTrade,
99
Symbol, Ticker, Transaction)
1010
from cryptomarket.dataclasses.fee import Fee
11+
from cryptomarket.dataclasses.trade import Trade
1112

1213

1314
# defined checks if a key is present in a dict, and if its value is str, checks if its defined.
@@ -56,6 +57,8 @@ def good_currency(currency: Currency) -> bool:
5657
)
5758
if not good:
5859
return False
60+
if currency.networks is None:
61+
return True
5962
for network in currency.networks:
6063
if not good_network(network):
6164
print("***bad network***")
@@ -313,7 +316,7 @@ def good_order_list(orders: List[Order]) -> bool:
313316
return True
314317

315318

316-
def good_trade(trade: Dict[str, Any]) -> bool:
319+
def good_trade(trade: Trade) -> bool:
317320
return good_dict(
318321
asdict(trade),
319322
[

tests/rest/test_market_data.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ def test_since_iso_format(self):
253253
trades = self.client.get_trades(since=iso_datetime)
254254

255255
def test_since_id(self):
256-
trades = self.client.get_trades(since=1005147907)
256+
trades = self.client.get_trades(since="1005147907")
257257

258258

259259
class GetOrderBooks(PublicCallsTestCase):
@@ -293,7 +293,7 @@ class GetOrderBookVolumeOfSymbol(PublicCallsTestCase):
293293
def test_get_orderbook(self):
294294
orderbook = self.client.get_order_book_volume_of_symbol(
295295
symbol='ETHBTC',
296-
volume='100'
296+
volume=100
297297
)
298298
if not good_orderbook(orderbook):
299299
self.fail("not a good orderbook")

tests/rest/test_trading.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def test_successfull_call(self):
134134
self.assertTrue(len(orders_after_cancel) == 0, "shouldn't have orders")
135135

136136

137-
class CancelOrderByClientId(AuthCallsTestCase):
137+
class CancelOrderByClientCheckingNotActive(AuthCallsTestCase):
138138
def test_successfull_call(self):
139139
order = self.client.create_spot_order(
140140
symbol='EOSETH',
@@ -152,7 +152,6 @@ def test_successfull_call(self):
152152
order = self.client.get_active_spot_order(client_order_id)
153153

154154

155-
156155
class CancelOrderByClientId(AuthCallsTestCase):
157156
def test_successfull_call(self):
158157
order = self.client.create_spot_order(
@@ -162,11 +161,10 @@ def test_successfull_call(self):
162161
type=args.OrderType.LIMIT,
163162
price='0.1'
164163
)
165-
assert(order.status == OrderStatus.NEW)
164+
assert (order.status == OrderStatus.NEW)
166165
time.sleep(5)
167166
canceled_order = self.client.cancel_spot_order(order.client_order_id)
168-
assert(canceled_order.status == OrderStatus.CANCELED)
169-
167+
assert (canceled_order.status == OrderStatus.CANCELED)
170168

171169

172170
class GetAllTradingCommissions(AuthCallsTestCase):
@@ -223,7 +221,7 @@ def test_create_order_list(self):
223221
quantity="0.1",
224222
price="10000")])
225223
if not good_list(good_order, orders):
226-
self.fail("not valid orders: " + orders)
224+
self.fail("not valid orders: " + str(orders))
227225
self.client.cancel_all_orders()
228226

229227

tests/rest/test_trading_history.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def tearDown(self):
1919

2020
class GetOrderHistory(AuthCallsTestCase):
2121
def test_successfull_call(self):
22-
order_history = self.client.get_spot_orders_history('EOSETH')
22+
order_history = self.client.get_spot_orders_history(['EOSETH'])
2323
# if len(order_history) == 0:
2424
# self.fail("should have orders")
2525
if not good_list(good_order, order_history):

0 commit comments

Comments
 (0)