From 6348110d83d2b38d8be84bd36e82e1fb12395bae Mon Sep 17 00:00:00 2001 From: Lorenz Herzberger Date: Tue, 24 May 2022 18:17:13 +0200 Subject: [PATCH] replaced TarantoolDB with TarantoolDBConnection Signed-off-by: Lorenz Herzberger --- planetmint/backend/__init__.py | 2 +- planetmint/backend/connection.py | 81 ++++++++++++++++++- planetmint/backend/localmongodb/connection.py | 80 +----------------- planetmint/backend/schema.py | 4 +- planetmint/backend/tarantool/connection.py | 3 +- planetmint/backend/tarantool/query.py | 72 ++++++++--------- planetmint/backend/tarantool/schema.py | 8 +- planetmint/commands/planetmint.py | 6 +- tests/backend/tarantool/conftest.py | 4 +- tests/backend/tarantool/test_schema.py | 2 +- tests/backend/test_connection.py | 6 +- tests/commands/test_commands.py | 4 +- tests/conftest.py | 20 ++--- tests/db/test_planetmint_api.py | 8 +- tests/tendermint/test_fastquery.py | 4 +- tests/tendermint/test_lib.py | 38 ++++----- tests/test_core.py | 4 +- 17 files changed, 173 insertions(+), 173 deletions(-) diff --git a/planetmint/backend/__init__.py b/planetmint/backend/__init__.py index 4f55715..8b4c6af 100644 --- a/planetmint/backend/__init__.py +++ b/planetmint/backend/__init__.py @@ -13,4 +13,4 @@ configuration or the ``PLANETMINT_DATABASE_BACKEND`` environment variable. # Include the backend interfaces from planetmint.backend import schema, query # noqa -from planetmint.backend.connection import Connection +from planetmint.backend.connection import connect, Connection diff --git a/planetmint/backend/connection.py b/planetmint/backend/connection.py index c001ef0..5aa2e77 100644 --- a/planetmint/backend/connection.py +++ b/planetmint/backend/connection.py @@ -11,14 +11,14 @@ from planetmint.transactions.common.exceptions import ConfigurationError BACKENDS = { # This is path to MongoDBClass - 'tarantool_db': 'planetmint.backend.tarantool.connection.TarantoolDB', + 'tarantool_db': 'planetmint.backend.tarantool.connection.TarantoolDBConnection', 'localmongodb': 'planetmint.backend.localmongodb.connection.LocalMongoDBConnection' } logger = logging.getLogger(__name__) -def Connection(host: str = None, port: int = None, login: str = None, password: str = None, backend: str = None, +def connect(host: str = None, port: int = None, login: str = None, password: str = None, backend: str = None, **kwargs): backend = backend if not backend and kwargs and kwargs.get("backend"): @@ -75,3 +75,80 @@ def _kwargs_parser(key, kwargs): if kwargs.get(key): return kwargs[key] return None + +class Connection: + """Connection class interface. + All backend implementations should provide a connection class that inherits + from and implements this class. + """ + + def __init__(self, host=None, port=None, dbname=None, + connection_timeout=None, max_tries=None, + **kwargs): + """Create a new :class:`~.Connection` instance. + Args: + host (str): the host to connect to. + port (int): the port to connect to. + dbname (str): the name of the database to use. + connection_timeout (int, optional): the milliseconds to wait + until timing out the database connection attempt. + Defaults to 5000ms. + max_tries (int, optional): how many tries before giving up, + if 0 then try forever. Defaults to 3. + **kwargs: arbitrary keyword arguments provided by the + configuration's ``database`` settings + """ + + dbconf = Config().get()['database'] + + self.host = host or dbconf['host'] + self.port = port or dbconf['port'] + self.dbname = dbname or dbconf['name'] + self.connection_timeout = connection_timeout if connection_timeout is not None \ + else dbconf['connection_timeout'] + self.max_tries = max_tries if max_tries is not None else dbconf['max_tries'] + self.max_tries_counter = range(self.max_tries) if self.max_tries != 0 else repeat(0) + self._conn = None + + @property + def conn(self): + if self._conn is None: + self.connect() + return self._conn + + def run(self, query): + """Run a query. + Args: + query: the query to run + Raises: + :exc:`~DuplicateKeyError`: If the query fails because of a + duplicate key constraint. + :exc:`~OperationFailure`: If the query fails for any other + reason. + :exc:`~ConnectionError`: If the connection to the database + fails. + """ + + raise NotImplementedError() + + def connect(self): + """Try to connect to the database. + Raises: + :exc:`~ConnectionError`: If the connection to the database + fails. + """ + + attempt = 0 + for i in self.max_tries_counter: + attempt += 1 + try: + self._conn = self._connect() + except ConnectionError as exc: + logger.warning('Attempt %s/%s. Connection to %s:%s failed after %sms.', + attempt, self.max_tries if self.max_tries != 0 else '∞', + self.host, self.port, self.connection_timeout) + if attempt == self.max_tries: + logger.critical('Cannot connect to the Database. Giving up.') + raise ConnectionError() from exc + else: + break diff --git a/planetmint/backend/localmongodb/connection.py b/planetmint/backend/localmongodb/connection.py index 9c55157..0ba7daa 100644 --- a/planetmint/backend/localmongodb/connection.py +++ b/planetmint/backend/localmongodb/connection.py @@ -13,88 +13,10 @@ from planetmint.backend.exceptions import (DuplicateKeyError, ConnectionError) from planetmint.transactions.common.exceptions import ConfigurationError from planetmint.utils import Lazy +from planetmint.backend.connection import Connection logger = logging.getLogger(__name__) - -class Connection: - """Connection class interface. - All backend implementations should provide a connection class that inherits - from and implements this class. - """ - - def __init__(self, host=None, port=None, dbname=None, - connection_timeout=None, max_tries=None, - **kwargs): - """Create a new :class:`~.Connection` instance. - Args: - host (str): the host to connect to. - port (int): the port to connect to. - dbname (str): the name of the database to use. - connection_timeout (int, optional): the milliseconds to wait - until timing out the database connection attempt. - Defaults to 5000ms. - max_tries (int, optional): how many tries before giving up, - if 0 then try forever. Defaults to 3. - **kwargs: arbitrary keyword arguments provided by the - configuration's ``database`` settings - """ - - dbconf = Config().get()['database'] - - self.host = host or dbconf['host'] - self.port = port or dbconf['port'] - self.dbname = dbname or dbconf['name'] - self.connection_timeout = connection_timeout if connection_timeout is not None \ - else dbconf['connection_timeout'] - self.max_tries = max_tries if max_tries is not None else dbconf['max_tries'] - self.max_tries_counter = range(self.max_tries) if self.max_tries != 0 else repeat(0) - self._conn = None - - @property - def conn(self): - if self._conn is None: - self.connect() - return self._conn - - def run(self, query): - """Run a query. - Args: - query: the query to run - Raises: - :exc:`~DuplicateKeyError`: If the query fails because of a - duplicate key constraint. - :exc:`~OperationFailure`: If the query fails for any other - reason. - :exc:`~ConnectionError`: If the connection to the database - fails. - """ - - raise NotImplementedError() - - def connect(self): - """Try to connect to the database. - Raises: - :exc:`~ConnectionError`: If the connection to the database - fails. - """ - - attempt = 0 - for i in self.max_tries_counter: - attempt += 1 - try: - self._conn = self._connect() - except ConnectionError as exc: - logger.warning('Attempt %s/%s. Connection to %s:%s failed after %sms.', - attempt, self.max_tries if self.max_tries != 0 else '∞', - self.host, self.port, self.connection_timeout) - if attempt == self.max_tries: - logger.critical('Cannot connect to the Database. Giving up.') - raise ConnectionError() from exc - else: - break - - class LocalMongoDBConnection(Connection): def __init__(self, replicaset=None, ssl=None, login=None, password=None, diff --git a/planetmint/backend/schema.py b/planetmint/backend/schema.py index 2677df0..a47cbb2 100644 --- a/planetmint/backend/schema.py +++ b/planetmint/backend/schema.py @@ -9,7 +9,7 @@ from functools import singledispatch import logging from planetmint.config import Config -from planetmint.backend.connection import Connection +from planetmint.backend.connection import connect from planetmint.transactions.common.exceptions import ValidationError from planetmint.transactions.common.utils import ( validate_all_values_for_key_in_obj, validate_all_values_for_key_in_list) @@ -79,7 +79,7 @@ def init_database(connection=None, dbname=None): configuration. """ - connection = connection or Connection() + connection = connection or connect() dbname = dbname or Config().get()['database']['name'] create_database(connection, dbname) diff --git a/planetmint/backend/tarantool/connection.py b/planetmint/backend/tarantool/connection.py index 15a6ea3..84324fd 100644 --- a/planetmint/backend/tarantool/connection.py +++ b/planetmint/backend/tarantool/connection.py @@ -8,11 +8,12 @@ import tarantool from planetmint.config import Config from planetmint.transactions.common.exceptions import ConfigurationError +from planetmint.backend.connection import Connection logger = logging.getLogger(__name__) -class TarantoolDB: +class TarantoolDBConnection(Connection): def __init__(self, host: str = "localhost", port: int = 3303, user: str = None, password: str = None, **kwargs): try: self.host = host diff --git a/planetmint/backend/tarantool/query.py b/planetmint/backend/tarantool/query.py index d866afb..f4e2aa6 100644 --- a/planetmint/backend/tarantool/query.py +++ b/planetmint/backend/tarantool/query.py @@ -10,14 +10,14 @@ from operator import itemgetter from planetmint.backend import query from planetmint.backend.utils import module_dispatch_registrar -from planetmint.backend.tarantool.connection import TarantoolDB +from planetmint.backend.tarantool.connection import TarantoolDBConnection from planetmint.backend.tarantool.transaction.tools import TransactionCompose, TransactionDecompose from json import dumps, loads register_query = module_dispatch_registrar(query) -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def _group_transaction_by_ids(connection, txids: list): txspace = connection.space("transactions") inxspace = connection.space("inputs") @@ -53,7 +53,7 @@ def _group_transaction_by_ids(connection, txids: list): return _transactions -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def store_transactions(connection, signed_transactions: list): txspace = connection.space("transactions") inxspace = connection.space("inputs") @@ -86,26 +86,26 @@ def store_transactions(connection, signed_transactions: list): assetsxspace.insert(txtuples["asset"]) -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_transaction(connection, transaction_id: str): _transactions = _group_transaction_by_ids(txids=[transaction_id], connection=connection) return next(iter(_transactions), None) -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_transactions(connection, transactions_ids: list): _transactions = _group_transaction_by_ids(txids=transactions_ids, connection=connection) return _transactions -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def store_metadatas(connection, metadata: list): space = connection.space("meta_data") for meta in metadata: space.insert((meta["id"], meta["data"] if not "metadata" in meta else meta["metadata"])) -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_metadata(connection, transaction_ids: list): _returned_data = [] space = connection.space("meta_data") @@ -116,7 +116,7 @@ def get_metadata(connection, transaction_ids: list): return _returned_data if len(_returned_data) > 0 else None -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def store_asset(connection, asset): space = connection.space("assets") convert = lambda obj: obj if isinstance(obj, tuple) else (obj, obj["id"], obj["id"]) @@ -126,7 +126,7 @@ def store_asset(connection, asset): print("DUPLICATE ERROR") -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def store_assets(connection, assets: list): space = connection.space("assets") convert = lambda obj: obj if isinstance(obj, tuple) else (obj, obj["id"], obj["id"]) @@ -137,7 +137,7 @@ def store_assets(connection, assets: list): print(f"EXCEPTION : {ex} ") -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_asset(connection, asset_id: str): space = connection.space("assets") _data = space.select(asset_id, index="txid_search") @@ -145,7 +145,7 @@ def get_asset(connection, asset_id: str): return _data[0][0] if len(_data) > 0 else [] -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_assets(connection, assets_ids: list) -> list: _returned_data = [] for _id in list(set(assets_ids)): @@ -154,7 +154,7 @@ def get_assets(connection, assets_ids: list) -> list: return sorted(_returned_data, key=lambda k: k["id"], reverse=False) -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_spent(connection, fullfil_transaction_id: str, fullfil_output_index: str): space = connection.space("inputs") _inputs = space.select([fullfil_transaction_id, str(fullfil_output_index)], index="spent_search") @@ -163,7 +163,7 @@ def get_spent(connection, fullfil_transaction_id: str, fullfil_output_index: str return _transactions -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_latest_block(connection): # TODO Here is used DESCENDING OPERATOR space = connection.space("blocks") _all_blocks = space.select() @@ -183,7 +183,7 @@ def get_latest_block(connection): # TODO Here is used DESCENDING OPERATOR return block -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def store_block(connection, block: dict): space = connection.space("blocks") block_unique_id = token_hex(8) @@ -195,7 +195,7 @@ def store_block(connection, block: dict): space.insert((txid, block_unique_id)) -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_txids_filtered(connection, asset_id: str, operation: str = None, last_tx: any = None): # TODO here is used 'OR' operator actions = { @@ -256,7 +256,7 @@ def _remove_text_score(asset): return asset -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_owned_ids(connection, owner: str): space = connection.space("keys") _keys = space.select(owner, index="keys_search") @@ -267,7 +267,7 @@ def get_owned_ids(connection, owner: str): return _transactions -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_spending_transactions(connection, inputs): _transactions = [] @@ -280,7 +280,7 @@ def get_spending_transactions(connection, inputs): return _transactions -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_block(connection, block_id=[]): space = connection.space("blocks") _block = space.select(block_id, index="block_search", limit=1) @@ -295,7 +295,7 @@ def get_block(connection, block_id=[]): return {"app_hash": _block[0], "height": _block[1], "transactions": [_tx[0] for _tx in _txblock]} -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_block_with_transaction(connection, txid: str): space = connection.space("blocks_tx") _all_blocks_tx = space.select(txid, index="id_search") @@ -307,7 +307,7 @@ def get_block_with_transaction(connection, txid: str): return [{"height": _height[1]} for _height in _block.data] -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def delete_transactions(connection, txn_ids: list): tx_space = connection.space("transactions") for _id in txn_ids: @@ -335,7 +335,7 @@ def delete_transactions(connection, txn_ids: list): assets_space.delete(_id, index="txid_search") -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def store_unspent_outputs(connection, *unspent_outputs: list): space = connection.space('utxos') result = [] @@ -345,7 +345,7 @@ def store_unspent_outputs(connection, *unspent_outputs: list): result.append(output.data) return result -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def delete_unspent_outputs(connection, *unspent_outputs: list): space = connection.space('utxos') result = [] @@ -356,14 +356,14 @@ def delete_unspent_outputs(connection, *unspent_outputs: list): return result -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_unspent_outputs(connection, query=None): # for now we don't have implementation for 'query'. space = connection.space('utxos') _utxos = space.select([]).data return [loads(utx[2]) for utx in _utxos] -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def store_pre_commit_state(connection, state: dict): space = connection.space("pre_commits") _precommit = space.select(state["height"], index="height_search", limit=1) @@ -375,7 +375,7 @@ def store_pre_commit_state(connection, state: dict): limit=1) -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_pre_commit_state(connection): space = connection.space("pre_commits") _commit = space.select([], index="id_search").data @@ -385,7 +385,7 @@ def get_pre_commit_state(connection): return {"height": _commit[1], "transactions": _commit[2]} -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def store_validator_set(conn, validators_update: dict): space = conn.space("validators") _validator = space.select(validators_update["height"], index="height_search", limit=1) @@ -397,7 +397,7 @@ def store_validator_set(conn, validators_update: dict): limit=1) -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def delete_validator_set(connection, height: int): space = connection.space("validators") _validators = space.select(height, index="height_search") @@ -405,7 +405,7 @@ def delete_validator_set(connection, height: int): space.delete(_valid[0]) -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def store_election(connection, election_id: str, height: int, is_concluded: bool): space = connection.space("elections") space.upsert((election_id, height, is_concluded), @@ -415,7 +415,7 @@ def store_election(connection, election_id: str, height: int, is_concluded: bool limit=1) -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def store_elections(connection, elections: list): space = connection.space("elections") for election in elections: @@ -424,7 +424,7 @@ def store_elections(connection, elections: list): election["is_concluded"])) -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def delete_elections(connection, height: int): space = connection.space("elections") _elections = space.select(height, index="height_search") @@ -432,7 +432,7 @@ def delete_elections(connection, height: int): space.delete(_elec[0]) -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_validator_set(connection, height: int = None): space = connection.space("validators") _validators = space.select() @@ -446,7 +446,7 @@ def get_validator_set(connection, height: int = None): return next(iter(sorted(_validators, key=lambda k: k["height"], reverse=True)), None) -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_election(connection, election_id: str): space = connection.space("elections") _elections = space.select(election_id, index="id_search") @@ -457,7 +457,7 @@ def get_election(connection, election_id: str): return {"election_id": _election[0], "height": _election[1], "is_concluded": _election[2]} -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_asset_tokens_for_public_key(connection, asset_id: str, public_key: str): space = connection.space("keys") # _keys = space.select([public_key], index="keys_search") @@ -469,7 +469,7 @@ def get_asset_tokens_for_public_key(connection, asset_id: str, public_key: str): return _grouped_transactions -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def store_abci_chain(connection, height: int, chain_id: str, is_synced: bool = True): space = connection.space("abci_chains") space.upsert((height, is_synced, chain_id), @@ -479,7 +479,7 @@ def store_abci_chain(connection, height: int, chain_id: str, is_synced: bool = T limit=1) -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def delete_abci_chain(connection, height: int): space = connection.space("abci_chains") _chains = space.select(height, index="height_search") @@ -487,7 +487,7 @@ def delete_abci_chain(connection, height: int): space.delete(_chain[2]) -@register_query(TarantoolDB) +@register_query(TarantoolDBConnection) def get_latest_abci_chain(connection): space = connection.space("abci_chains") _all_chains = space.select().data diff --git a/planetmint/backend/tarantool/schema.py b/planetmint/backend/tarantool/schema.py index c7f50b8..5992ead 100644 --- a/planetmint/backend/tarantool/schema.py +++ b/planetmint/backend/tarantool/schema.py @@ -2,22 +2,22 @@ import warnings from planetmint.backend.utils import module_dispatch_registrar from planetmint import backend -from planetmint.backend.tarantool.connection import TarantoolDB +from planetmint.backend.tarantool.connection import TarantoolDBConnection register_schema = module_dispatch_registrar(backend.schema) -@register_schema(TarantoolDB) +@register_schema(TarantoolDBConnection) def drop_database(connection, not_used=None): connection.drop_database() -@register_schema(TarantoolDB) +@register_schema(TarantoolDBConnection) def create_database(connection, not_used=None): connection.init_database() -@register_schema(TarantoolDB) +@register_schema(TarantoolDBConnection) def create_tables(connection, not_used=None): """ This function is not necessary for using backend tarantool. diff --git a/planetmint/commands/planetmint.py b/planetmint/commands/planetmint.py index 154677f..0fc1f06 100644 --- a/planetmint/commands/planetmint.py +++ b/planetmint/commands/planetmint.py @@ -13,7 +13,7 @@ import argparse import copy import json import sys -from planetmint.backend.tarantool.connection import TarantoolDB +from planetmint.backend.tarantool.connection import TarantoolDBConnection from planetmint.core import rollback from planetmint.migrations.chain_migration_election import ChainMigrationElection @@ -265,9 +265,9 @@ def run_drop(args): if response != 'y': return - from planetmint.backend.connection import Connection + from planetmint.backend.connection import connect from planetmint.backend import schema - conn = Connection() + conn = connect() try: schema.drop_database(conn) except DatabaseDoesNotExist: diff --git a/tests/backend/tarantool/conftest.py b/tests/backend/tarantool/conftest.py index ac4a7e1..83cad05 100644 --- a/tests/backend/tarantool/conftest.py +++ b/tests/backend/tarantool/conftest.py @@ -1,5 +1,5 @@ import pytest -from planetmint.backend.connection import Connection +from planetmint.backend.connection import connect # @@ -27,5 +27,5 @@ from planetmint.backend.connection import Connection @pytest.fixture def db_conn(): - conn = Connection() + conn = connect() return conn diff --git a/tests/backend/tarantool/test_schema.py b/tests/backend/tarantool/test_schema.py index 71a21e4..c9d144f 100644 --- a/tests/backend/tarantool/test_schema.py +++ b/tests/backend/tarantool/test_schema.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: (Apache-2.0 AND CC-BY-4.0) # Code is Apache-2.0 and docs are CC-BY-4.0 -from planetmint.backend.tarantool.connection import TarantoolDB +from planetmint.backend.tarantool.connection import TarantoolDBConnection def _check_spaces_by_list(conn, space_names): diff --git a/tests/backend/test_connection.py b/tests/backend/test_connection.py index 47abeeb..4da59c3 100644 --- a/tests/backend/test_connection.py +++ b/tests/backend/test_connection.py @@ -8,9 +8,9 @@ import pytest def test_get_connection_raises_a_configuration_error(monkeypatch): from planetmint.transactions.common.exceptions import ConfigurationError - from planetmint.backend.connection import Connection + from planetmint.backend.connection import connect with pytest.raises(ConfigurationError): - Connection('msaccess', 'localhost', '1337', 'mydb') + connect('msaccess', 'localhost', '1337', 'mydb') with pytest.raises(ConfigurationError): # We need to force a misconfiguration here @@ -18,4 +18,4 @@ def test_get_connection_raises_a_configuration_error(monkeypatch): {'catsandra': 'planetmint.backend.meowmeow.Catsandra'}) - Connection('catsandra', 'localhost', '1337', 'mydb') + connect('catsandra', 'localhost', '1337', 'mydb') diff --git a/tests/commands/test_commands.py b/tests/commands/test_commands.py index 73c7dd3..92ee787 100644 --- a/tests/commands/test_commands.py +++ b/tests/commands/test_commands.py @@ -94,9 +94,9 @@ def test__run_init(mocker): init_db_mock = mocker.patch( 'planetmint.backend.tarantool.connection.TarantoolDB.init_database') - from planetmint.backend.connection import Connection + from planetmint.backend.connection import connect - conn = Connection() + conn = connect() conn.init_database() init_db_mock.assert_called_once_with() diff --git a/tests/conftest.py b/tests/conftest.py index 7e02cf7..e0bf2a4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -18,8 +18,8 @@ import codecs from collections import namedtuple from logging import getLogger from logging.config import dictConfig -from planetmint.backend.connection import Connection -from planetmint.backend.tarantool.connection import TarantoolDB +from planetmint.backend.connection import connect +from planetmint.backend.tarantool.connection import TarantoolDBConnection import pytest # from pymongo import MongoClient @@ -123,10 +123,10 @@ def _configure_planetmint(request): @pytest.fixture(scope='session') def _setup_database(_configure_planetmint): # TODO Here is located setup database - from planetmint.backend.tarantool.connection import TarantoolDB + from planetmint.backend.tarantool.connection import TarantoolDBConnection print('Deleting `{}` database') - db_conn = Connection() + db_conn = connect() db_conn.drop_database() db_conn.init_database() print('Finished deleting ``') @@ -134,17 +134,17 @@ def _setup_database(_configure_planetmint): # TODO Here is located setup databa yield print('Initializing test db') - db_conn2 = Connection() + db_conn2 = connect() db_conn2.drop_database() print('Finishing init database') @pytest.fixture def _bdb(_setup_database): - from planetmint.backend import Connection + from planetmint.backend import connect from planetmint.transactions.common.memoize import to_dict, from_dict from planetmint.models import Transaction - conn = Connection() + conn = connect() yield to_dict.cache_clear() @@ -383,8 +383,8 @@ def db_name(db_config): @pytest.fixture def db_conn(): - from planetmint.backend import Connection - return Connection() + from planetmint.backend import connect + return connect() @pytest.fixture @@ -533,7 +533,7 @@ def unspent_outputs(unspent_output_0, unspent_output_1, unspent_output_2): @pytest.fixture def tarantool_client(db_context): # TODO Here add TarantoolConnectionClass - return TarantoolDB(host=db_context.host, port=db_context.port) + return TarantoolDBConnection(host=db_context.host, port=db_context.port) # @pytest.fixture diff --git a/tests/db/test_planetmint_api.py b/tests/db/test_planetmint_api.py index 9a04b6c..0fac416 100644 --- a/tests/db/test_planetmint_api.py +++ b/tests/db/test_planetmint_api.py @@ -47,13 +47,13 @@ class TestBigchainApi(object): def test_double_inclusion(self, b, alice): from planetmint.backend.exceptions import OperationError from tarantool.error import DatabaseError - from planetmint.backend.tarantool.connection import TarantoolDB + from planetmint.backend.tarantool.connection import TarantoolDBConnection tx = Create.generate([alice.public_key], [([alice.public_key], 1)]) tx = tx.sign([alice.private_key]) b.store_bulk_transactions([tx]) - if isinstance(b.connection, TarantoolDB): + if isinstance(b.connection, TarantoolDBConnection): with pytest.raises(DatabaseError): b.store_bulk_transactions([tx]) else: @@ -61,9 +61,9 @@ class TestBigchainApi(object): b.store_bulk_transactions([tx]) def test_text_search(self, b, alice): - from planetmint.backend.tarantool.connection import TarantoolDB + from planetmint.backend.tarantool.connection import TarantoolDBConnection - if isinstance(b.connection, TarantoolDB): + if isinstance(b.connection, TarantoolDBConnection): warnings.warn(" :::::: This function is used only with :::::: ") return diff --git a/tests/tendermint/test_fastquery.py b/tests/tendermint/test_fastquery.py index 2b513d1..aaa21d9 100644 --- a/tests/tendermint/test_fastquery.py +++ b/tests/tendermint/test_fastquery.py @@ -93,7 +93,7 @@ def test_filter_unspent_outputs(b, user_pk, user_sk): def test_outputs_query_key_order(b, user_pk, user_sk, user2_pk, user2_sk): from planetmint import backend - from planetmint.backend.connection import Connection + from planetmint.backend.connection import connect from planetmint.backend import query tx1 = Create.generate([user_pk], @@ -119,7 +119,7 @@ def test_outputs_query_key_order(b, user_pk, user_sk, user2_pk, user2_sk): # clean the transaction, metdata and asset collection # conn = connect() - connection = Connection() + connection = connect() # conn.run(conn.collection('transactions').delete_many({})) # conn.run(conn.collection('metadata').delete_many({})) # conn.run(conn.collection('assets').delete_many({})) diff --git a/tests/tendermint/test_lib.py b/tests/tendermint/test_lib.py index 7f0df2e..592ce3e 100644 --- a/tests/tendermint/test_lib.py +++ b/tests/tendermint/test_lib.py @@ -28,10 +28,10 @@ from planetmint.lib import Block def test_asset_is_separated_from_transaciton(b): import copy from planetmint.transactions.common.crypto import generate_key_pair - from planetmint.backend.tarantool.connection import TarantoolDB + from planetmint.backend.tarantool.connection import TarantoolDBConnection - if isinstance(b.connection, TarantoolDB): + if isinstance(b.connection, TarantoolDBConnection): pytest.skip("This specific function is skipped because, assets are stored differently if using Tarantool") @@ -172,14 +172,14 @@ def test_update_utxoset(b, signed_create_tx, signed_transfer_tx, db_conn): @pytest.mark.bdb def test_store_transaction(mocker, b, signed_create_tx, signed_transfer_tx, db_context): - from planetmint.backend.tarantool.connection import TarantoolDB + from planetmint.backend.tarantool.connection import TarantoolDBConnection mocked_store_asset = mocker.patch('planetmint.backend.query.store_assets') mocked_store_metadata = mocker.patch( 'planetmint.backend.query.store_metadatas') mocked_store_transaction = mocker.patch( 'planetmint.backend.query.store_transactions') b.store_bulk_transactions([signed_create_tx]) - if not isinstance(b.connection, TarantoolDB): + if not isinstance(b.connection, TarantoolDBConnection): mongo_client = MongoClient(host=db_context.host, port=db_context.port) utxoset = mongo_client[db_context.name]['utxos'] assert utxoset.count_documents({}) == 1 @@ -209,7 +209,7 @@ def test_store_transaction(mocker, b, signed_create_tx, mocked_store_metadata.reset_mock() mocked_store_transaction.reset_mock() b.store_bulk_transactions([signed_transfer_tx]) - if not isinstance(b.connection, TarantoolDB): + if not isinstance(b.connection, TarantoolDBConnection): assert utxoset.count_documents({}) == 1 utxo = utxoset.find_one() assert utxo['transaction_id'] == signed_transfer_tx.id @@ -219,7 +219,7 @@ def test_store_transaction(mocker, b, signed_create_tx, b.connection, [{'id': signed_transfer_tx.id, 'metadata': signed_transfer_tx.metadata}], ) - if not isinstance(b.connection, TarantoolDB): + if not isinstance(b.connection, TarantoolDBConnection): mocked_store_transaction.assert_called_once_with( b.connection, [{k: v for k, v in signed_transfer_tx.to_dict().items() @@ -230,7 +230,7 @@ def test_store_transaction(mocker, b, signed_create_tx, @pytest.mark.bdb def test_store_bulk_transaction(mocker, b, signed_create_tx, signed_transfer_tx, db_context): - from planetmint.backend.tarantool.connection import TarantoolDB + from planetmint.backend.tarantool.connection import TarantoolDBConnection mocked_store_assets = mocker.patch( 'planetmint.backend.query.store_assets') mocked_store_metadata = mocker.patch( @@ -238,14 +238,14 @@ def test_store_bulk_transaction(mocker, b, signed_create_tx, mocked_store_transactions = mocker.patch( 'planetmint.backend.query.store_transactions') b.store_bulk_transactions((signed_create_tx,)) - if not isinstance(b.connection, TarantoolDB): + if not isinstance(b.connection, TarantoolDBConnection): mongo_client = MongoClient(host=db_context.host, port=db_context.port) utxoset = mongo_client[db_context.name]['utxos'] assert utxoset.count_documents({}) == 1 utxo = utxoset.find_one() assert utxo['transaction_id'] == signed_create_tx.id assert utxo['output_index'] == 0 - if isinstance(b.connection, TarantoolDB): + if isinstance(b.connection, TarantoolDBConnection): mocked_store_assets.assert_called_once_with( b.connection, # signed_create_tx.asset['data'] this was before [(signed_create_tx.asset, signed_create_tx.id, signed_create_tx.id)], @@ -268,7 +268,7 @@ def test_store_bulk_transaction(mocker, b, signed_create_tx, mocked_store_metadata.reset_mock() mocked_store_transactions.reset_mock() b.store_bulk_transactions((signed_transfer_tx,)) - if not isinstance(b.connection, TarantoolDB): + if not isinstance(b.connection, TarantoolDBConnection): assert utxoset.count_documents({}) == 1 utxo = utxoset.find_one() assert utxo['transaction_id'] == signed_transfer_tx.id @@ -279,7 +279,7 @@ def test_store_bulk_transaction(mocker, b, signed_create_tx, [{'id': signed_transfer_tx.id, 'metadata': signed_transfer_tx.metadata}], ) - if not isinstance(b.connection, TarantoolDB): + if not isinstance(b.connection, TarantoolDBConnection): mocked_store_transactions.assert_called_once_with( b.connection, [{k: v for k, v in signed_transfer_tx.to_dict().items() @@ -304,10 +304,10 @@ def test_delete_zero_unspent_outputs(b, utxoset): @pytest.mark.bdb def test_delete_one_unspent_outputs(b, utxoset): - from planetmint.backend.tarantool.connection import TarantoolDB + from planetmint.backend.tarantool.connection import TarantoolDBConnection unspent_outputs, utxo_collection = utxoset delete_res = b.delete_unspent_outputs(unspent_outputs[0]) - if not isinstance(b.connection, TarantoolDB): + if not isinstance(b.connection, TarantoolDBConnection): assert len(list(delete_res)) == 1 assert utxo_collection.count_documents( {'$or': [ @@ -328,10 +328,10 @@ def test_delete_one_unspent_outputs(b, utxoset): @pytest.mark.bdb def test_delete_many_unspent_outputs(b, utxoset): - from planetmint.backend.tarantool.connection import TarantoolDB + from planetmint.backend.tarantool.connection import TarantoolDBConnection unspent_outputs, utxo_collection = utxoset delete_res = b.delete_unspent_outputs(*unspent_outputs[::2]) - if not isinstance(b.connection, TarantoolDB): + if not isinstance(b.connection, TarantoolDBConnection): assert len(list(delete_res)) == 2 assert utxo_collection.count_documents( {'$or': [ @@ -360,9 +360,9 @@ def test_store_zero_unspent_output(b, utxo_collection): @pytest.mark.bdb def test_store_one_unspent_output(b, unspent_output_1, utxo_collection): - from planetmint.backend.tarantool.connection import TarantoolDB + from planetmint.backend.tarantool.connection import TarantoolDBConnection res = b.store_unspent_outputs(unspent_output_1) - if not isinstance(b.connection, TarantoolDB): + if not isinstance(b.connection, TarantoolDBConnection): assert res.acknowledged assert len(list(res)) == 1 assert utxo_collection.count_documents( @@ -378,9 +378,9 @@ def test_store_one_unspent_output(b, unspent_output_1, utxo_collection): @pytest.mark.bdb def test_store_many_unspent_outputs(b, unspent_outputs, utxo_collection): - from planetmint.backend.tarantool.connection import TarantoolDB + from planetmint.backend.tarantool.connection import TarantoolDBConnection res = b.store_unspent_outputs(*unspent_outputs) - if not isinstance(b.connection, TarantoolDB): + if not isinstance(b.connection, TarantoolDBConnection): assert res.acknowledged assert len(list(res)) == 3 assert utxo_collection.count_documents( diff --git a/tests/test_core.py b/tests/test_core.py index 128c552..35c43d3 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -65,7 +65,7 @@ def test_bigchain_class_default_initialization(config): def test_bigchain_class_initialization_with_parameters(): from planetmint import Planetmint - from planetmint.backend import Connection + from planetmint.backend import connect from planetmint.validation import BaseValidationRules init_db_kwargs = { 'backend': 'localmongodb', @@ -73,7 +73,7 @@ def test_bigchain_class_initialization_with_parameters(): 'port': 12345, 'name': 'this_is_the_db_name', } - connection = Connection(**init_db_kwargs) + connection = connect(**init_db_kwargs) planet = Planetmint(connection=connection) assert planet.connection == connection assert planet.connection.host == init_db_kwargs['host']