unicex 0.10.3__py3-none-any.whl → 0.11.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
unicex/__init__.py CHANGED
@@ -26,6 +26,7 @@ __all__ = [
26
26
  "OpenInterestItem",
27
27
  "TickerInfoItem",
28
28
  "TickersInfoDict",
29
+ "LiquidationDict",
29
30
  # Interfaces
30
31
  "IUniClient",
31
32
  "IUniWebsocketManager",
@@ -93,7 +94,21 @@ from ._base import BaseClient, Websocket
93
94
  # enums, mappers, types
94
95
  from .enums import Exchange, MarketType, Side, Timeframe
95
96
  from .mapper import get_uni_client, get_uni_websocket_manager, get_exchange_info
96
- from .types import *
97
+ from .types import (
98
+ TickerDailyDict,
99
+ TickerDailyItem,
100
+ KlineDict,
101
+ TradeDict,
102
+ AggTradeDict,
103
+ RequestMethod,
104
+ LoggerLike,
105
+ AccountType,
106
+ OpenInterestDict,
107
+ OpenInterestItem,
108
+ TickerInfoItem,
109
+ TickersInfoDict,
110
+ LiquidationDict,
111
+ )
97
112
 
98
113
  # exchanges
99
114
 
unicex/_base/websocket.py CHANGED
@@ -41,7 +41,7 @@ class Websocket:
41
41
  pong_message: str | Callable | None = None,
42
42
  no_message_reconnect_timeout: int | float | None = 60,
43
43
  reconnect_timeout: int | float | None = 5,
44
- worker_count: int = 2,
44
+ worker_count: int = 1,
45
45
  logger: LoggerLike | None = None,
46
46
  decoder: type[_DecoderProtocol] = _JsonDecoder,
47
47
  **kwargs: Any, # Не дадим сломаться, если юзер передал ненужные аргументы
@@ -238,3 +238,7 @@ class Websocket:
238
238
  await self.restart()
239
239
  return
240
240
  await asyncio.sleep(1)
241
+
242
+ def __repr__(self) -> str:
243
+ """Репрезентация вебсокета."""
244
+ return f"<Websocket(url={self._url[:15]}...)>"
unicex/bybit/adapter.py CHANGED
@@ -4,6 +4,7 @@ from typing import Any
4
4
 
5
5
  from unicex.types import (
6
6
  KlineDict,
7
+ LiquidationDict,
7
8
  OpenInterestDict,
8
9
  OpenInterestItem,
9
10
  TickerDailyDict,
@@ -130,6 +131,14 @@ class Adapter:
130
131
 
131
132
  @staticmethod
132
133
  def Klines_message(raw_msg: Any) -> list[KlineDict]:
134
+ """Преобразует вебсокет-сообщение с данными о свечах в унифицированный формат.
135
+
136
+ Параметры:
137
+ raw_msg (`Any`): Сырое сообщение из вебсокета Bybit.
138
+
139
+ Возвращает:
140
+ `list[KlineDict]`: Список свечей в унифицированном формате.
141
+ """
133
142
  symbol = raw_msg["topic"].split(".")[-1]
134
143
  return [
135
144
  KlineDict(
@@ -144,11 +153,56 @@ class Adapter:
144
153
  T=kline["end"],
145
154
  x=kline["confirm"],
146
155
  )
147
- for kline in raw_msg["data"]
156
+ for kline in sorted(
157
+ raw_msg["data"],
158
+ key=lambda x: int(x["start"]),
159
+ )
148
160
  ]
149
161
 
150
162
  @staticmethod
151
- def aggtrades_message(raw_msg: Any) -> list[TradeDict]: ...
163
+ def trades_message(raw_msg: Any) -> list[TradeDict]:
164
+ """Преобразует вебсокет-сообщение с данными о сделках в унифицированный формат.
165
+
166
+ Параметры:
167
+ raw_msg (`Any`): Сырое сообщение из вебсокета Bybit.
168
+
169
+ Возвращает:
170
+ `list[TradeDict]`: Список сделок в унифицированном формате.
171
+ """
172
+ return [
173
+ TradeDict(
174
+ t=trade["T"],
175
+ s=trade["s"],
176
+ S=trade["S"].upper(),
177
+ p=float(trade["p"]),
178
+ v=float(trade["v"]),
179
+ )
180
+ for trade in sorted(
181
+ raw_msg["data"],
182
+ key=lambda x: int(x["T"]),
183
+ )
184
+ ]
152
185
 
153
186
  @staticmethod
154
- def trades_message(raw_msg: Any) -> list[TradeDict]: ...
187
+ def liquidations_message(raw_msg: Any) -> list[LiquidationDict]:
188
+ """Преобразует вебсокет-сообщение с данными о ликвидациях в унифицированный формат.
189
+
190
+ Параметры:
191
+ raw_msg (`Any`): Сырое сообщение из вебсокета Bybit.
192
+
193
+ Возвращает:
194
+ `list[LiquidationDict]`: Список ликвидаций в унифицированном формате.
195
+ """
196
+ return [
197
+ LiquidationDict(
198
+ t=liquidation["T"],
199
+ s=liquidation["s"],
200
+ S=liquidation["S"].upper(),
201
+ v=float(liquidation["v"]),
202
+ p=float(liquidation["p"]),
203
+ )
204
+ for liquidation in sorted(
205
+ raw_msg["data"],
206
+ key=lambda x: int(x["T"]),
207
+ )
208
+ ]
@@ -72,7 +72,7 @@ class UniWebsocketManager(IUniWebsocketManager):
72
72
  Возвращает:
73
73
  `Websocket`: Экземпляр вебсокета для управления соединением.
74
74
  """
75
- return self._websocket_manager.klines(
75
+ return self._websocket_manager.kline(
76
76
  callback=self._make_wrapper(self._adapter.Klines_message, callback),
77
77
  category="spot",
78
78
  interval=timeframe.to_exchange_format(Exchange.BYBIT), # type: ignore
@@ -120,7 +120,7 @@ class UniWebsocketManager(IUniWebsocketManager):
120
120
  Возвращает:
121
121
  `Websocket`: Экземпляр вебсокета.
122
122
  """
123
- return self._websocket_manager.klines(
123
+ return self._websocket_manager.kline(
124
124
  callback=self._make_wrapper(self._adapter.Klines_message, callback),
125
125
  category="linear",
126
126
  interval=timeframe.to_exchange_format(Exchange.BYBIT), # type: ignore
@@ -164,7 +164,12 @@ class UniWebsocketManager(IUniWebsocketManager):
164
164
  Возвращает:
165
165
  `Websocket`: Экземпляр вебсокета.
166
166
  """
167
- raise NotImplementedError()
167
+ return self._websocket_manager.trade(
168
+ callback=self._make_wrapper(self._adapter.trades_message, callback),
169
+ category="spot",
170
+ symbol=symbol,
171
+ symbols=symbols,
172
+ )
168
173
 
169
174
  @overload
170
175
  def aggtrades(
@@ -240,7 +245,12 @@ class UniWebsocketManager(IUniWebsocketManager):
240
245
  Возвращает:
241
246
  `Websocket`: Экземпляр вебсокета.
242
247
  """
243
- raise NotImplementedError()
248
+ return self._websocket_manager.trade(
249
+ callback=self._make_wrapper(self._adapter.trades_message, callback),
250
+ category="linear",
251
+ symbol=symbol,
252
+ symbols=symbols,
253
+ )
244
254
 
245
255
  @overload
246
256
  def futures_aggtrades(
@@ -126,7 +126,7 @@ class WebsocketManager:
126
126
  **self._ws_kwargs,
127
127
  )
128
128
 
129
- def klines(
129
+ def kline(
130
130
  self,
131
131
  callback: CallbackType,
132
132
  category: Literal["spot", "linear", "inverse", "option"],
@@ -170,7 +170,7 @@ class WebsocketManager:
170
170
  **self._ws_kwargs,
171
171
  )
172
172
 
173
- def public_trade(
173
+ def trade(
174
174
  self,
175
175
  callback: CallbackType,
176
176
  category: Literal["spot", "linear", "inverse", "option"],
unicex/types.py CHANGED
@@ -13,6 +13,7 @@ __all__ = [
13
13
  "OpenInterestItem",
14
14
  "TickerInfoItem",
15
15
  "TickersInfoDict",
16
+ "LiquidationDict",
16
17
  ]
17
18
 
18
19
  from logging import Logger as LoggingLogger
@@ -117,6 +118,23 @@ type OpenInterestDict = dict[str, OpenInterestItem]
117
118
  """Модель открытого интереса."""
118
119
 
119
120
 
121
+ class LiquidationDict(TypedDict):
122
+ t: int
123
+ """Время. В миллисекундах."""
124
+
125
+ s: str
126
+ """Символ."""
127
+
128
+ S: Literal["BUY", "SELL"]
129
+ """Сторона."""
130
+
131
+ v: float
132
+ """Объем ликвидации. В монетах."""
133
+
134
+ p: float
135
+ """Цена ликвидации."""
136
+
137
+
120
138
  type AccountType = Literal["SPOT", "FUTURES"]
121
139
  """Тип аккаунта."""
122
140
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: unicex
3
- Version: 0.10.3
3
+ Version: 0.11.0
4
4
  Summary: Unified Crypto Exchange API
5
5
  Author-email: LoveBloodAndDiamonds <ayazshakirzyanov27@gmail.com>
6
6
  License: BSD 3-Clause License
@@ -57,7 +57,7 @@ Dynamic: license-file
57
57
  |-----------------|--------|------|------------|---------|------------|----------------|--------------|
58
58
  | **Binance** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
59
59
  | **Bitget** | ✓ | ✓ | ✓ | | ✓ | | |
60
- | **Bybit** | ✓ | ✓ | ✓ | | ✓ | | |
60
+ | **Bybit** | ✓ | ✓ | ✓ | | ✓ || |
61
61
  | **Gateio** | ✓ | ✓ | ✓ | | ✓ | | |
62
62
  | **Hyperliquid** | ✓ | ✓ | ✓ | ✓ | ✓ | | |
63
63
  | **Mexc** | ✓ | ✓ | ✓ | | ✓ | | |
@@ -1,9 +1,9 @@
1
- unicex/__init__.py,sha256=J9UDSWyAS8ozDxSWFXgN4002fqHVUb1Ol-YtafNtJgs,5533
1
+ unicex/__init__.py,sha256=v3yO0P9GqC88cV4L-YSJ6h2YzlyOTnt1NPNLSJwhIRE,5806
2
2
  unicex/enums.py,sha256=8E_Nb57kriOif57XSLnW8joFufbthZTJ7tcExKWf1Wg,9633
3
3
  unicex/exceptions.py,sha256=r-xZzX78VuxVnI5pe99AM8FIiGcdIUDcF5CaTkQ4NE0,2213
4
4
  unicex/extra.py,sha256=MZRSsDRok05KZCqKur-hjOexZuoZ-tC9J6e-EIZr_lw,13824
5
5
  unicex/mapper.py,sha256=zOuInRQGJnSnwRI5yJ_axx-0svGn-nOqgLr7XXSlq14,4915
6
- unicex/types.py,sha256=NMitdbyD-_pRvR_gm2aapHU7wwL8CZCaqWFIuCAYMgA,4291
6
+ unicex/types.py,sha256=cfuS07QVOgAhZsdME6CeY4lqO8KBBfrf_CJMN9DMB_s,4638
7
7
  unicex/utils.py,sha256=dwU1VYuP2xcMpzaETtNQerL1V8Y_JH8H8EsLJ__-M4s,8050
8
8
  unicex/_abc/__init__.py,sha256=fxZjNFJFeFwWTXz8iSDe7eCWwE6xfFwFwAuG6l-TI8A,289
9
9
  unicex/_abc/exchange_info.py,sha256=j0nbTeF9-_LwHGDZLBHYF2Dd1DYBCQ-DlUO5N5tZgEY,7541
@@ -11,7 +11,7 @@ unicex/_abc/uni_client.py,sha256=ZjxK8aqCGLUUYy1UQTM9EvWn1IXwMkH2Db8sZrs1e_I,137
11
11
  unicex/_abc/uni_websocket_manager.py,sha256=yYKypPkIe3rKfWBuTsS8rkwIPljpd1588CYDkeTOYqE,9905
12
12
  unicex/_base/__init__.py,sha256=0TmevATGnRB3qow6tkCR8dQKNZCWKeib6YQjNJ4a1b0,236
13
13
  unicex/_base/client.py,sha256=asIIQLZlRwwmUDvxveSv7aCvth54iiSRJdz19bxGorI,8904
14
- unicex/_base/websocket.py,sha256=6dFGFFspHfMGtmQtuCZHrfWFHWIWVs2l9Lim_XJJyZE,11282
14
+ unicex/_base/websocket.py,sha256=7IUIO2-KyjTswK3nTkRI7uQkNq6NYS_EhaG7tJQCPeg,11430
15
15
  unicex/binance/__init__.py,sha256=sDk4ZjakRdpFMaMSpOCfqjf6ZPfAS9tlrt4WlDHtDkw,932
16
16
  unicex/binance/adapter.py,sha256=JbUFyjnDAFtyuYYrh90YeOvQOZQ6faim0nWS6U0NxXw,8799
17
17
  unicex/binance/client.py,sha256=1qPx0uRT4prC6saLBQ55pXDWcWTCKhYEwVIysiihPgU,60984
@@ -29,13 +29,13 @@ unicex/bitget/uni_websocket_manager.py,sha256=y-HXrREy_ruNeUzdRv5nHwBZQgbupxzp1U
29
29
  unicex/bitget/user_websocket.py,sha256=tlkv7Rmsw_FSfCJnEMOK_9jRsXRk2Ah_slqG8C-uhuo,129
30
30
  unicex/bitget/websocket_manager.py,sha256=2OhH2gKy2gN03oYeCFvf3_l6RA29dDOvpajGhbXI9Zw,9886
31
31
  unicex/bybit/__init__.py,sha256=SrMBh6K5zUt4JheWUpNUYNb1NCDr2ujTFv4IDguaGZI,926
32
- unicex/bybit/adapter.py,sha256=DkQwm28Ujyw04Ppgl-Itck-J73J0AIx7NOGsYH4M_TI,6008
32
+ unicex/bybit/adapter.py,sha256=U6QP2eGefZqfXq7H4P1G9M23HieAjmylb5FnrHISn5s,8147
33
33
  unicex/bybit/client.py,sha256=U1mCcF-Mg2spiKlp0ucIA-kDOisYLO0edRS6XC16iNo,61014
34
34
  unicex/bybit/exchange_info.py,sha256=36WiJ49TxpSdZpeMwZdjQIkRdf2wJXahdkNxVaNjNRE,351
35
35
  unicex/bybit/uni_client.py,sha256=0wmIRRgofuJXWvZMB1gHwuIEfoWuPhLJXthmK1f9w40,8382
36
- unicex/bybit/uni_websocket_manager.py,sha256=1Y0m0ulH7W-18pSl0smlX2lXIeegy9FFqzrActCgZR0,9880
36
+ unicex/bybit/uni_websocket_manager.py,sha256=OpnvWD0xZ8T_By0HZCSg3jWoZqScRATAsku4IIBqhlw,10252
37
37
  unicex/bybit/user_websocket.py,sha256=IGGEnwyWs5jOppgK_R7SisBDvsiF1_piTswBrdQOgDg,128
38
- unicex/bybit/websocket_manager.py,sha256=ZBSwa_nXFvXoq2MoxE7llCYeKGyPdrXDOZXoyxbROt4,15412
38
+ unicex/bybit/websocket_manager.py,sha256=ePHvngoqoVPr6p-BayoEGhCuRK-cJ69CAPzF94qTalQ,15404
39
39
  unicex/gateio/__init__.py,sha256=dsKvhQhDcw4_w0S4c9IjKkCoOg4DCUtSecEUOlfstug,929
40
40
  unicex/gateio/adapter.py,sha256=PE5lXQORAKLhzFZBtxcarNIt2xEcDrPrphxWS0k0wEk,6842
41
41
  unicex/gateio/client.py,sha256=LS-g44vSY8FHCnDjFKzM8gIoPwWpKv15JxQIgwSietI,53732
@@ -86,8 +86,8 @@ unicex/okx/uni_client.py,sha256=E_Wod0JSGt1K6k1mAIWnOv350pELbv-nic7g1KgOuos,8694
86
86
  unicex/okx/uni_websocket_manager.py,sha256=b4f_QjA64DJmENQdIGb5IOVc7kvit7KMCdWeCmRbxGY,9326
87
87
  unicex/okx/user_websocket.py,sha256=8c9kpm-xVa729pW93OKUGLHaE9MY0uzEpjIgNIFRF80,126
88
88
  unicex/okx/websocket_manager.py,sha256=wROXTUDqKzOE-wDnCtXso_MC4SzfPuPols5aPg_Z3y4,26027
89
- unicex-0.10.3.dist-info/licenses/LICENSE,sha256=lNNK4Vqak9cXm6qVJLhbqS7iR_BMj6k7fd7XQ6l1k54,1507
90
- unicex-0.10.3.dist-info/METADATA,sha256=VGwB7Lbj31tw3BQTvZgL5exL3kKjPHIyD72tHPmqAnM,9146
91
- unicex-0.10.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
92
- unicex-0.10.3.dist-info/top_level.txt,sha256=_7rar-0OENIg4KRy6cgjWiebFYAJhjKEcMggAocGWG4,7
93
- unicex-0.10.3.dist-info/RECORD,,
89
+ unicex-0.11.0.dist-info/licenses/LICENSE,sha256=lNNK4Vqak9cXm6qVJLhbqS7iR_BMj6k7fd7XQ6l1k54,1507
90
+ unicex-0.11.0.dist-info/METADATA,sha256=w8bEftaxRniVPd4owyacH8aW6_usW0XoFA7k8oIbxRA,9148
91
+ unicex-0.11.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
92
+ unicex-0.11.0.dist-info/top_level.txt,sha256=_7rar-0OENIg4KRy6cgjWiebFYAJhjKEcMggAocGWG4,7
93
+ unicex-0.11.0.dist-info/RECORD,,