Skip to content

Commit 565b6b7

Browse files
authored
feat: ✨ Several yield are allowed in middleware
1 parent f97fc78 commit 565b6b7

2 files changed

Lines changed: 27 additions & 7 deletions

File tree

cq/_core/middleware.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def __stack(self) -> Iterator[Middleware[P, T]]:
1919
return iter(self.__middlewares)
2020

2121
def add(self, *middlewares: Middleware[P, T]) -> Self:
22-
self.__middlewares.extend(middlewares)
22+
self.__middlewares.extend(reversed(middlewares))
2323
return self
2424

2525
async def invoke(
@@ -44,12 +44,13 @@ async def wrapper(*args: P.args, **kwargs: P.kwargs) -> T:
4444
try:
4545
await anext(generator)
4646

47-
try:
48-
value = await handler(*args, **kwargs)
49-
except BaseException as exc:
50-
await generator.athrow(exc)
51-
else:
52-
await generator.asend(value)
47+
while True:
48+
try:
49+
value = await handler(*args, **kwargs)
50+
except BaseException as exc:
51+
await generator.athrow(exc)
52+
else:
53+
await generator.asend(value)
5354

5455
except StopAsyncIteration:
5556
...

tests/core/test_middleware.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,20 @@ async def handler() -> str:
6565
assert isinstance(record.result, ValueError)
6666
assert record.status == _Status.FAILED
6767

68+
async def test_invoke_with_multiple_yield_return_any(
69+
self,
70+
group: MiddlewareGroup[..., Any],
71+
history: _HistoryMiddleware,
72+
) -> None:
73+
async def handler() -> str:
74+
return "I'm a handler..."
75+
76+
group.add(_exec_2_times_middleware, history)
77+
await group.invoke(handler)
78+
79+
records = history.records
80+
assert len(records) == 2
81+
6882

6983
class _Status(IntEnum):
7084
SUCCESS = 1
@@ -95,3 +109,8 @@ async def __call__(self, /, *args: Any, **kwargs: Any) -> MiddlewareResult[Any]:
95109
record = _Record(args, kwargs, result, _Status.SUCCESS)
96110

97111
self.__records.append(record)
112+
113+
114+
async def _exec_2_times_middleware(*args: Any, **kwargs: Any) -> MiddlewareResult[Any]:
115+
yield
116+
yield

0 commit comments

Comments
 (0)