From 565327153a1841e35343bef3aae6b8fa7f512b4f Mon Sep 17 00:00:00 2001
From: inso <insomniak.fr@gmaiL.com>
Date: Tue, 20 Feb 2018 10:45:52 +0100
Subject: [PATCH] Fix aiohttp and attrs compat

---
 requirements.txt                              |  5 +++--
 src/sakia/app.py                              |  4 ++--
 src/sakia/data/connectors/bma.py              |  2 +-
 src/sakia/data/connectors/node.py             | 14 +++++++-------
 src/sakia/data/entities/connection.py         |  2 +-
 src/sakia/data/repositories/blockchains.py    |  6 +++---
 src/sakia/data/repositories/certifications.py |  4 ++--
 src/sakia/data/repositories/connections.py    |  8 +++++---
 src/sakia/data/repositories/contacts.py       |  2 +-
 src/sakia/data/repositories/dividends.py      |  2 +-
 src/sakia/data/repositories/identities.py     |  2 +-
 src/sakia/data/repositories/nodes.py          |  2 +-
 src/sakia/data/repositories/sources.py        |  2 +-
 src/sakia/data/repositories/transactions.py   |  2 +-
 14 files changed, 30 insertions(+), 27 deletions(-)

diff --git a/requirements.txt b/requirements.txt
index 0c3a6b43..3c377eed 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 997b88a4..e198750c 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 2076a781..154c5ff5 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 b8253819..d4a716ad 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 6b313691..3fd7d7e5 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 de897b35..272a5b3f 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 2ae93580..d51e5a8e 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 5a80c97a..ef9b3450 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 14ed377f..6b38e409 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 41ba667f..da1a74e5 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 6867d8ef..c136250b 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 368a0e85..7ff4a0ec 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 58ac6c7b..5b346e96 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 4a657a61..5607f770 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):
         """
-- 
GitLab