]> granicus.if.org Git - python/commitdiff
asyncio: sync with Tulip
authorVictor Stinner <victor.stinner@gmail.com>
Wed, 2 Jul 2014 22:59:00 +0000 (00:59 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Wed, 2 Jul 2014 22:59:00 +0000 (00:59 +0200)
* _UnixSubprocessTransport: fix file mode of stdin. Open stdin in write mode,
  not in read mode
* Examples: close the event loop at exit
* More reliable CoroWrapper.__del__. If the constructor is interrupted by
  KeyboardInterrupt or the coroutine objet is destroyed lately, some the
  _source_traceback attribute doesn't exist anymore.
* repr(Task): include also the future the task is waiting for

Lib/asyncio/coroutines.py
Lib/asyncio/tasks.py
Lib/asyncio/unix_events.py
Lib/test/test_asyncio/test_tasks.py

index cdb1ea8d889811f93bfddca629f0f3118b8706a5..71a1ec4dd0ea975877e2048dce69298cf6c1bca7 100644 (file)
@@ -111,12 +111,14 @@ class CoroWrapper:
         frame = getattr(gen, 'gi_frame', None)
         if frame is not None and frame.f_lasti == -1:
             func = events._format_callback(self.func, ())
-            tb = ''.join(traceback.format_list(self._source_traceback))
-            message = ('Coroutine %s was never yielded from\n'
-                       'Coroutine object created at (most recent call last):\n'
-                       '%s'
-                       % (func, tb.rstrip()))
-            logger.error(message)
+            msg = 'Coroutine %s was never yielded from' % func
+            tb = getattr(self, '_source_traceback', ())
+            if tb:
+                tb = ''.join(traceback.format_list(tb))
+                msg += ('\nCoroutine object created at '
+                        '(most recent call last):\n')
+                msg += tb.rstrip()
+            logger.error(msg)
 
 
 def coroutine(func):
index e9adf1dfb12aa9315166f962849dff14e599e34a..dd191e770be07799b48a079ff8ba2dd85e0709dd 100644 (file)
@@ -109,6 +109,9 @@ class Task(futures.Future):
         if self._callbacks:
             info.append(self._format_callbacks())
 
+        if self._fut_waiter is not None:
+            info.append('wait_for=%r' % self._fut_waiter)
+
         return '<%s %s>' % (self.__class__.__name__, ' '.join(info))
 
     def get_stack(self, *, limit=None):
index 1cb70ffafbff53e88cb543ae3868c61712d9caca..5f728b5728a21a881fc3d79da4f8511b0ea04fdb 100644 (file)
@@ -494,7 +494,7 @@ class _UnixSubprocessTransport(base_subprocess.BaseSubprocessTransport):
             universal_newlines=False, bufsize=bufsize, **kwargs)
         if stdin_w is not None:
             stdin.close()
-            self._proc.stdin = open(stdin_w.detach(), 'rb', buffering=bufsize)
+            self._proc.stdin = open(stdin_w.detach(), 'wb', buffering=bufsize)
 
 
 class AbstractChildWatcher:
index c64e1ef5f7c162464e0dd1bf64c842155c338d66..83b7e61fdb985371f502ce24d4a7ced9864f4edf 100644 (file)
@@ -218,6 +218,17 @@ class TaskTests(test_utils.TestCase):
                          '<Task pending %s cb=[<Dummy>()]>' % coro)
         self.loop.run_until_complete(t)
 
+    def test_task_repr_wait_for(self):
+        @asyncio.coroutine
+        def wait_for(fut):
+            return (yield from fut)
+
+        fut = asyncio.Future(loop=self.loop)
+        task = asyncio.Task(wait_for(fut), loop=self.loop)
+        test_utils.run_briefly(self.loop)
+        self.assertRegex(repr(task),
+                         '<Task .* wait_for=%s>' % re.escape(repr(fut)))
+
     def test_task_basics(self):
         @asyncio.coroutine
         def outer():