@@ -51,28 +51,35 @@ def pytest_pycollect_makeitem(collector, name, obj):
51
51
@pytest .hookimpl (hookwrapper = True )
52
52
def pytest_fixture_setup (fixturedef , request ):
53
53
"""Adjust the event loop policy when an event loop is produced."""
54
+ if fixturedef .argname == "event_loop" and 'asyncio' in request .keywords :
55
+ outcome = yield
56
+ loop = outcome .get_result ()
57
+ policy = asyncio .get_event_loop_policy ()
58
+ try :
59
+ old_loop = policy .get_event_loop ()
60
+ except RuntimeError as exc :
61
+ if 'no current event loop' not in str (exc ):
62
+ raise
63
+ old_loop = None
64
+ policy .set_event_loop (loop )
65
+ fixturedef .addfinalizer (lambda : policy .set_event_loop (old_loop ))
66
+ return
67
+
54
68
if isasyncgenfunction (fixturedef .func ):
55
69
# This is an async generator function. Wrap it accordingly.
56
- f = fixturedef .func
70
+ generator = fixturedef .func
57
71
58
- strip_event_loop = False
59
- if 'event_loop' not in fixturedef .argnames :
60
- fixturedef .argnames += ('event_loop' , )
61
- strip_event_loop = True
62
72
strip_request = False
63
73
if 'request' not in fixturedef .argnames :
64
74
fixturedef .argnames += ('request' , )
65
75
strip_request = True
66
76
67
77
def wrapper (* args , ** kwargs ):
68
- loop = kwargs ['event_loop' ]
69
78
request = kwargs ['request' ]
70
- if strip_event_loop :
71
- del kwargs ['event_loop' ]
72
79
if strip_request :
73
80
del kwargs ['request' ]
74
81
75
- gen_obj = f (* args , ** kwargs )
82
+ gen_obj = generator (* args , ** kwargs )
76
83
77
84
async def setup ():
78
85
res = await gen_obj .__anext__ ()
@@ -89,50 +96,24 @@ async def async_finalizer():
89
96
msg = "Async generator fixture didn't stop."
90
97
msg += "Yield only once."
91
98
raise ValueError (msg )
92
-
93
- loop .run_until_complete (async_finalizer ())
99
+ asyncio .get_event_loop ().run_until_complete (async_finalizer ())
94
100
95
101
request .addfinalizer (finalizer )
96
-
97
- return loop .run_until_complete (setup ())
102
+ return asyncio .get_event_loop ().run_until_complete (setup ())
98
103
99
104
fixturedef .func = wrapper
100
-
101
105
elif inspect .iscoroutinefunction (fixturedef .func ):
102
- # Just a coroutine, not an async generator.
103
- f = fixturedef .func
104
-
105
- strip_event_loop = False
106
- if 'event_loop' not in fixturedef .argnames :
107
- fixturedef .argnames += ('event_loop' , )
108
- strip_event_loop = True
106
+ coro = fixturedef .func
109
107
110
108
def wrapper (* args , ** kwargs ):
111
- loop = kwargs ['event_loop' ]
112
- if strip_event_loop :
113
- del kwargs ['event_loop' ]
114
-
115
109
async def setup ():
116
- res = await f (* args , ** kwargs )
110
+ res = await coro (* args , ** kwargs )
117
111
return res
118
112
119
- return loop .run_until_complete (setup ())
113
+ return asyncio . get_event_loop () .run_until_complete (setup ())
120
114
121
115
fixturedef .func = wrapper
122
-
123
- outcome = yield
124
-
125
- if fixturedef .argname == "event_loop" and 'asyncio' in request .keywords :
126
- loop = outcome .get_result ()
127
- policy = asyncio .get_event_loop_policy ()
128
- try :
129
- old_loop = policy .get_event_loop ()
130
- except RuntimeError as exc :
131
- if 'no current event loop' not in str (exc ):
132
- raise
133
- old_loop = None
134
- policy .set_event_loop (loop )
135
- fixturedef .addfinalizer (lambda : policy .set_event_loop (old_loop ))
116
+ yield
136
117
137
118
138
119
@pytest .hookimpl (tryfirst = True , hookwrapper = True )
0 commit comments