]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Add gen.YieldFuture.
authorBen Darnell <ben@bendarnell.com>
Mon, 3 Sep 2012 19:00:26 +0000 (12:00 -0700)
committerBen Darnell <ben@bendarnell.com>
Mon, 3 Sep 2012 19:00:26 +0000 (12:00 -0700)
tornado/gen.py
tornado/test/concurrent_test.py

index 506697d7b9a426c81bda2cb6456fef40947760ca..bc0f935dcf592500caf73d860ebec523e31701b8 100644 (file)
@@ -69,6 +69,7 @@ import operator
 import sys
 import types
 
+from tornado.ioloop import IOLoop
 from tornado.stack_context import ExceptionStackContext
 
 
@@ -247,6 +248,24 @@ class Task(YieldPoint):
         return self.runner.pop_result(self.key)
 
 
+class YieldFuture(YieldPoint):
+    def __init__(self, future, io_loop=None):
+        self.future = future
+        self.io_loop = io_loop or IOLoop.instance()
+
+    def start(self, runner):
+        self.runner = runner
+        self.key = object()
+        runner.register_callback(self.key)
+        self.io_loop.add_future(self.future, runner.result_callback(self.key))
+
+    def is_ready(self):
+        return self.runner.is_ready(self.key)
+
+    def get_result(self):
+        return self.runner.pop_result(self.key).result()
+
+
 class Multi(YieldPoint):
     """Runs multiple asynchronous operations in parallel.
 
index 87f590e15fa1a2f96d671f732a6d99a56cdf686a..2cf3718949d20651adc517e7bb53057c64715583 100644 (file)
@@ -158,6 +158,26 @@ class ClientTestMixin(object):
         self.wait()
         self.assertRaisesRegexp(CapError, "already capitalized", future.result)
 
+    def test_generator(self):
+        @gen.engine
+        def f():
+            result = yield gen.YieldFuture(self.client.capitalize("hello"),
+                                           io_loop=self.io_loop)
+            self.assertEqual(result, "HELLO")
+            self.stop()
+        f()
+        self.wait()
+
+    def test_generator_error(self):
+        @gen.engine
+        def f():
+            with self.assertRaisesRegexp(CapError, "already capitalized"):
+                 yield gen.YieldFuture(self.client.capitalize("HELLO"),
+                                       io_loop=self.io_loop)
+            self.stop()
+        f()
+        self.wait()
+
 
 class ManualClientTest(ClientTestMixin, AsyncTestCase, LogTrapTestCase):
     client_class = ManualCapClient