From: =?utf-8?q?Timo_R=C3=B6hling?= <roehling@debian.org>
Date: Sat, 10 Dec 2022 21:25:38 +0100
Subject: Fix Python 3.11 compatibility

---
 aiomeasures/clients/bases.py             |  3 +--
 aiomeasures/clients/datadog/client.py    |  7 +++----
 aiomeasures/clients/statsd/client.py     |  7 +++----
 aiomeasures/reporters/statsd_reporter.py | 17 +++++++---------
 tests/test_datadog.py                    | 35 ++++++++++++++++----------------
 tests/test_statsd.py                     | 35 ++++++++++++++++----------------
 6 files changed, 48 insertions(+), 56 deletions(-)

diff --git a/aiomeasures/clients/bases.py b/aiomeasures/clients/bases.py
index 9ddbcd8..907768f 100644
--- a/aiomeasures/clients/bases.py
+++ b/aiomeasures/clients/bases.py
@@ -54,9 +54,8 @@ class Client(metaclass=ABCMeta):
     def format(self, metric, prefix=None):
         raise NotImplementedError()
 
-    @asyncio.coroutine
     @abstractmethod
-    def send(self):
+    async def send(self):
         """Sends key/value pairs via UDP or TCP.
         """
         raise NotImplementedError()
diff --git a/aiomeasures/clients/datadog/client.py b/aiomeasures/clients/datadog/client.py
index c0dab2c..cd111b7 100644
--- a/aiomeasures/clients/datadog/client.py
+++ b/aiomeasures/clients/datadog/client.py
@@ -34,15 +34,14 @@ class Datadog(Client):
     def format(self, obj):
         return formatting.format(obj, self.prefix, self.tags)
 
-    @asyncio.coroutine
-    def send(self):
+    async def send(self):
         """Sends key/value pairs to Datadog agent.
         """
-        yield from self.reporter.connect()
+        await self.reporter.connect()
         rate = random()
         formatter = self.format
         metrics = self.collector.flush(rate=rate, formatter=formatter)
-        yield from self.reporter.send(metrics)
+        await self.reporter.send(metrics)
 
     def close(self):
         self.reporter.close()
diff --git a/aiomeasures/clients/statsd/client.py b/aiomeasures/clients/statsd/client.py
index 1ac56fe..4169f89 100644
--- a/aiomeasures/clients/statsd/client.py
+++ b/aiomeasures/clients/statsd/client.py
@@ -34,15 +34,14 @@ class StatsD(Client):
     def format(self, obj):
         return formatting.format(obj, self.prefix, self.tags)
 
-    @asyncio.coroutine
-    def send(self):
+    async def send(self):
         """Sends key/value pairs to StatsD Server.
         """
-        yield from self.reporter.connect()
+        await self.reporter.connect()
         rate = random()
         formatter = self.format
         metrics = self.collector.flush(rate=rate, formatter=formatter)
-        yield from self.reporter.send(metrics)
+        await self.reporter.send(metrics)
 
     def close(self):
         self.reporter.close()
diff --git a/aiomeasures/reporters/statsd_reporter.py b/aiomeasures/reporters/statsd_reporter.py
index 37f9e99..c5d1941 100644
--- a/aiomeasures/reporters/statsd_reporter.py
+++ b/aiomeasures/reporters/statsd_reporter.py
@@ -16,11 +16,10 @@ class StatsDReporter:
         self.loop = loop or asyncio.get_event_loop()
         self.log = logging.getLogger(__name__)
         self.protocol = None
-        self._connecting = asyncio.Lock(loop=self.loop)
+        self._connecting = asyncio.Lock()
         self.protocol = None
 
-    @asyncio.coroutine
-    def send(self, metrics):
+    async def send(self, metrics):
         """Sends key/value pairs via UDP or TCP.
         """
         msg = bytearray()
@@ -34,14 +33,13 @@ class StatsDReporter:
             self.protocol.send(msg)
             msg[:] = []
 
-    @asyncio.coroutine
-    def connect(self):
+    async def connect(self):
         if self.protocol:
             return
 
-        with (yield from self._connecting):
+        async with self._connecting:
             if not self.protocol:
-                transport, protocol = yield from connect(self.addr, self.loop)
+                transport, protocol = await connect(self.addr, self.loop)
                 self.protocol = protocol
 
     def close(self):
@@ -77,10 +75,9 @@ class UDPProtocol(asyncio.Protocol):
             self.transport.close()
 
 
-@asyncio.coroutine
-def connect(addr, loop):
+async def connect(addr, loop):
     if addr.proto == 'udp':
-        transport, protocol = yield from loop.create_datagram_endpoint(
+        transport, protocol = await loop.create_datagram_endpoint(
             lambda: UDPProtocol(),
             remote_addr=addr
         )
diff --git a/tests/test_datadog.py b/tests/test_datadog.py
index ed8de38..866d27e 100644
--- a/tests/test_datadog.py
+++ b/tests/test_datadog.py
@@ -87,8 +87,7 @@ def test_checks(check,expected):
     assert handler.format(check) == expected
 
 
-@asyncio.coroutine
-def fake_server(event_loop, port=None):
+async def fake_server(event_loop, port=None):
     port = port or 0
     class Protocol:
 
@@ -104,7 +103,7 @@ def fake_server(event_loop, port=None):
         def connection_lost(self, *args):
             pass
 
-    transport, protocol = yield from event_loop.create_datagram_endpoint(
+    transport, protocol = await event_loop.create_datagram_endpoint(
         lambda: Protocol(),
         local_addr=('0.0.0.0', port)
     )
@@ -114,22 +113,22 @@ def fake_server(event_loop, port=None):
 
 
 @pytest.mark.asyncio
-def test_client_event(event_loop):
-    transport, protocol, port = yield from fake_server(event_loop)
+async def test_client_event(event_loop):
+    transport, protocol, port = await fake_server(event_loop)
     client = aiomeasures.Datadog('udp://127.0.0.1:%s' % port)
-    asyncio.sleep(.4)
+    await asyncio.sleep(.4)
     client.event('title', 'text')
-    yield from asyncio.sleep(.1)
+    await asyncio.sleep(.1)
     assert '_e{5,4}title|text' in protocol.msg
     transport.close()
     client.close()
 
 
 @pytest.mark.asyncio
-def test_client(event_loop):
-    transport, protocol, port = yield from fake_server(event_loop)
+async def test_client(event_loop):
+    transport, protocol, port = await fake_server(event_loop)
     client = aiomeasures.Datadog('udp://127.0.0.1:%s' % port)
-    asyncio.sleep(.4)
+    await asyncio.sleep(.4)
     client.incr('example.a')
     client.timing('example.b', 500)
     client.gauge('example.c', 1)
@@ -137,7 +136,7 @@ def test_client(event_loop):
     client.decr('example.e')
     client.counter('example.f', 42)
     client.histogram('example.g', 13)
-    yield from asyncio.sleep(.1)
+    await asyncio.sleep(.1)
     assert 'example.a:1|c' in protocol.msg
     assert 'example.b:500|ms' in protocol.msg
     assert 'example.c:1|g' in protocol.msg
@@ -150,22 +149,22 @@ def test_client(event_loop):
 
 
 @pytest.mark.asyncio
-def test_reliablility(event_loop):
-    transport, protocol, port = yield from fake_server(event_loop)
+async def test_reliablility(event_loop):
+    transport, protocol, port = await fake_server(event_loop)
     client = aiomeasures.Datadog('udp://127.0.0.1:%s' % port)
-    asyncio.sleep(.4)
+    await asyncio.sleep(.4)
     client.incr('example.a')
-    yield from asyncio.sleep(.1)
+    await asyncio.sleep(.1)
     assert 'example.a:1|c' in protocol.msg
     transport.close()
 
     client.incr('example.b')
-    yield from asyncio.sleep(.1)
+    await asyncio.sleep(.1)
     assert 'example.b:1|c' not in protocol.msg
 
-    transport, protocol, port = yield from fake_server(event_loop, port)
+    transport, protocol, port = await fake_server(event_loop, port)
     client.incr('example.c')
-    yield from asyncio.sleep(.1)
+    await asyncio.sleep(.1)
     assert 'example.c:1|c' in protocol.msg
     transport.close()
 
diff --git a/tests/test_statsd.py b/tests/test_statsd.py
index a371c89..d51ab5e 100644
--- a/tests/test_statsd.py
+++ b/tests/test_statsd.py
@@ -87,8 +87,7 @@ def test_checks(check,expected):
     assert handler.format(check) == expected
 
 
-@asyncio.coroutine
-def fake_server(event_loop, port=None):
+async def fake_server(event_loop, port=None):
     port = port or 0
     class Protocol:
 
@@ -104,7 +103,7 @@ def fake_server(event_loop, port=None):
         def connection_lost(self, *args):
             pass
 
-    transport, protocol = yield from event_loop.create_datagram_endpoint(
+    transport, protocol = await event_loop.create_datagram_endpoint(
         lambda: Protocol(),
         local_addr=('0.0.0.0', port)
     )
@@ -114,22 +113,22 @@ def fake_server(event_loop, port=None):
 
 
 @pytest.mark.asyncio
-def test_client_event(event_loop):
-    transport, protocol, port = yield from fake_server(event_loop)
+async def test_client_event(event_loop):
+    transport, protocol, port = await fake_server(event_loop)
     client = aiomeasures.StatsD('udp://127.0.0.1:%s' % port)
-    asyncio.sleep(.4)
+    await asyncio.sleep(.4)
     client.event('title', 'text')
-    yield from asyncio.sleep(.1)
+    await asyncio.sleep(.1)
     assert '_e{5,4}title|text' in protocol.msg
     transport.close()
     client.close()
 
 
 @pytest.mark.asyncio
-def test_client(event_loop):
-    transport, protocol, port = yield from fake_server(event_loop)
+async def test_client(event_loop):
+    transport, protocol, port = await fake_server(event_loop)
     client = aiomeasures.StatsD('udp://127.0.0.1:%s' % port)
-    asyncio.sleep(.4)
+    await asyncio.sleep(.4)
     client.incr('example.a')
     client.timing('example.b', 500)
     client.gauge('example.c', 1)
@@ -137,7 +136,7 @@ def test_client(event_loop):
     client.decr('example.e')
     client.counter('example.f', 42)
     client.histogram('example.g', 13)
-    yield from asyncio.sleep(.1)
+    await asyncio.sleep(.1)
     assert 'example.a:1|c' in protocol.msg
     assert 'example.b:500|ms' in protocol.msg
     assert 'example.c:1|g' in protocol.msg
@@ -150,22 +149,22 @@ def test_client(event_loop):
 
 
 @pytest.mark.asyncio
-def test_reliablility(event_loop):
-    transport, protocol, port = yield from fake_server(event_loop)
+async def test_reliablility(event_loop):
+    transport, protocol, port = await fake_server(event_loop)
     client = aiomeasures.StatsD('udp://127.0.0.1:%s' % port)
-    asyncio.sleep(.4)
+    await asyncio.sleep(.4)
     client.incr('example.a')
-    yield from asyncio.sleep(.1)
+    await asyncio.sleep(.1)
     assert 'example.a:1|c' in protocol.msg
     transport.close()
 
     client.incr('example.b')
-    yield from asyncio.sleep(.1)
+    await asyncio.sleep(.1)
     assert 'example.b:1|c' not in protocol.msg
 
-    transport, protocol, port = yield from fake_server(event_loop, port)
+    transport, protocol, port = await fake_server(event_loop, port)
     client.incr('example.c')
-    yield from asyncio.sleep(.1)
+    await asyncio.sleep(.1)
     assert 'example.c:1|c' in protocol.msg
     transport.close()
 
