]> granicus.if.org Git - python/commitdiff
Issue 24179: Support 'async for' for asyncio.StreamReader.
authorYury Selivanov <yselivanov@sprymix.com>
Wed, 13 May 2015 18:23:29 +0000 (14:23 -0400)
committerYury Selivanov <yselivanov@sprymix.com>
Wed, 13 May 2015 18:23:29 +0000 (14:23 -0400)
Lib/asyncio/streams.py
Lib/test/test_asyncio/test_pep492.py
Misc/NEWS

index 64ff3d2edc4c5586fef3de5ca72b915bdcad87c2..176c65e3969cb4bfc11c5e90e8aabadc41d58cf9 100644 (file)
@@ -6,6 +6,7 @@ __all__ = ['StreamReader', 'StreamWriter', 'StreamReaderProtocol',
            ]
 
 import socket
+import sys
 
 if hasattr(socket, 'AF_UNIX'):
     __all__.extend(['open_unix_connection', 'start_unix_server'])
@@ -19,6 +20,7 @@ from .log import logger
 
 
 _DEFAULT_LIMIT = 2**16
+_PY35 = sys.version_info >= (3, 5)
 
 
 class IncompleteReadError(EOFError):
@@ -485,3 +487,15 @@ class StreamReader:
             n -= len(block)
 
         return b''.join(blocks)
+
+    if _PY35:
+        @coroutine
+        def __aiter__(self):
+            return self
+
+        @coroutine
+        def __anext__(self):
+            val = yield from self.readline()
+            if val == b'':
+                raise StopAsyncIteration
+            return val
index c9a2f969a44feced8b5f8aa0391ebbe60248911d..3d8d1b8c7a338c62c4c1530e6a968385421e0f92 100644 (file)
@@ -64,5 +64,24 @@ class LockTests(BaseTest):
             self.assertFalse(primitive.locked())
 
 
+class StreamReaderTests(BaseTest):
+
+    def test_readline(self):
+        DATA = b'line1\nline2\nline3'
+
+        stream = asyncio.StreamReader(loop=self.loop)
+        stream.feed_data(DATA)
+        stream.feed_eof()
+
+        async def reader():
+            data = []
+            async for line in stream:
+                data.append(line)
+            return data
+
+        data = self.loop.run_until_complete(reader())
+        self.assertEqual(data, [b'line1\n', b'line2\n', b'line3'])
+
+
 if __name__ == '__main__':
     unittest.main()
index b7cd1c7a606efd8dc4613d2a091c640292111f4f..b4338489e59e4faf4ff7870b964f411a85c90d55 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -119,6 +119,9 @@ Library
 - Issue 24178: asyncio.Lock, Condition, Semaphore, and BoundedSemaphore
   support new 'async with' syntax.  Contributed by Yury Selivanov.
 
+- Issue 24179: Support 'async for' for asyncio.StreamReader.
+  Contributed by Yury Selivanov.
+
 Tests
 -----