1# mode: run
2# tag: asyncio, pep492
3
4"""
5PYTHON setup.py build_ext -i
6PYTHON test_from_import.py
7PYTHON test_import.py
8PYTHON test_async_def.py
9PYTHON test_async_def_future.py
10PYTHON test_all.py
11"""
12
13######## setup.py ########
14
15from Cython.Build.Dependencies import cythonize
16from distutils.core import setup
17
18setup(
19  ext_modules = cythonize("*.pyx"),
20)
21
22
23######## test_from_import.py ########
24
25import from_asyncio_import
26import asyncio
27
28def runloop(task):
29    loop = asyncio.get_event_loop()
30    result = loop.run_until_complete(task())
31    assert 3 == result, result
32
33import sys
34if sys.version_info < (3, 7):
35    runloop(from_asyncio_import.wait3)
36
37
38######## test_import.py ########
39
40import import_asyncio
41import asyncio
42
43def runloop(task):
44    loop = asyncio.get_event_loop()
45    result = loop.run_until_complete(task())
46    assert 3 == result, result
47
48import sys
49if sys.version_info < (3, 7):
50    runloop(import_asyncio.wait3)
51
52
53######## test_async_def.py ########
54
55import sys
56
57ASYNCIO_SUPPORTS_COROUTINE = sys.version_info[:2] >= (3, 5)
58
59if ASYNCIO_SUPPORTS_COROUTINE:
60    import async_def
61    import asyncio
62
63    def runloop(task):
64        loop = asyncio.get_event_loop()
65        result = loop.run_until_complete(task())
66        assert 3 == result, result
67
68    runloop(async_def.wait3)
69
70
71######## test_async_def_future.py ########
72
73import sys
74
75ASYNCIO_SUPPORTS_COROUTINE = sys.version_info[:2] >= (3, 5)
76
77if ASYNCIO_SUPPORTS_COROUTINE:
78    from async_def_future import await_future
79    import asyncio
80
81    def runloop():
82        loop = asyncio.get_event_loop()
83        task, events, expected = await_future(loop)
84        result = loop.run_until_complete(task())
85        assert events == expected, 'expected %s, got %s' % (expected, events)
86
87    runloop()
88
89
90######## test_all.py ########
91
92import sys
93import asyncio
94
95ASYNCIO_SUPPORTS_COROUTINE = sys.version_info[:2] >= (3, 5)
96ASYNCIO_SUPPORTS_YIELD_FROM = sys.version_info[:2] < (3, 7)
97
98def runloop(task):
99    loop = asyncio.get_event_loop()
100    result = loop.run_until_complete(task())
101    assert 3 == result, result
102
103import import_asyncio
104if ASYNCIO_SUPPORTS_YIELD_FROM:
105    runloop(import_asyncio.wait3)       # 1a)
106import from_asyncio_import
107if ASYNCIO_SUPPORTS_YIELD_FROM:
108    runloop(from_asyncio_import.wait3)  # 1b)
109
110import async_def
111if ASYNCIO_SUPPORTS_COROUTINE:
112    runloop(async_def.wait3)            # 1c)
113
114if ASYNCIO_SUPPORTS_YIELD_FROM:
115    runloop(from_asyncio_import.wait3)  # 2a)
116    runloop(import_asyncio.wait3)       # 2b)
117if ASYNCIO_SUPPORTS_COROUTINE:
118    runloop(async_def.wait3)            # 2c)
119
120import sys
121if ASYNCIO_SUPPORTS_YIELD_FROM:
122    runloop(from_asyncio_import.wait3)  # 3a)
123    runloop(import_asyncio.wait3)       # 3b)
124if ASYNCIO_SUPPORTS_COROUTINE:
125    runloop(async_def.wait3)            # 3c)
126
127try:
128    from collections.abc import Generator
129except ImportError:
130    try:
131        from collections import Generator
132    except ImportError:
133        assert sys.version_info < (3,5), "Python 3.5+ should have collections.abc.Generator"
134        Generator = object  # easy win :)
135
136assert isinstance(from_asyncio_import.wait3(), Generator)
137assert isinstance(import_asyncio.wait3(), Generator)
138assert isinstance((lambda:(yield))(), Generator)
139
140try:
141    from collections.abc import Awaitable
142except ImportError:
143    try:
144        from collections import Awaitable
145    except ImportError:
146        assert sys.version_info < (3,5), "Python 3.5+ should have collections.abc.Awaitable"
147        Awaitable = object  # easy win :)
148
149assert isinstance(async_def.wait3(), Awaitable)
150
151try:
152    from collections.abc import Coroutine
153except ImportError:
154    try:
155        from collections import Coroutine
156    except ImportError:
157        assert sys.version_info < (3,5), "Python 3.5+ should have collections.abc.Coroutine"
158        Coroutine = object  # easy win :)
159
160assert isinstance(async_def.wait3(), Coroutine)
161
162
163######## import_asyncio.pyx ########
164# cython: binding=True
165
166try:
167    from types import coroutine as types_coroutine
168except ImportError:
169    types_coroutine = lambda f:f
170
171import asyncio
172
173@asyncio.coroutine
174@types_coroutine
175def wait3():
176    counter = 0
177    for i in range(3):
178        print(counter)
179        yield from asyncio.sleep(0.01)
180        counter += 1
181    return counter
182
183
184######## from_asyncio_import.pyx ########
185# cython: binding=True
186
187try:
188    from types import coroutine as types_coroutine
189except ImportError:
190    types_coroutine = lambda f:f
191
192from asyncio import coroutine, sleep
193
194@coroutine
195@types_coroutine
196def wait3():
197    counter = 0
198    for i in range(3):
199        print(counter)
200        yield from sleep(0.01)
201        counter += 1
202    return counter
203
204
205######## async_def.pyx ########
206# cython: binding=True
207
208import asyncio
209
210async def wait3():
211    counter = 0
212    for i in range(3):
213        print(counter)
214        await asyncio.sleep(0.01)
215        counter += 1
216    return counter
217
218
219######## async_def_future.pyx ########
220# cython: binding=True
221
222import asyncio
223
224def await_future(loop):
225    events = []
226    async def worker():
227        fut = asyncio.Future()
228
229        def setval():
230            events.append('setval')
231            fut.set_result(123)
232
233        events.append('setup')
234        loop.call_later(0.2, setval)
235        events.append(await fut)
236
237    async def test():
238        await worker()
239
240    expected = ['setup', 'setval', 123]
241    return test, events, expected
242