[Python-checkins] cpython: Issue 24179: Support 'async for' for asyncio.StreamReader.

yury.selivanov python-checkins at python.org
Wed May 13 20:24:07 CEST 2015


https://hg.python.org/cpython/rev/4f6978343ef6
changeset:   96030:4f6978343ef6
user:        Yury Selivanov <yselivanov at sprymix.com>
date:        Wed May 13 14:23:29 2015 -0400
summary:
  Issue 24179: Support 'async for' for asyncio.StreamReader.

files:
  Lib/asyncio/streams.py               |  14 +++++++++++
  Lib/test/test_asyncio/test_pep492.py |  19 ++++++++++++++++
  Misc/NEWS                            |   3 ++
  3 files changed, 36 insertions(+), 0 deletions(-)


diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py
--- a/Lib/asyncio/streams.py
+++ b/Lib/asyncio/streams.py
@@ -6,6 +6,7 @@
            ]
 
 import socket
+import sys
 
 if hasattr(socket, 'AF_UNIX'):
     __all__.extend(['open_unix_connection', 'start_unix_server'])
@@ -19,6 +20,7 @@
 
 
 _DEFAULT_LIMIT = 2**16
+_PY35 = sys.version_info >= (3, 5)
 
 
 class IncompleteReadError(EOFError):
@@ -485,3 +487,15 @@
             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
diff --git a/Lib/test/test_asyncio/test_pep492.py b/Lib/test/test_asyncio/test_pep492.py
--- a/Lib/test/test_asyncio/test_pep492.py
+++ b/Lib/test/test_asyncio/test_pep492.py
@@ -64,5 +64,24 @@
             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()
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -119,6 +119,9 @@
 - 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
 -----
 

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list