From eafa989e9fb0d62fe738152b6a13bfd774dd386e Mon Sep 17 00:00:00 2001 From: Jonte <114036008+jonte-z@users.noreply.github.com> Date: Tue, 23 May 2023 15:51:02 +1000 Subject: [PATCH] v3 Release --- CHANGELOG.md | 8 +++++ README.md | 5 ++- binance/__version__.py | 2 +- binance/websocket/spot/websocket_stream.py | 3 -- binance/websocket/websocket_client.py | 33 +++++++++---------- .../spot/websocket_stream/combined_streams.py | 13 ++------ setup.py | 3 +- 7 files changed, 33 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c523ec23..c01d2421 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 3.0.0 - 2023-05-23 + +### Changed +- Modified format of combined streams in Websocket Market Streams. Please refer to `examples/websocket/websocket_stream/combined_streams.py` for example implementation. + +### Removed +- Discontinued official support for Python 3.6 + ## 3.0.0rc2 - 2023-04-21 ### Removed diff --git a/README.md b/README.md index 11376156..bd758822 100644 --- a/README.md +++ b/README.md @@ -272,11 +272,14 @@ my_client.ping_connectivity(id="my_request_id") my_client.ping_connectivity() ``` +#### Combined Streams +- If you set `is_combined` to `True`, `"/stream/"` will be appended to the `baseURL` to allow for Combining streams. +- `is_combined` defaults to `False` and `"/ws/"` (raw streams) will be appended to the `baseURL`. + More websocket examples are available in the `examples` folder. Example file "examples/websocket_api/app_demo.py" demonstrates how Websocket API and Websocket Stream can be used together. - ### Connector v1 and v2 ```python diff --git a/binance/__version__.py b/binance/__version__.py index f7bbf541..528787cf 100644 --- a/binance/__version__.py +++ b/binance/__version__.py @@ -1 +1 @@ -__version__ = "3.0.0rc2" +__version__ = "3.0.0" diff --git a/binance/websocket/spot/websocket_stream.py b/binance/websocket/spot/websocket_stream.py index 330df5ce..1f53e5f6 100644 --- a/binance/websocket/spot/websocket_stream.py +++ b/binance/websocket/spot/websocket_stream.py @@ -2,9 +2,6 @@ class SpotWebsocketStreamClient(BinanceWebsocketClient): - ACTION_SUBSCRIBE = "SUBSCRIBE" - ACTION_UNSUBSCRIBE = "UNSUBSCRIBE" - def __init__( self, stream_url="wss://stream.binance.com:9443", diff --git a/binance/websocket/websocket_client.py b/binance/websocket/websocket_client.py index cba6d44d..187090f9 100644 --- a/binance/websocket/websocket_client.py +++ b/binance/websocket/websocket_client.py @@ -5,6 +5,9 @@ class BinanceWebsocketClient: + ACTION_SUBSCRIBE = "SUBSCRIBE" + ACTION_UNSUBSCRIBE = "UNSUBSCRIBE" + def __init__( self, stream_url, @@ -56,6 +59,14 @@ def _initialize_socket( logger=logger, ) + def _single_stream(self, stream): + if isinstance(stream, str): + return True + elif isinstance(stream, list): + return False + else: + raise ValueError("Invalid stream name, expect string or array") + def send(self, message: dict): self.socket_manager.send_message(json.dumps(message)) @@ -75,17 +86,13 @@ def subscribe(self, stream, id=None): json_msg = json.dumps({"method": "SUBSCRIBE", "params": stream, "id": id}) self.socket_manager.send_message(json_msg) - def unsubscribe(self, stream: str, id=None): + def unsubscribe(self, stream, id=None): if not id: id = get_timestamp() - - if not self._single_stream(stream): - raise ValueError("Invalid stream name, expect a string") - - stream = [stream] - self.socket_manager.send_message( - json.dumps({"method": "UNSUBSCRIBE", "params": stream, "id": id}) - ) + if self._single_stream(stream): + stream = [stream] + json_msg = json.dumps({"method": "UNSUBSCRIBE", "params": stream, "id": id}) + self.socket_manager.send_message(json_msg) def ping(self): self.logger.debug("Sending ping to Binance WebSocket Server") @@ -107,11 +114,3 @@ def list_subscribe(self, id=None): self.socket_manager.send_message( json.dumps({"method": "LIST_SUBSCRIPTIONS", "id": id}) ) - - def _single_stream(self, stream): - if isinstance(stream, str): - return True - elif isinstance(stream, list): - return False - else: - raise ValueError("Invalid stream name, expect string or array") diff --git a/examples/websocket/spot/websocket_stream/combined_streams.py b/examples/websocket/spot/websocket_stream/combined_streams.py index 676b768f..37598c2f 100644 --- a/examples/websocket/spot/websocket_stream/combined_streams.py +++ b/examples/websocket/spot/websocket_stream/combined_streams.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python - import logging import time @@ -7,7 +5,6 @@ from binance.websocket.spot.websocket_stream import SpotWebsocketStreamClient config_logging(logging, logging.DEBUG) -counter = 1 def message_handler(_, message): @@ -17,13 +14,9 @@ def message_handler(_, message): my_client = SpotWebsocketStreamClient(on_message=message_handler, is_combined=True) -# subscribe one stream -my_client.kline(symbol="bnbusdt", interval="1m") - -time.sleep(4) - -# subscribe another -my_client.ticker(symbol="ethusdt") +my_client.subscribe( + stream=["bnbusdt@bookTicker", "ethusdt@kline_1m"], +) time.sleep(10) my_client.stop() diff --git a/setup.py b/setup.py index 61667591..a794fb83 100644 --- a/setup.py +++ b/setup.py @@ -43,11 +43,10 @@ "Intended Audience :: Developers", "Intended Audience :: Financial and Insurance Industry", "License :: OSI Approved :: MIT License", - "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", ], - python_requires=">=3.6", + python_requires=">=3.7", )