Skip to content

Commit 80a2280

Browse files
authored
fix: make dependency cleanup in reverse order (#4246)
* test: Add test to check dependency cleanup order * fix: Reverse cleanup order
1 parent c33085a commit 80a2280

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

litestar/_kwargs/cleanup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ async def _cleanup(self) -> None:
9595
return
9696

9797
async with create_task_group() as task_group:
98-
for generator in self._generators:
98+
for generator in reversed(self._generators):
9999
task_group.start_soon(self._wrap_next(generator))
100100

101101
async def __aenter__(self) -> None:

tests/unit/test_kwargs/test_cleanup_group.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,43 @@ async def test_cleanup(generator: Generator[str, None, None], cleanup_mock: Magi
6363
assert group._closed
6464

6565

66+
async def test_cleanup_order(
67+
cleanup_mock: MagicMock,
68+
async_cleanup_mock: MagicMock,
69+
) -> None:
70+
def gen_fn_1() -> Generator[None, None, None]:
71+
async_cleanup_mock.assert_not_called()
72+
73+
try:
74+
yield
75+
finally:
76+
cleanup_mock()
77+
78+
async_cleanup_mock.assert_called_once()
79+
80+
async def gen_fn_2() -> AsyncGenerator[None, None]:
81+
cleanup_mock.assert_not_called()
82+
83+
try:
84+
yield
85+
finally:
86+
async_cleanup_mock()
87+
88+
# the first generator must be still open
89+
cleanup_mock.assert_not_called()
90+
91+
gen_1 = gen_fn_1()
92+
gen_2 = gen_fn_2()
93+
next(gen_1)
94+
await async_next(gen_2)
95+
group = DependencyCleanupGroup([gen_1, gen_2])
96+
97+
await group.close()
98+
99+
cleanup_mock.assert_called_once()
100+
async_cleanup_mock.assert_called_once()
101+
102+
66103
async def test_cleanup_throw_multiple_exceptions(
67104
generator: Generator[str, None, None],
68105
async_generator: AsyncGenerator[str, None],

0 commit comments

Comments
 (0)