Skip to content

Commit 030c0b5

Browse files
authored
Merge pull request #14 from taskiq-python/feature/pydantic-result
Taskiq result is now a generic model.
2 parents 052ddb4 + 73b9905 commit 030c0b5

File tree

2 files changed

+44
-32
lines changed

2 files changed

+44
-32
lines changed

taskiq/abc/broker.py

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
Any,
77
AsyncGenerator,
88
Callable,
9+
Coroutine,
910
Dict,
1011
Generic,
1112
Optional,
@@ -90,11 +91,27 @@ def with_broker(
9091
self.broker = broker
9192
return self
9293

94+
@overload
95+
async def kiq( # noqa: D102
96+
self: "AsyncKicker[_FuncParams, Coroutine[Any, Any, _T]]",
97+
*args: _FuncParams.args,
98+
**kwargs: _FuncParams.kwargs,
99+
) -> AsyncTaskiqTask[_T]:
100+
...
101+
102+
@overload
103+
async def kiq( # noqa: D102
104+
self: "AsyncKicker[_FuncParams, _ReturnType]",
105+
*args: _FuncParams.args,
106+
**kwargs: _FuncParams.kwargs,
107+
) -> AsyncTaskiqTask[_ReturnType]:
108+
...
109+
93110
async def kiq(
94111
self,
95112
*args: _FuncParams.args,
96113
**kwargs: _FuncParams.kwargs,
97-
) -> AsyncTaskiqTask[_ReturnType]:
114+
) -> Any:
98115
"""
99116
This method sends function call over the network.
100117
@@ -111,7 +128,7 @@ async def kiq(
111128
)
112129
message = self._prepare_message(*args, **kwargs)
113130
await self.broker.kick(message)
114-
return self.broker.result_backend.generate_task(message.task_id) # type: ignore
131+
return self.broker.result_backend.generate_task(message.task_id)
115132

116133
@classmethod
117134
def _prepare_arg(cls, arg: Any) -> Any:
@@ -197,11 +214,27 @@ def __call__( # noqa: D102
197214
) -> _ReturnType:
198215
return self.original_func(*args, **kwargs)
199216

217+
@overload
218+
async def kiq( # noqa: D102
219+
self: "AsyncTaskiqDecoratedTask[_FuncParams, Coroutine[Any, Any, _T]]",
220+
*args: _FuncParams.args,
221+
**kwargs: _FuncParams.kwargs,
222+
) -> AsyncTaskiqTask[_T]:
223+
...
224+
225+
@overload
226+
async def kiq( # noqa: D102
227+
self: "AsyncTaskiqDecoratedTask[_FuncParams, _ReturnType]",
228+
*args: _FuncParams.args,
229+
**kwargs: _FuncParams.kwargs,
230+
) -> AsyncTaskiqTask[_ReturnType]:
231+
...
232+
200233
async def kiq(
201234
self,
202235
*args: _FuncParams.args,
203236
**kwargs: _FuncParams.kwargs,
204-
) -> AsyncTaskiqTask[_ReturnType]:
237+
) -> Any:
205238
"""
206239
This method sends function call over the network.
207240

taskiq/abc/result_backend.py

Lines changed: 8 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,23 @@
11
import asyncio
22
from abc import ABC, abstractmethod
33
from time import time
4-
from typing import Any, Coroutine, Generic, Optional, TypeVar, overload
4+
from typing import Generic, Optional, TypeVar
5+
6+
from pydantic.generics import GenericModel
57

68
from taskiq.exceptions import TaskiqResultTimeoutError
79

810
_T = TypeVar("_T") # noqa: WPS111
911
_ReturnType = TypeVar("_ReturnType")
1012

1113

12-
class TaskiqResult(Generic[_ReturnType]):
14+
class TaskiqResult(GenericModel, Generic[_ReturnType]):
1315
"""Result of a remote task invocation."""
1416

15-
def __init__(
16-
self,
17-
is_err: bool,
18-
log: Optional[str],
19-
return_value: Any,
20-
execution_time: float,
21-
) -> None:
22-
self.is_err = is_err
23-
self.log = log
24-
self._return_value = return_value
25-
self.execution_time = execution_time
26-
27-
@overload
28-
def value(self: "TaskiqResult[Coroutine[Any, Any, _T]]") -> _T:
29-
...
30-
31-
@overload
32-
def value(self) -> _ReturnType:
33-
...
34-
35-
def value(self) -> Any:
36-
"""
37-
Returns function's return value.
38-
39-
:return: function's value.
40-
"""
41-
return self._return_value
17+
is_err: bool
18+
log: Optional[str]
19+
return_value: _ReturnType
20+
execution_time: float
4221

4322

4423
class AsyncResultBackend(ABC, Generic[_ReturnType]):

0 commit comments

Comments
 (0)