|
2 | 2 | import inspect
|
3 | 3 | from collections import defaultdict
|
4 | 4 | from datetime import timedelta
|
5 |
| -from functools import update_wrapper, wraps |
| 5 | +from functools import wraps |
6 | 6 | from typing import Any, Awaitable, Callable
|
7 | 7 |
|
8 | 8 | from ape.api.networks import LOCAL_NETWORK_NAME
|
@@ -180,11 +180,21 @@ def __register_system_task(
|
180 | 180 | self, task_type: TaskType, task_handler: Callable
|
181 | 181 | ) -> AsyncTaskiqDecoratedTask:
|
182 | 182 | assert str(task_type).startswith("system:"), "Can only add system tasks"
|
| 183 | + |
| 184 | + # NOTE: We need this as `.register_task` tries to update `.__name__` of `task_handler`, |
| 185 | + # but methods do not allow setting this attribute (raises AttributeError) |
| 186 | + @wraps(task_handler) |
| 187 | + async def call_task_handler(*args, **kwargs): |
| 188 | + result = task_handler(*args, **kwargs) |
| 189 | + |
| 190 | + if inspect.isawaitable(result): |
| 191 | + return await result |
| 192 | + |
| 193 | + return result |
| 194 | + |
183 | 195 | # NOTE: This has to be registered with the broker in the worker
|
184 | 196 | return self.broker.register_task(
|
185 |
| - # NOTE: We need this as `.register_task` tries to update `.__name__` of `task_handler`, |
186 |
| - # but it is a method not a function (`update_wrapper` transforms it into one) |
187 |
| - update_wrapper(lambda *args, **kwargs: task_handler(*args, **kwargs), task_handler), |
| 197 | + call_task_handler, |
188 | 198 | # NOTE: Name makes it impossible to conflict with user's handler fn names
|
189 | 199 | task_name=str(task_type),
|
190 | 200 | task_type=str(task_type),
|
|
0 commit comments