From f674da744fcc45a95543407e36315dcdf230874b Mon Sep 17 00:00:00 2001 From: EtWn <34377743+EtWnn@users.noreply.github.com> Date: Tue, 30 Mar 2021 11:13:37 +0200 Subject: [PATCH 1/9] update version to 0.1.3dev (#33) --- BinanceWatch/__init__.py | 2 +- README.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BinanceWatch/__init__.py b/BinanceWatch/__init__.py index 99277fe..ff91cb3 100644 --- a/BinanceWatch/__init__.py +++ b/BinanceWatch/__init__.py @@ -1,2 +1,2 @@ -__version__ = "0.1.2" +__version__ = "0.1.3dev" __author__ = 'EtWnn' diff --git a/README.rst b/README.rst index 4889d88..08da2b4 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ =================================== -Welcome to BinanceWatch v0.1.2 +Welcome to BinanceWatch v0.1.3dev =================================== Note From d9fa964927ef28e3d513cfdd3225f793a631d58b Mon Sep 17 00:00:00 2001 From: EtWn <34377743+EtWnn@users.noreply.github.com> Date: Tue, 30 Mar 2021 11:17:53 +0200 Subject: [PATCH 2/9] doc link to default version (#34) --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 08da2b4..46c6905 100644 --- a/README.rst +++ b/README.rst @@ -15,7 +15,7 @@ your own risk. **Source Code:** https://github.com/EtWnn/BinanceWatch **Documentation:** - https://binancewatch.readthedocs.io/en/latest/ + https://binancewatch.readthedocs.io Features From d05307f1402105985794b93b3d86aaac10d0cb62 Mon Sep 17 00:00:00 2001 From: EtWn <34377743+EtWnn@users.noreply.github.com> Date: Fri, 2 Apr 2021 13:03:18 +0200 Subject: [PATCH 3/9] Weight limit (#35) * modified wait_time for API limits * round seconds display --- BinanceWatch/BinanceManager.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/BinanceWatch/BinanceManager.py b/BinanceWatch/BinanceManager.py index 12ae73d..e3e0052 100644 --- a/BinanceWatch/BinanceManager.py +++ b/BinanceWatch/BinanceManager.py @@ -231,7 +231,7 @@ def update_margin_asset_repay(self, asset: str, isolated_symbol=''): while True: client_params = { 'asset': asset, - 'current':current, + 'current': current, 'startTime': latest_time + 1000, 'archived': archived, 'isolatedSymbol': isolated_symbol, @@ -795,11 +795,13 @@ def _call_binance_client(self, method_name: str, params: Optional[Dict] = None, return getattr(self.client, method_name)(**params) except BinanceAPIException as err: if err.code == -1003: # API rate Limits - wait_time = float(err.response.headers['Retry-After']) + # wait_time = float(err.response.headers['Retry-After']) it seems to be always 0, so unusable + wait_time = 1 + 60 - datetime.datetime.now().timestamp() % 60 # number of seconds until next minute if err.response.status_code == 418: # ban self.logger.error(f"API calls resulted in a ban, retry in {wait_time} seconds") raise err - self.logger.info(f"API calls resulted in a breach of rate limits, will retry after {wait_time} seconds") - time.sleep(wait_time + 1) + self.logger.info(f"API calls resulted in a breach of rate limits," + f" will retry after {wait_time:.2f} seconds") + time.sleep(wait_time) return self._call_binance_client(method_name, params, retry_count + 1) raise err From ea6cf639c1afcbabd03f6f515a3578f5f2a634e1 Mon Sep 17 00:00:00 2001 From: EtWn <34377743+EtWnn@users.noreply.github.com> Date: Mon, 5 Apr 2021 09:14:04 +0200 Subject: [PATCH 4/9] create CONTRIBUTING.md (#37) --- CONTRIBUTING.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..48f2e04 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,26 @@ +# Contributing to BinanceWatch + +:+1::tada: First off, thanks for taking the time to contribute! :tada::+1: + +## Reporting an issue + +If you encountered an issue or a bug, don't hesitate to write a detailed issue in the repo. the guidelines are [here](https://github.com/EtWnn/BinanceWatch/blob/master/.github/ISSUE_TEMPLATE/bug_report.md) + + +## Submitting changes + +If you fixed an issue or implemented a new feature, please send a pull request with a clear list of what you've done and make sure all of your commits are atomic +(one feature per commit). +Always write a clear log message for your commits. + +PLease follow this steps: +- Fork this repo +- create a `feature_branch` from `develop` +- make your changes and commits continuously to your `feature_branch` +- submit a PR from your `feature_branch` to the `develop` branch of this repo + +Thanks! :heart: :heart: :heart: + +EtWnn + + From 93bf7ed5fb439581fce966e297c65c22b298f5ab Mon Sep 17 00:00:00 2001 From: EtWn <34377743+EtWnn@users.noreply.github.com> Date: Mon, 5 Apr 2021 20:14:48 +0200 Subject: [PATCH 5/9] Fix deposit duplicate (#38) * fix duplicate spot deposit and withdraw pull * fix duplicate spot dividends pull --- BinanceWatch/BinanceManager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BinanceWatch/BinanceManager.py b/BinanceWatch/BinanceManager.py index e3e0052..a7798fb 100644 --- a/BinanceWatch/BinanceManager.py +++ b/BinanceWatch/BinanceManager.py @@ -611,7 +611,7 @@ def update_spot_dividends(self, day_jump: float = 90, limit: int = 500): ) pbar.update() if len(dividends) < limit: - start_time += delta_jump + start_time += delta_jump + 1 # endTime is included in the previous return, so we have to add 1 else: # limit was reached before the end of the time windows start_time = int(dividends[0]['divTime']) + 1 if len(dividends): @@ -658,7 +658,7 @@ def update_spot_withdraws(self, day_jump: float = 90): auto_commit=False ) pbar.update() - start_time += delta_jump + start_time += delta_jump + 1 # endTime is included in the previous return, so we have to add 1 if len(withdraws): self.db.commit() pbar.close() @@ -700,7 +700,7 @@ def update_spot_deposits(self, day_jump: float = 90): amount=float(deposit['amount']), auto_commit=False) pbar.update() - start_time += delta_jump + start_time += delta_jump + 1 # endTime is included in the previous return, so we have to add 1 if len(deposits): self.db.commit() pbar.close() From fad57a765f7e17b32bad87a54a8adad1a72514a3 Mon Sep 17 00:00:00 2001 From: EtWn <34377743+EtWnn@users.noreply.github.com> Date: Mon, 5 Apr 2021 20:27:18 +0200 Subject: [PATCH 6/9] add a logger error message when an IntegrityError occurs (#39) --- BinanceWatch/storage/DataBase.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BinanceWatch/storage/DataBase.py b/BinanceWatch/storage/DataBase.py index 81359c1..0c27e3f 100644 --- a/BinanceWatch/storage/DataBase.py +++ b/BinanceWatch/storage/DataBase.py @@ -100,6 +100,9 @@ def add_row(self, table: Table, row: Tuple, auto_commit: bool = True, update_if_ if update_if_exists: self.update_row(table, row, auto_commit) else: + existing_row = self.get_row_by_key(table, row[0]) + msg = f"tried to insert {row} in the table {table.name} but the row is occupied: {existing_row}" + self.logger.error(msg) raise err def add_rows(self, table: Table, rows: List[Tuple], auto_commit: bool = True, update_if_exists: bool = False): From c006c629ca51c6b2131b25f38324e42e48535bd3 Mon Sep 17 00:00:00 2001 From: EtWn <34377743+EtWnn@users.noreply.github.com> Date: Mon, 5 Apr 2021 20:47:43 +0200 Subject: [PATCH 7/9] Clear data (#40) * add a method to erase the entire data folder * add connect and close methods for the DataBase class --- BinanceWatch/storage/DataBase.py | 20 ++++++++++++++++++++ BinanceWatch/utils/manage.py | 24 ++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 BinanceWatch/utils/manage.py diff --git a/BinanceWatch/storage/DataBase.py b/BinanceWatch/storage/DataBase.py index 0c27e3f..b0dc4e6 100644 --- a/BinanceWatch/storage/DataBase.py +++ b/BinanceWatch/storage/DataBase.py @@ -28,9 +28,29 @@ def __init__(self, name: str): self.name = name self.logger = LoggerGenerator.get_logger(self.name) self.save_path = get_data_path() / f"{name}.db" + self.db_conn = None + self.db_cursor = None + self.connect() + + def connect(self): + """ + Connect to the sqlite3 database + + :return: None + :rtype: None + """ self.db_conn = sqlite3.connect(self.save_path) self.db_cursor = self.db_conn.cursor() + def close(self): + """ + close the connection with the sqlite3 database + + :return: None + :rtype: None + """ + self.db_conn.close() + def _fetch_rows(self, execution_cmd: str): """ execute a command to fetch some rows and return them diff --git a/BinanceWatch/utils/manage.py b/BinanceWatch/utils/manage.py new file mode 100644 index 0000000..3f67cc4 --- /dev/null +++ b/BinanceWatch/utils/manage.py @@ -0,0 +1,24 @@ +import os +import shutil + +from BinanceWatch.utils.paths import get_data_path + + +def clear_data(): + """ + Erase every files and folders created / saved in the data folder + Keep the root folder + + :return: None + :rtype: None + """ + data_path = get_data_path() + try: + shutil.rmtree(data_path) + except FileNotFoundError: + pass + + try: # recreate the data folder path + os.makedirs(get_data_path()) + except FileExistsError: + pass From 19ca694e5be04c2e6a65228b0da525148b96c053 Mon Sep 17 00:00:00 2001 From: EtWn <34377743+EtWnn@users.noreply.github.com> Date: Tue, 6 Apr 2021 08:52:22 +0200 Subject: [PATCH 8/9] Storage docs (#41) * PEP8 * add database rst * add documentation for Database * docs corrections * add tables docs * add tables.rst * add __init__ docs --- BinanceWatch/BinanceManager.py | 4 +- BinanceWatch/storage/BinanceDataBase.py | 6 + BinanceWatch/storage/DataBase.py | 150 +++++++++++++++++++----- BinanceWatch/storage/tables.py | 15 +++ docs/source/binance_database.rst | 3 +- docs/source/binance_manager.rst | 3 +- docs/source/database.rst | 7 ++ docs/source/index.rst | 2 + docs/source/tables.rst | 8 ++ 9 files changed, 163 insertions(+), 35 deletions(-) create mode 100644 docs/source/database.rst create mode 100644 docs/source/tables.rst diff --git a/BinanceWatch/BinanceManager.py b/BinanceWatch/BinanceManager.py index a7798fb..219e8a9 100644 --- a/BinanceWatch/BinanceManager.py +++ b/BinanceWatch/BinanceManager.py @@ -22,14 +22,14 @@ class BinanceManager: def __init__(self, api_key: str, api_secret: str, account_name: str = 'default'): """ - initialise the binance manager. + Initialise the binance manager. :param api_key: key for the Binance api :type api_key: str :param api_secret: secret for the Binance api :type api_secret: str :param account_name: if you have several accounts to monitor, you need to give them different names or the - database will collide + database will collide :type account_name: str """ self.account_name = account_name diff --git a/BinanceWatch/storage/BinanceDataBase.py b/BinanceWatch/storage/BinanceDataBase.py index f7fab3a..dd6a23d 100644 --- a/BinanceWatch/storage/BinanceDataBase.py +++ b/BinanceWatch/storage/BinanceDataBase.py @@ -12,6 +12,12 @@ class BinanceDataBase(DataBase): """ def __init__(self, name: str = 'binance_db'): + """ + Initialise a binance database instance + + :param name: name of the database + :type name: str + """ super().__init__(name) def add_universal_transfer(self, transfer_id: int, transfer_type: str, transfer_time: int, asset: str, diff --git a/BinanceWatch/storage/DataBase.py b/BinanceWatch/storage/DataBase.py index b0dc4e6..01d1361 100644 --- a/BinanceWatch/storage/DataBase.py +++ b/BinanceWatch/storage/DataBase.py @@ -9,6 +9,8 @@ class SQLConditionEnum(Enum): """ + Enumeration for SQL comparison operator + https://www.techonthenet.com/sqlite/comparison_operators.php """ equal = '=' @@ -25,6 +27,12 @@ class DataBase: """ def __init__(self, name: str): + """ + Initialise a DataBase instance + + :param name: name of the database + :type name: str + """ self.name = name self.logger = LoggerGenerator.get_logger(self.name) self.save_path = get_data_path() / f"{name}.db" @@ -44,18 +52,21 @@ def connect(self): def close(self): """ - close the connection with the sqlite3 database + Close the connection with the sqlite3 database :return: None :rtype: None """ self.db_conn.close() - def _fetch_rows(self, execution_cmd: str): + def _fetch_rows(self, execution_cmd: str) -> List[Tuple]: """ - execute a command to fetch some rows and return them + Execute a command to fetch some rows and return them + :param execution_cmd: the command to execute - :return: + :type execution_cmd: str + :return: list of the table's rows selected by the command + :rtype: List[Tuple] """ rows = [] try: @@ -71,10 +82,14 @@ def _fetch_rows(self, execution_cmd: str): def get_row_by_key(self, table: Table, key_value) -> Optional[Tuple]: """ - get the row identified by a primary key value from a table - :param table: table to fetch the row from - :param key_value: key value of the row - :return: None or the row of value + Get the row identified by a primary key value from a table + + :param table: table to fetch the key from + :type table: Table + :param key_value: value of the primary key + :type key_value: Any + :return: the raw row of of the table + :rtype: Optional[Tuple] """ if table.primary_key is None: raise ValueError(f"table {table.name} has no explicit primary key") @@ -84,12 +99,24 @@ def get_row_by_key(self, table: Table, key_value) -> Optional[Tuple]: return rows[0] def get_conditions_rows(self, table: Table, - selection: Optional[Union[str, List[str]]] = None, + selection: Union[str, List[str]] = '*', conditions_list: Optional[List[Tuple[str, SQLConditionEnum, Any]]] = None, - order_list: Optional[List[str]] = None) -> List: - if selection is None: - selection = '*' - elif isinstance(selection, List): + order_list: Optional[List[str]] = None) -> List[Tuple]: + """ + Select rows with optional conditions and optional order + + :param table: table to select the rows from + :type table: Table + :param selection: list of column or SQL type selection + :type selection: Union[str, List[str]] + :param conditions_list: list of conditions to select the row + :type conditions_list: Optional[List[Tuple[str, SQLConditionEnum, Any]]] + :param order_list: List of SQL type order by + :type order_list: Optional[List[str]] + :return: the selected rows + :rtype: List[Tuple] + """ + if isinstance(selection, List): selection = ','.join(selection) if conditions_list is None: conditions_list = [] @@ -101,9 +128,32 @@ def get_conditions_rows(self, table: Table, return self._fetch_rows(execution_cmd) def get_all_rows(self, table: Table) -> List: + """ + Get all the rows of a table + + :param table: table to get the rows from + :type table: Table + :return: all the rows of the table + :rtype: List[Tuple] + """ return self.get_conditions_rows(table) def add_row(self, table: Table, row: Tuple, auto_commit: bool = True, update_if_exists: bool = False): + """ + Add a row to a table + + :param table: table to add a row to + :type table: Table + :param row: values to add to the database + :type row: Tuple + :param auto_commit: if the database state should be saved after the changes + :type auto_commit: bool + :param update_if_exists: if an integrity error is raised and this parameter is true, + will update the existing row + :type update_if_exists: bool + :return: None + :rtype: None + """ row_s = ", ".join(f"'{v}'" for v in row) row_s = f'({row_s})' execution_order = f"INSERT INTO {table.name} VALUES {row_s}" @@ -126,12 +176,39 @@ def add_row(self, table: Table, row: Tuple, auto_commit: bool = True, update_if_ raise err def add_rows(self, table: Table, rows: List[Tuple], auto_commit: bool = True, update_if_exists: bool = False): + """ + Add several rows to a table + + :param table: table to add a row to + :type table: Table + :param rows: list of values to add to the database + :type rows: List[Tuple] + :param auto_commit: if the database state should be saved after the changes + :type auto_commit: bool + :param update_if_exists: if an integrity error is raised and this parameter is true, + will update the existing row + :type update_if_exists: bool + :return: None + :rtype: None + """ for row in rows: self.add_row(table, row, auto_commit=False, update_if_exists=update_if_exists) if auto_commit: self.commit() def update_row(self, table: Table, row: Tuple, auto_commit=True): + """ + Update the value of a row in a table + + :param table: table to get updated + :type table: Table + :param row: values to update + :type row: Tuple + :param auto_commit: if the database state should be saved after the changes + :type auto_commit: bool + :return: None + :rtype: None + """ row_s = ", ".join(f"{n} = {v}" for n, v in zip(table.columns_names, row)) execution_order = f"UPDATE {table.name} SET {row_s} WHERE {table.primary_key} = {row[0]}" self.db_cursor.execute(execution_order) @@ -140,9 +217,12 @@ def update_row(self, table: Table, row: Tuple, auto_commit=True): def create_table(self, table: Table): """ - create a table in the database + Create a table in the database + :param table: Table instance with the config of the table to create - :return: + :type table: Table + :return: None + :rtype: None """ create_cmd = self.get_create_cmd(table) self.db_cursor.execute(create_cmd) @@ -150,10 +230,10 @@ def create_table(self, table: Table): def drop_table(self, table: Union[Table, str]): """ - delete a table from the database + Delete a table from the database :param table: table or table name to drop - :type table: str or Table instance + :type table: Union[Table, str] :return: None :rtype: None """ @@ -165,7 +245,7 @@ def drop_table(self, table: Union[Table, str]): def drop_all_tables(self): """ - drop all the tables existing in the database + Drop all the tables existing in the database :return: None :rtype: None @@ -177,7 +257,7 @@ def drop_all_tables(self): def get_all_tables(self) -> List[Tuple]: """ - return all the tables existing in the database + Return all the tables existing in the database :return: tables descriptions :rtype: List[Tuple] @@ -187,19 +267,24 @@ def get_all_tables(self) -> List[Tuple]: def commit(self): """ - submit and save the database state - :return: + Submit and save the database state + + :return: None + :rtype: None """ self.db_conn.commit() @staticmethod def _add_conditions(execution_cmd: str, conditions_list: List[Tuple[str, SQLConditionEnum, Any]]): """ - add a list of condition to an SQL command + Add a list of condition to an SQL command + :param execution_cmd: SQL command without 'WHERE' statement :type execution_cmd: str - :param conditions_list: - :return: + :param conditions_list: List of condition to add to the SQL command + :type conditions_list: List[Tuple[str, SQLConditionEnum, Any]] + :return: the augmented command + :rtype: str """ if len(conditions_list): add_cmd = ' WHERE' @@ -212,14 +297,14 @@ def _add_conditions(execution_cmd: str, conditions_list: List[Tuple[str, SQLCond @staticmethod def _add_order(execution_cmd: str, order_list: List[str]): """ - add an order specification to an SQL command + Add an order specification to an SQL command :param execution_cmd: SQL command without 'ORDER BY' statement :type execution_cmd: str - :param order_list: - :type order_list: - :return: - :rtype: + :param order_list: SQL order + :type order_list: List[str] + :return: the augmented command + :rtype: str """ if len(order_list): add_cmd = ' ORDER BY' @@ -230,11 +315,14 @@ def _add_order(execution_cmd: str, order_list: List[str]): return execution_cmd @staticmethod - def get_create_cmd(table: Table): + def get_create_cmd(table: Table) -> str: """ - return the command in string format to create a table in the database + Return the command in string format to create a table in the database + :param table: Table instance with the config if the table to create + :type table: Table :return: execution command for the table creation + :rtype: str """ cmd = "" if table.primary_key is not None: diff --git a/BinanceWatch/storage/tables.py b/BinanceWatch/storage/tables.py index da25004..dac3cc9 100644 --- a/BinanceWatch/storage/tables.py +++ b/BinanceWatch/storage/tables.py @@ -4,11 +4,26 @@ class Table: """ + This class represent a table in a database. All columns names are dynamic attributes @DynamicAttrs """ def __init__(self, name: str, columns_names: List[str], columns_sql_types: List[str], primary_key: Optional[str] = None, primary_key_sql_type: Optional[str] = None): + """ + Initialise a Table instance + + :param name: name of the table + :type name: str + :param columns_names: names of the columns (except primary column) + :type columns_names: List[str] + :param columns_sql_types: sql types of the previous columns + :type columns_sql_types: List[str] + :param primary_key: name of the primary key (None, if no primary key is needed) + :type primary_key: Optional[str] + :param primary_key_sql_type: sql type of the primary key (None, if no primary key is needed) + :type primary_key_sql_type: Optional[str] + """ self.name = name self.columns_names = columns_names self.columns_sql_types = columns_sql_types diff --git a/docs/source/binance_database.rst b/docs/source/binance_database.rst index 2301dfc..d5e3c3d 100644 --- a/docs/source/binance_database.rst +++ b/docs/source/binance_database.rst @@ -2,6 +2,7 @@ Binance DataBase ================ .. automodule:: BinanceWatch.storage.BinanceDataBase + :special-members: __init__ :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/source/binance_manager.rst b/docs/source/binance_manager.rst index 54e0033..e1c0e3d 100644 --- a/docs/source/binance_manager.rst +++ b/docs/source/binance_manager.rst @@ -2,5 +2,6 @@ Binance Manager =============== .. automodule:: BinanceWatch.BinanceManager + :special-members: __init__ :members: - :undoc-members: \ No newline at end of file + :undoc-members: diff --git a/docs/source/database.rst b/docs/source/database.rst new file mode 100644 index 0000000..e25ca73 --- /dev/null +++ b/docs/source/database.rst @@ -0,0 +1,7 @@ +DataBase +======== + +.. automodule:: BinanceWatch.storage.DataBase + :special-members: __init__ + :members: + :undoc-members: diff --git a/docs/source/index.rst b/docs/source/index.rst index 4a3794c..0c3abba 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -9,6 +9,8 @@ Contents overview binance_manager binance_database + database + tables diff --git a/docs/source/tables.rst b/docs/source/tables.rst new file mode 100644 index 0000000..292613f --- /dev/null +++ b/docs/source/tables.rst @@ -0,0 +1,8 @@ +Tables +======== + +.. automodule:: BinanceWatch.storage.tables + :special-members: __init__ + :members: + :undoc-members: + From f81b859e1c6e01e66d66dc044b1462db6614a8ae Mon Sep 17 00:00:00 2001 From: EtWn <34377743+EtWnn@users.noreply.github.com> Date: Tue, 6 Apr 2021 09:20:32 +0200 Subject: [PATCH 9/9] bump version to 0.1.3 (#42) * return docs fix * bump version to 0.1.3 --- BinanceWatch/__init__.py | 2 +- BinanceWatch/storage/DataBase.py | 2 +- README.rst | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BinanceWatch/__init__.py b/BinanceWatch/__init__.py index ff91cb3..df2020d 100644 --- a/BinanceWatch/__init__.py +++ b/BinanceWatch/__init__.py @@ -1,2 +1,2 @@ -__version__ = "0.1.3dev" +__version__ = "0.1.3" __author__ = 'EtWnn' diff --git a/BinanceWatch/storage/DataBase.py b/BinanceWatch/storage/DataBase.py index 01d1361..149d1f6 100644 --- a/BinanceWatch/storage/DataBase.py +++ b/BinanceWatch/storage/DataBase.py @@ -127,7 +127,7 @@ def get_conditions_rows(self, table: Table, execution_cmd = self._add_order(execution_cmd, order_list=order_list) return self._fetch_rows(execution_cmd) - def get_all_rows(self, table: Table) -> List: + def get_all_rows(self, table: Table) -> List[Tuple]: """ Get all the rows of a table diff --git a/README.rst b/README.rst index 46c6905..e222a16 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ =================================== -Welcome to BinanceWatch v0.1.3dev +Welcome to BinanceWatch v0.1.3 =================================== Note