From 3b517eff398b62da72766260d6ea0f634d569ce0 Mon Sep 17 00:00:00 2001 From: Mohsen <97420292+MohsenHNSJ@users.noreply.github.com> Date: Mon, 16 Sep 2024 11:37:35 +0330 Subject: [PATCH 1/4] - Updated Requests package requirement from 2.27.1 to 2.28.0 - Added some words to spellchecker ignore list (VS Code) - Some code refactoring to improve readability --- .vscode/settings.json | 15 ++++ requirements/base.txt | 2 +- tabdeal/client.py | 50 +++++++----- tabdeal/isolated_margin.py | 160 ++++++++++++++++++++++--------------- tabdeal/spot.py | 33 +++++--- 5 files changed, 160 insertions(+), 100 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..262809a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,15 @@ +{ + "cSpell.words": [ + "APIKEY", + "Basiri", + "bnbusdt", + "btcusdt", + "coinex", + "isort", + "levelname", + "msecs", + "mypy", + "tabdeal", + "websockets" + ] +} \ No newline at end of file diff --git a/requirements/base.txt b/requirements/base.txt index a6f44bf..fea4046 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,2 +1,2 @@ -requests==2.27.1 +requests==2.28.0 websocket-client==1.3.3 diff --git a/tabdeal/client.py b/tabdeal/client.py index ea0ef74..3e12b2f 100644 --- a/tabdeal/client.py +++ b/tabdeal/client.py @@ -140,12 +140,12 @@ def _update_session_headers(self, headers): self.session.headers.update(headers) def client_get_orders( - self, - symbol: str = None, - start_time: int = None, - end_time: int = None, - limit: int = None, - url="allOrders" + self, + symbol: str = None, + start_time: int = None, + end_time: int = None, + limit: int = None, + url="allOrders", ): data = dict() @@ -177,12 +177,13 @@ def client_get_open_orders(self, symbol: str = None, url="openOrders"): data=data, ) - - def client_get_non_expired_all_orders(self, - start_time: int = None, - end_time: int = None, - limit: int = None, - url = "nonExpiredAllOrders"): + def client_get_non_expired_all_orders( + self, + start_time: int = None, + end_time: int = None, + limit: int = None, + url="nonExpiredAllOrders", + ): data = dict() if start_time: @@ -193,7 +194,7 @@ def client_get_non_expired_all_orders(self, if limit: data.update({"limit": limit}) - + return self.request( url=url, method=RequestTypes.GET, @@ -201,18 +202,19 @@ def client_get_non_expired_all_orders(self, data=data, ) - def client_get_paginated_open_orders(self, symbol: str = None, page: int = None, page_size: int = None, - url="paginatedOpenOrders"): + def client_get_paginated_open_orders( + self, + symbol: str = None, + page: int = None, + page_size: int = None, + url="paginatedOpenOrders", + ): data = dict() if not symbol else add_symbol_to_data(dict(), symbol) if page is not None: - data.update({ - 'page': page - }) + data.update({"page": page}) if page_size is not None: - data.update({ - 'page_size': page_size - }) + data.update({"page_size": page_size}) return self.request( url=url, @@ -252,7 +254,11 @@ def get_order(self, symbol: str, order_id: int = None, client_order_id: str = No ) def cancel_order( - self, symbol: str, order_id: int = None, client_order_id: str = None, url="order" + self, + symbol: str, + order_id: int = None, + client_order_id: str = None, + url="order", ): data = dict() diff --git a/tabdeal/isolated_margin.py b/tabdeal/isolated_margin.py index 4cb3c5e..5fc6a11 100644 --- a/tabdeal/isolated_margin.py +++ b/tabdeal/isolated_margin.py @@ -10,12 +10,8 @@ class IsolatedMargin(Client): # Isolated Margin def transfer( - self, - asset: str, - symbol: str, - amount: str, - trans_from: str, - trans_to: str): + self, asset: str, symbol: str, amount: str, trans_from: str, trans_to: str + ): data = { "asset": asset, @@ -32,15 +28,23 @@ def transfer( data=data, ) - def transfer_spot_to_isolated_margin(self, asset: str, - symbol: str, - amount: str): - return self.transfer(asset=asset, symbol=symbol, amount=amount, trans_from="SPOT", trans_to="ISOLATED_MARGIN") + def transfer_spot_to_isolated_margin(self, asset: str, symbol: str, amount: str): + return self.transfer( + asset=asset, + symbol=symbol, + amount=amount, + trans_from="SPOT", + trans_to="ISOLATED_MARGIN", + ) - def transfer_isolated_margin_to_spot(self, asset: str, - symbol: str, - amount: str): - return self.transfer(asset=asset, symbol=symbol, amount=amount, trans_from="ISOLATED_MARGIN", trans_to="SPOT") + def transfer_isolated_margin_to_spot(self, asset: str, symbol: str, amount: str): + return self.transfer( + asset=asset, + symbol=symbol, + amount=amount, + trans_from="ISOLATED_MARGIN", + trans_to="SPOT", + ) def get_isolated_margin_account(self, symbols=None, tabdeal_symbols=None): symbols_str = "" @@ -59,25 +63,29 @@ def get_isolated_margin_account(self, symbols=None, tabdeal_symbols=None): url="margin/isolated/account/", method=RequestTypes.GET, security_type=SecurityTypes.TRADE, - data=data + data=data, ) def get_all_assets( - self, + self, ): return self.request( url="margin/allAssets", method=RequestTypes.GET, - security_type=SecurityTypes.NONE + security_type=SecurityTypes.NONE, ) - def get_transfers(self, asset: str = None, symbol: str = None, type: str = None, - start_time: int = None, - end_time: int = None, - size: int = None, - current: int = None - ): + def get_transfers( + self, + asset: str = None, + symbol: str = None, + type: str = None, + start_time: int = None, + end_time: int = None, + size: int = None, + current: int = None, + ): data = {} if asset: data["asset"] = asset @@ -102,15 +110,15 @@ def get_transfers(self, asset: str = None, symbol: str = None, type: str = None, ) def create_margin_order( - self, - symbol: str, - side: OrderSides, - type: OrderTypes, - borrow_quantity: str, - quantity: str, - client_order_id: str = None, - price: str = None, - stop_price: str = None + self, + symbol: str, + side: OrderSides, + type: OrderTypes, + borrow_quantity: str, + quantity: str, + client_order_id: str = None, + price: str = None, + stop_price: str = None, ): data = { @@ -119,7 +127,7 @@ def create_margin_order( "quantity": quantity, "price": 0 if not price else price, "stopPrice": 0 if not stop_price else stop_price, - "borrow_quantity": 0 if not borrow_quantity else borrow_quantity + "borrow_quantity": 0 if not borrow_quantity else borrow_quantity, } add_symbol_to_data(data, symbol) @@ -138,29 +146,47 @@ def get_open_margin_orders(self, symbol: str = None): return self.client_get_open_orders(symbol=symbol, url="margin/openOrders") def cancel_margin_order( - self, symbol: str, order_id: int = None, client_order_id: str = None + self, symbol: str, order_id: int = None, client_order_id: str = None ): - return self.cancel_order(symbol=symbol, order_id=order_id, client_order_id=client_order_id, url="margin/order") + return self.cancel_order( + symbol=symbol, + order_id=order_id, + client_order_id=client_order_id, + url="margin/order", + ) - def get_margin_order(self, symbol: str, order_id: int = None, client_order_id: str = None): - return self.get_order(symbol=symbol, order_id=order_id, client_order_id=client_order_id) + def get_margin_order( + self, symbol: str, order_id: int = None, client_order_id: str = None + ): + return self.get_order( + symbol=symbol, order_id=order_id, client_order_id=client_order_id + ) def get_all_margin_orders( - self, - symbol: str, - start_time: int = None, - end_time: int = None, - limit: int = None, + self, + symbol: str, + start_time: int = None, + end_time: int = None, + limit: int = None, + ): + return self.client_get_orders( + symbol=symbol, + start_time=start_time, + end_time=end_time, + limit=limit, + url="margin/allOrders", + ) + + def get_margin_repay_details( + self, + asset: str = None, + isolatedSymbol: str = None, + txId: str = None, + start_time: int = None, + end_time: int = None, + size: int = None, + current: int = None, ): - return self.client_get_orders(symbol=symbol, start_time=start_time, end_time=end_time, limit=limit, - url="margin/allOrders") - - def get_margin_repay_details(self, asset: str = None, isolatedSymbol: str = None, txId: str = None, - start_time: int = None, - end_time: int = None, - size: int = None, - current: int = None - ): data = {} if asset: data["asset"] = asset @@ -184,7 +210,7 @@ def get_margin_repay_details(self, asset: str = None, isolatedSymbol: str = None data=data, ) - def get_margin_loan_details(self, asset: str, tx_id: str=None): + def get_margin_loan_details(self, asset: str, tx_id: str = None): data = {"asset": asset} if tx_id is not None: data["tx_id"] = tx_id @@ -195,12 +221,15 @@ def get_margin_loan_details(self, asset: str, tx_id: str=None): data=data, ) - def get_margin_force_liquidation_rec(self, isolatedSymbol: str = None, txId: str = None, - start_time: int = None, - end_time: int = None, - size: int = None, - current: int = None - ): + def get_margin_force_liquidation_rec( + self, + isolatedSymbol: str = None, + txId: str = None, + start_time: int = None, + end_time: int = None, + size: int = None, + current: int = None, + ): data = {} if start_time: data["startTime"] = start_time @@ -222,12 +251,15 @@ def get_margin_force_liquidation_rec(self, isolatedSymbol: str = None, txId: str data=data, ) - def get_interests(self, asset: str = None, isolatedSymbol: str = None, - start_time: int = None, - end_time: int = None, - size: int = None, - current: int = None - ): + def get_interests( + self, + asset: str = None, + isolatedSymbol: str = None, + start_time: int = None, + end_time: int = None, + size: int = None, + current: int = None, + ): data = {} if asset: data["asset"] = asset diff --git a/tabdeal/spot.py b/tabdeal/spot.py index 674e60d..8da457e 100644 --- a/tabdeal/spot.py +++ b/tabdeal/spot.py @@ -43,23 +43,30 @@ def new_order( def get_open_orders(self, symbol: str = None): return self.client_get_open_orders(symbol=symbol) - def get_paginated_open_orders(self, symbol: str = None, page: int = None, page_size: int = None): - return self.client_get_paginated_open_orders(symbol=symbol, page=page, page_size=page_size) + def get_paginated_open_orders( + self, symbol: str = None, page: int = None, page_size: int = None + ): + return self.client_get_paginated_open_orders( + symbol=symbol, page=page, page_size=page_size + ) def get_orders( - self, - symbol: str = None, - start_time: int = None, - end_time: int = None, - limit: int = None, + self, + symbol: str = None, + start_time: int = None, + end_time: int = None, + limit: int = None, ): - return self.client_get_orders(symbol=symbol, start_time=start_time, end_time=end_time, limit=limit) - - def get_non_expired_all_orders(self, start_time: int = None, - end_time: int = None, - limit: int = None): - return self.client_get_non_expired_all_orders(start_time=start_time, end_time=end_time, limit=limit) + return self.client_get_orders( + symbol=symbol, start_time=start_time, end_time=end_time, limit=limit + ) + def get_non_expired_all_orders( + self, start_time: int = None, end_time: int = None, limit: int = None + ): + return self.client_get_non_expired_all_orders( + start_time=start_time, end_time=end_time, limit=limit + ) def cancel_open_orders(self, symbol: str): return self.client_cancel_open_orders(symbol=symbol) From 7438b49831e668a1583ee295b8d3b08ff6f01a3a Mon Sep 17 00:00:00 2001 From: Mohsen <97420292+MohsenHNSJ@users.noreply.github.com> Date: Wed, 18 Sep 2024 08:54:15 +0330 Subject: [PATCH 2/4] Bumped min python version to 3.7 from 3.6 as "requests" package dropped support for python 3.6 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 272e451..d774159 100644 --- a/setup.py +++ b/setup.py @@ -29,6 +29,6 @@ exclude=["tests", "*.tests", "*.tests.*", "tests.*"] ), install_requires=[req for req in requirements], - python_requires=">=3.6", + python_requires=">=3.7", include_package_data=True, ) From 06accff55350ab50e259313ee063eca9db58d307 Mon Sep 17 00:00:00 2001 From: Mohsen <97420292+MohsenHNSJ@users.noreply.github.com> Date: Wed, 18 Sep 2024 09:53:20 +0330 Subject: [PATCH 3/4] - Minor updates and fixes --- .vscode/settings.json | 2 ++ CHANGELOG.md | 5 +++++ README.md | 51 +++++------------------------------------- setup.py | 14 ++++++------ tabdeal/__version__.py | 2 +- tabdeal/client.py | 2 +- 6 files changed, 21 insertions(+), 55 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 262809a..6402c5b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,8 +5,10 @@ "bnbusdt", "btcusdt", "coinex", + "HNSJ", "isort", "levelname", + "Mohsen", "msecs", "mypy", "tabdeal", diff --git a/CHANGELOG.md b/CHANGELOG.md index 1466df3..e703661 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## [0.4.7] - 2024-09-18 +### Fixed +- Fixed incompatibility with Conda 24.7.1 +- Code refactoring + ## [0.4.0] - 2022-07-24 ### Added - Add `POST r/api/v1/account` to get current account information diff --git a/README.md b/README.md index 7fd405d..b867662 100644 --- a/README.md +++ b/README.md @@ -1,54 +1,13 @@ -# Tabdeal API Python SDK -[![PyPI version](https://img.shields.io/pypi/v/tabdeal-python)](https://pypi.python.org/pypi/tabdeal-python) -[![Python version](https://img.shields.io/pypi/pyversions/tabdeal-python)](https://www.python.org/downloads/) +# Unofficial Tabdeal API Python SDK - - -Official python package to use [Tabdeal Exchange](https://www.tabdeal.org/) API +This is a slight modified version of Official Tabdeal python package to address incompatibility with Conda 24.7.1 ## Installation ```bash -pip install tabdeal-python -``` - -## Documentation - -[https://docs.tabdeal.org](https://docs.tabdeal.org/) - -[Postman Collection](https://github.com/Tabdeal-Exchange/tabdeal-api-postman) - -## RESTful APIs - -Usage examples: -```python -from tabdeal.enums import OrderSides, OrderTypes -from tabdeal.spot import Spot - -api_key = '' -api_secret = '' - - -client = Spot(api_key, api_secret) - -order = client.new_order(symbol='BTC_IRT', - side=OrderSides.BUY, - type=OrderTypes.MARKET, - quantity="0.002") - -print(order) +pip install tabdeal-python-updated-dependencies ``` -### Exception - -There are 2 types of exceptions returned from the library: -- `tabdeal.exceptions.ClientException` - - This is thrown when server returns `4XX`, it's an issue from client side. - - It has 4 properties: - - `status` - HTTP status code - - `code` - Server's error code - - `message` - Server's error message - - `detail` - Detail of exception -- `tabdeal.exceptions.ServerException` - - This is thrown when server returns `5XX`, it's an issue from server side. +for more information, head to the official package: +https://github.com/Tabdeal-Exchange/tabdeal-python diff --git a/setup.py b/setup.py index d774159..fb6e4b3 100644 --- a/setup.py +++ b/setup.py @@ -9,16 +9,16 @@ setuptools.setup( - name="tabdeal-python", - version="0.4.6", - author="Amin Basiri", - author_email="amin.bsr99@gmail.com", - description="Official python package to use Tabdeal API", + name="tabdeal-python-updated-dependencies", + version="0.4.7", + author="MohsenHNSJ", + author_email="mohsenhasannezhad@outlook.com", + description="Unofficial python package to use Tabdeal API", long_description=long_description, long_description_content_type="text/markdown", - url="https://github.com/Tabdeal-Exchange/tabdeal-python", + url="https://github.com/MohsenHNSJ/tabdeal-python-updated-dependencies", project_urls={ - "Bug Tracker": "https://github.com/Tabdeal-Exchange/tabdeal-python/issues", + "Bug Tracker": "https://github.com/MohsenHNSJ/tabdeal-python-updated-dependencies/issues", }, classifiers=[ "Programming Language :: Python :: 3", diff --git a/tabdeal/__version__.py b/tabdeal/__version__.py index 3dd3d2d..a34b2f6 100644 --- a/tabdeal/__version__.py +++ b/tabdeal/__version__.py @@ -1 +1 @@ -__version__ = "0.4.6" +__version__ = "0.4.7" diff --git a/tabdeal/client.py b/tabdeal/client.py index 3e12b2f..7a24073 100644 --- a/tabdeal/client.py +++ b/tabdeal/client.py @@ -25,7 +25,7 @@ class Client(object): """ - Tabdeal API Client + Unofficial Tabdeal API Client Keyword Args: base_url (str, optional): API Base URL. Default: https://api.tabdeal.org From 9d041d1093853f4e2eeb0469fab8da7d33699636 Mon Sep 17 00:00:00 2001 From: Mohsen <97420292+MohsenHNSJ@users.noreply.github.com> Date: Wed, 18 Sep 2024 09:58:46 +0330 Subject: [PATCH 4/4] Revert "- Minor updates and fixes" This reverts commit 06accff55350ab50e259313ee063eca9db58d307. --- .vscode/settings.json | 2 -- CHANGELOG.md | 5 ----- README.md | 51 +++++++++++++++++++++++++++++++++++++----- setup.py | 14 ++++++------ tabdeal/__version__.py | 2 +- tabdeal/client.py | 2 +- 6 files changed, 55 insertions(+), 21 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 6402c5b..262809a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,10 +5,8 @@ "bnbusdt", "btcusdt", "coinex", - "HNSJ", "isort", "levelname", - "Mohsen", "msecs", "mypy", "tabdeal", diff --git a/CHANGELOG.md b/CHANGELOG.md index e703661..1466df3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,5 @@ # Changelog -## [0.4.7] - 2024-09-18 -### Fixed -- Fixed incompatibility with Conda 24.7.1 -- Code refactoring - ## [0.4.0] - 2022-07-24 ### Added - Add `POST r/api/v1/account` to get current account information diff --git a/README.md b/README.md index b867662..7fd405d 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,54 @@ -# Unofficial Tabdeal API Python SDK +# Tabdeal API Python SDK +[![PyPI version](https://img.shields.io/pypi/v/tabdeal-python)](https://pypi.python.org/pypi/tabdeal-python) +[![Python version](https://img.shields.io/pypi/pyversions/tabdeal-python)](https://www.python.org/downloads/) -This is a slight modified version of Official Tabdeal python package to address incompatibility with Conda 24.7.1 + + +Official python package to use [Tabdeal Exchange](https://www.tabdeal.org/) API ## Installation ```bash -pip install tabdeal-python-updated-dependencies +pip install tabdeal-python +``` + +## Documentation + +[https://docs.tabdeal.org](https://docs.tabdeal.org/) + +[Postman Collection](https://github.com/Tabdeal-Exchange/tabdeal-api-postman) + +## RESTful APIs + +Usage examples: +```python +from tabdeal.enums import OrderSides, OrderTypes +from tabdeal.spot import Spot + +api_key = '' +api_secret = '' + + +client = Spot(api_key, api_secret) + +order = client.new_order(symbol='BTC_IRT', + side=OrderSides.BUY, + type=OrderTypes.MARKET, + quantity="0.002") + +print(order) ``` -for more information, head to the official package: -https://github.com/Tabdeal-Exchange/tabdeal-python +### Exception + +There are 2 types of exceptions returned from the library: +- `tabdeal.exceptions.ClientException` + - This is thrown when server returns `4XX`, it's an issue from client side. + - It has 4 properties: + - `status` - HTTP status code + - `code` - Server's error code + - `message` - Server's error message + - `detail` - Detail of exception +- `tabdeal.exceptions.ServerException` + - This is thrown when server returns `5XX`, it's an issue from server side. diff --git a/setup.py b/setup.py index fb6e4b3..d774159 100644 --- a/setup.py +++ b/setup.py @@ -9,16 +9,16 @@ setuptools.setup( - name="tabdeal-python-updated-dependencies", - version="0.4.7", - author="MohsenHNSJ", - author_email="mohsenhasannezhad@outlook.com", - description="Unofficial python package to use Tabdeal API", + name="tabdeal-python", + version="0.4.6", + author="Amin Basiri", + author_email="amin.bsr99@gmail.com", + description="Official python package to use Tabdeal API", long_description=long_description, long_description_content_type="text/markdown", - url="https://github.com/MohsenHNSJ/tabdeal-python-updated-dependencies", + url="https://github.com/Tabdeal-Exchange/tabdeal-python", project_urls={ - "Bug Tracker": "https://github.com/MohsenHNSJ/tabdeal-python-updated-dependencies/issues", + "Bug Tracker": "https://github.com/Tabdeal-Exchange/tabdeal-python/issues", }, classifiers=[ "Programming Language :: Python :: 3", diff --git a/tabdeal/__version__.py b/tabdeal/__version__.py index a34b2f6..3dd3d2d 100644 --- a/tabdeal/__version__.py +++ b/tabdeal/__version__.py @@ -1 +1 @@ -__version__ = "0.4.7" +__version__ = "0.4.6" diff --git a/tabdeal/client.py b/tabdeal/client.py index 7a24073..3e12b2f 100644 --- a/tabdeal/client.py +++ b/tabdeal/client.py @@ -25,7 +25,7 @@ class Client(object): """ - Unofficial Tabdeal API Client + Tabdeal API Client Keyword Args: base_url (str, optional): API Base URL. Default: https://api.tabdeal.org