diff --git a/requirements.txt b/requirements.txt index 0c3a6b43b221d22eb6438aff93426d3c22fd3d2d..3c377eed23986cd65579fb880bf3d885d3c823a1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,11 @@ quamash asynctest networkx -attrs<=17.2 +attrs duniter-mirage duniterpy>=0.40 pytest pytest-asyncio<0.6 pyyaml -aiohttp<3 \ No newline at end of file +aiohttp +async_timeout \ No newline at end of file diff --git a/src/sakia/app.py b/src/sakia/app.py index 997b88a4c132d4775174b89c195a40635beb21a3..e198750c744243d4a6d7c9552f71ed9ec3083289 100644 --- a/src/sakia/app.py +++ b/src/sakia/app.py @@ -3,7 +3,7 @@ import datetime import logging import socket import i18n_rc - +import async_timeout import aiohttp from PyQt5.QtCore import QObject, pyqtSignal, QTranslator, QCoreApplication, QLocale, Qt from . import __version__ @@ -194,7 +194,7 @@ class Application(QObject): async def get_last_version(self): try: async with aiohttp.ClientSession() as session: - with aiohttp.Timeout(15): + async with async_timeout.timeout(10): response = await session.get("https://api.github.com/repos/duniter/sakia/releases", proxy=self.parameters.proxy()) if response.status == 200: diff --git a/src/sakia/data/connectors/bma.py b/src/sakia/data/connectors/bma.py index 2076a781d0da0578a126d276eeb99aabe919da86..154c5ff5714b15fc98dda875e6c2f6eaad1b9984 100644 --- a/src/sakia/data/connectors/bma.py +++ b/src/sakia/data/connectors/bma.py @@ -217,7 +217,7 @@ class BmaConnector: else: answers[data_hash].append(node) finally: - session.close() + await session.close() if len(answers_data) > 0: if request is bma.wot.lookup: diff --git a/src/sakia/data/connectors/node.py b/src/sakia/data/connectors/node.py index b825381948435a84b17951726566e7bf005eafb1..d4a716add6980103c09d7da67dd63174171cd5f1 100644 --- a/src/sakia/data/connectors/node.py +++ b/src/sakia/data/connectors/node.py @@ -136,7 +136,7 @@ class NodeConnector(QObject): else: closed = True await asyncio.sleep(0) - self.session.close() + await self.session.close() def refresh(self, manual=False): """ @@ -166,13 +166,13 @@ class NodeConnector(QObject): self._connected['block'] = True self._logger.debug("Connected successfully to block ws") async for msg in ws: - if msg.tp == aiohttp.WSMsgType.TEXT: + if msg.type == aiohttp.WSMsgType.TEXT: self._logger.debug("Received a block") block_data = bma.parse_text(msg.data, bma.ws.WS_BLOCk_SCHEMA) await self.refresh_block(block_data) - elif msg.tp == aiohttp.WSMsgType.CLOSED: + elif msg.type == aiohttp.WSMsgType.CLOSED: break - elif msg.tp == aiohttp.WSMsgType.ERROR: + elif msg.type == aiohttp.WSMsgType.ERROR: break except (aiohttp.WSServerHandshakeError, ValueError) as e: self._logger.debug("Websocket block {0} : {1}".format(type(e).__name__, str(e))) @@ -290,13 +290,13 @@ class NodeConnector(QObject): self._connected['peer'] = True self._logger.debug("Connected successfully to peer ws") async for msg in ws: - if msg.tp == aiohttp.WSMsgType.TEXT: + if msg.type == aiohttp.WSMsgType.TEXT: self._logger.debug("Received a peer") peer_data = bma.parse_text(msg.data, bma.ws.WS_PEER_SCHEMA) self.refresh_peer_data(peer_data) - elif msg.tp == aiohttp.WSMsgType.CLOSED: + elif msg.type == aiohttp.WSMsgType.CLOSED: break - elif msg.tp == aiohttp.WSMsgType.ERROR: + elif msg.type == aiohttp.WSMsgType.ERROR: break except (aiohttp.WSServerHandshakeError, ValueError) as e: self._logger.debug("Websocket peer {0} : {1}" diff --git a/src/sakia/data/entities/connection.py b/src/sakia/data/entities/connection.py index 6b3136913748d4d6cf4ea3395c796a99ae0c9a30..3fd7d7e5cafffb22d11be8538d504f8543359677 100644 --- a/src/sakia/data/entities/connection.py +++ b/src/sakia/data/entities/connection.py @@ -17,7 +17,7 @@ class Connection: scrypt_r = attr.ib(convert=int, default=16, cmp=False, hash=False) scrypt_p = attr.ib(convert=int, default=1, cmp=False, hash=False) blockstamp = attr.ib(convert=block_uid, default=BlockUID.empty(), cmp=False, hash=False) - salt = attr.ib(convert=str, init=False, cmp=False, hash=False) + salt = attr.ib(convert=str, init=False, default="", cmp=False, hash=False) password = attr.ib(init=False, convert=str, default="", cmp=False, hash=False) def is_identity(self): diff --git a/src/sakia/data/repositories/blockchains.py b/src/sakia/data/repositories/blockchains.py index de897b35f0ee92854e6733e5c7848a9bba8b8d52..272a5b3f8f24e7b79b54d897ad70c022d13a2813 100644 --- a/src/sakia/data/repositories/blockchains.py +++ b/src/sakia/data/repositories/blockchains.py @@ -10,7 +10,7 @@ class BlockchainsRepo: """The repository for Blockchain entities. """ _conn = attr.ib() # :type sqlite3.Connection - _primary_keys = (Blockchain.currency,) + _primary_keys = (attr.fields(Blockchain).currency,) def insert(self, blockchain): """ @@ -18,7 +18,7 @@ class BlockchainsRepo: :param sakia.data.entities.Blockchain blockchain: the blockchain to commit """ blockchain_tuple = attr.astuple(blockchain.parameters) \ - + attr.astuple(blockchain, filter=attr.filters.exclude(Blockchain.parameters)) + + attr.astuple(blockchain, filter=attr.filters.exclude(attr.fields(Blockchain).parameters)) values = ",".join(['?'] * len(blockchain_tuple)) self._conn.execute("INSERT INTO blockchains VALUES ({0})".format(values), blockchain_tuple) @@ -28,7 +28,7 @@ class BlockchainsRepo: :param sakia.data.entities.Blockchain blockchain: the blockchain to update """ updated_fields = attr.astuple(blockchain, filter=attr.filters.exclude( - Blockchain.parameters, *BlockchainsRepo._primary_keys)) + attr.fields(Blockchain).parameters, *BlockchainsRepo._primary_keys)) where_fields = attr.astuple(blockchain, filter=attr.filters.include(*BlockchainsRepo._primary_keys)) self._conn.execute("""UPDATE blockchains SET current_buid=?, diff --git a/src/sakia/data/repositories/certifications.py b/src/sakia/data/repositories/certifications.py index 2ae935801a543d7cc325b35b087d1ca255608c59..d51e5a8e9d15be2095926aa490b9c82da352421b 100644 --- a/src/sakia/data/repositories/certifications.py +++ b/src/sakia/data/repositories/certifications.py @@ -8,8 +8,8 @@ class CertificationsRepo: """The repository for Communities entities. """ _conn = attr.ib() # :type sqlite3.Connection - _primary_keys = (Certification.currency, Certification.certified, - Certification.certifier, Certification.block,) + _primary_keys = (attr.fields(Certification).currency, attr.fields(Certification).certified, + attr.fields(Certification).certifier, attr.fields(Certification).block,) def insert(self, certification): """ diff --git a/src/sakia/data/repositories/connections.py b/src/sakia/data/repositories/connections.py index 5a80c97a32461a6b06816a143ac3d8b2d7bc151d..ef9b3450d4471a5b1ac0587c0d3a80c31010b3a4 100644 --- a/src/sakia/data/repositories/connections.py +++ b/src/sakia/data/repositories/connections.py @@ -9,14 +9,15 @@ class ConnectionsRepo: The repository for Connections entities. """ _conn = attr.ib() # :type sqlite3.Connection - _primary_keys = (Connection.currency, Connection.pubkey) + _primary_keys = (attr.fields(Connection).currency, attr.fields(Connection).pubkey) def insert(self, connection): """ Commit a connection to the database :param sakia.data.entities.Connection connection: the connection to commit """ - connection_tuple = attr.astuple(connection, filter=attr.filters.exclude(Connection.password, Connection.salt)) + connection_tuple = attr.astuple(connection, filter=attr.filters.exclude(attr.fields(Connection).password, + attr.fields(Connection).salt)) values = ",".join(['?'] * len(connection_tuple)) self._conn.execute("INSERT INTO connections VALUES ({0})".format(values), connection_tuple) @@ -25,7 +26,8 @@ class ConnectionsRepo: Update an existing connection in the database :param sakia.data.entities.Connection connection: the certification to update """ - updated_fields = attr.astuple(connection, filter=attr.filters.exclude(Connection.password, Connection.salt, + updated_fields = attr.astuple(connection, filter=attr.filters.exclude(attr.fields(Connection).password, + attr.fields(Connection).salt, *ConnectionsRepo._primary_keys)) where_fields = attr.astuple(connection, filter=attr.filters.include(*ConnectionsRepo._primary_keys)) diff --git a/src/sakia/data/repositories/contacts.py b/src/sakia/data/repositories/contacts.py index 14ed377f14ae2bada1d9219c3c9a73b88154e569..6b38e409ce65355595fa2bc75480ea173ca2c022 100644 --- a/src/sakia/data/repositories/contacts.py +++ b/src/sakia/data/repositories/contacts.py @@ -9,7 +9,7 @@ class ContactsRepo: The repository for Contacts entities. """ _conn = attr.ib() # :type sqlite3.Contact - _primary_keys = (Contact.contact_id,) + _primary_keys = (attr.fields(Contact).contact_id,) def insert(self, contact): """ diff --git a/src/sakia/data/repositories/dividends.py b/src/sakia/data/repositories/dividends.py index 41ba667f732dc38bb73745be09ed7f8ceb2fc93b..da1a74e569d5555ffd0bad0d79284a8970132258 100644 --- a/src/sakia/data/repositories/dividends.py +++ b/src/sakia/data/repositories/dividends.py @@ -8,7 +8,7 @@ class DividendsRepo: """The repository for Communities entities. """ _conn = attr.ib() # :type sqlite3.Connection - _primary_keys = (Dividend.currency, Dividend.pubkey, Dividend.block_number) + _primary_keys = (attr.fields(Dividend).currency, attr.fields(Dividend).pubkey, attr.fields(Dividend).block_number) def insert(self, dividend): """ diff --git a/src/sakia/data/repositories/identities.py b/src/sakia/data/repositories/identities.py index 6867d8efad9363577b77ca0256df9426cced0a86..c136250b7b94999e378956705999c45ea2773398 100644 --- a/src/sakia/data/repositories/identities.py +++ b/src/sakia/data/repositories/identities.py @@ -10,7 +10,7 @@ class IdentitiesRepo: """The repository for Identities entities. """ _conn = attr.ib() # :type sqlite3.Connection - _primary_keys = (Identity.currency, Identity.pubkey, Identity.uid, Identity.blockstamp) + _primary_keys = (attr.fields(Identity).currency, attr.fields(Identity).pubkey, attr.fields(Identity).uid, attr.fields(Identity).blockstamp) def insert(self, identity): """ diff --git a/src/sakia/data/repositories/nodes.py b/src/sakia/data/repositories/nodes.py index 368a0e85979fe204473c51d795b6fbcb0908da64..7ff4a0ec0004928d530ffef8d6c1cb0dc2c21183 100644 --- a/src/sakia/data/repositories/nodes.py +++ b/src/sakia/data/repositories/nodes.py @@ -9,7 +9,7 @@ class NodesRepo: """The repository for Communities entities. """ _conn = attr.ib() # :type sqlite3.Connection - _primary_keys = (Node.currency, Node.pubkey) + _primary_keys = (attr.fields(Node).currency, attr.fields(Node).pubkey) def insert(self, node): """ diff --git a/src/sakia/data/repositories/sources.py b/src/sakia/data/repositories/sources.py index 58ac6c7b24b1292b95a16561f3a42840b837a56c..5b346e965aa6bbbc59d078ea330fdc8447e4e70c 100644 --- a/src/sakia/data/repositories/sources.py +++ b/src/sakia/data/repositories/sources.py @@ -8,7 +8,7 @@ class SourcesRepo: """The repository for Communities entities. """ _conn = attr.ib() # :type sqlite3.Connection - _primary_keys = (Source.currency, Source.pubkey, Source.identifier, Source.noffset) + _primary_keys = (attr.fields(Source).currency, attr.fields(Source).pubkey, attr.fields(Source).identifier, attr.fields(Source).noffset) def insert(self, source): """ diff --git a/src/sakia/data/repositories/transactions.py b/src/sakia/data/repositories/transactions.py index 4a657a61b9c5fb433567cd0c1c08a8bd8aa6c958..5607f770f0acc613364c5418b3fd6f073a39f7fa 100644 --- a/src/sakia/data/repositories/transactions.py +++ b/src/sakia/data/repositories/transactions.py @@ -8,7 +8,7 @@ class TransactionsRepo: """The repository for Communities entities. """ _conn = attr.ib() # :type sqlite3.Connection - _primary_keys = (Transaction.currency, Transaction.pubkey, Transaction.sha_hash,) + _primary_keys = (attr.fields(Transaction).currency, attr.fields(Transaction).pubkey, attr.fields(Transaction).sha_hash,) def insert(self, transaction): """