Skip to content

Commit 8d9d07e

Browse files
authored
♻️ 📝 refactors and docs long running tasks (ITISFoundation#3253)
1 parent 99cf262 commit 8d9d07e

File tree

20 files changed

+198
-173
lines changed

20 files changed

+198
-173
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from aiohttp import web
22

3-
from ...long_running_tasks._task import TaskManager
3+
from ...long_running_tasks._task import TasksManager
44
from ._constants import APP_LONG_RUNNING_TASKS_MANAGER_KEY
55

66

7-
def get_task_manager(app: web.Application) -> TaskManager:
7+
def get_tasks_manager(app: web.Application) -> TasksManager:
88
return app[APP_LONG_RUNNING_TASKS_MANAGER_KEY]

packages/service-library/src/servicelib/aiohttp/long_running_tasks/_routes.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66

77
from ...json_serialization import json_dumps
88
from ...long_running_tasks._models import TaskId, TaskResult, TaskStatus
9-
from ._dependencies import get_task_manager
9+
from ...mimetype_constants import MIMETYPE_APPLICATION_JSON
10+
from ._dependencies import get_tasks_manager
1011

1112
log = logging.getLogger(__name__)
1213
routes = web.RouteTableDef()
@@ -19,27 +20,27 @@ class _PathParam(BaseModel):
1920
@routes.get("/{task_id}", name="get_task_status")
2021
async def get_task_status(request: web.Request) -> web.Response:
2122
path_params = parse_request_path_parameters_as(_PathParam, request)
22-
log.debug("getting task status: %s", f"{path_params.task_id=}")
23-
task_manager = get_task_manager(request.app)
24-
task_status: TaskStatus = task_manager.get_status(task_id=path_params.task_id)
23+
tasks_manager = get_tasks_manager(request.app)
24+
25+
task_status: TaskStatus = tasks_manager.get_task_status(task_id=path_params.task_id)
2526
return web.json_response({"data": task_status}, dumps=json_dumps)
2627

2728

2829
@routes.get("/{task_id}/result", name="get_task_result")
2930
async def get_task_result(request: web.Request) -> web.Response:
3031
path_params = parse_request_path_parameters_as(_PathParam, request)
31-
task_manager = get_task_manager(request.app)
32+
tasks_manager = get_tasks_manager(request.app)
3233

33-
task_result: TaskResult = task_manager.get_result(task_id=path_params.task_id)
34+
task_result: TaskResult = tasks_manager.get_task_result(task_id=path_params.task_id)
3435
# NOTE: we do not reraise here, in case the result returned an error,
3536
# but we still want to remove the task
36-
await task_manager.remove(path_params.task_id, reraise_errors=False)
37+
await tasks_manager.remove_task(path_params.task_id, reraise_errors=False)
3738
return web.json_response({"data": task_result}, dumps=json_dumps)
3839

3940

4041
@routes.delete("/{task_id}", name="cancel_and_delete_task")
4142
async def cancel_and_delete_task(request: web.Request) -> web.Response:
4243
path_params = parse_request_path_parameters_as(_PathParam, request)
43-
task_manager = get_task_manager(request.app)
44-
await task_manager.remove(path_params.task_id)
45-
raise web.HTTPNoContent(content_type="application/json")
44+
tasks_manager = get_tasks_manager(request.app)
45+
await tasks_manager.remove_task(path_params.task_id)
46+
raise web.HTTPNoContent(content_type=MIMETYPE_APPLICATION_JSON)

packages/service-library/src/servicelib/aiohttp/long_running_tasks/_server.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from aiohttp import web
55
from pydantic import PositiveFloat
66

7-
from ...long_running_tasks._task import TaskManager
7+
from ...long_running_tasks._task import TasksManager
88
from ._constants import APP_LONG_RUNNING_TASKS_MANAGER_KEY, MINUTE
99
from ._error_handlers import base_long_running_error_handler
1010
from ._routes import routes
@@ -15,7 +15,7 @@
1515
def setup(
1616
app: web.Application,
1717
*,
18-
router_prefix: str = "",
18+
router_prefix: str,
1919
stale_task_check_interval_s: PositiveFloat = 1 * MINUTE,
2020
stale_task_detect_timeout_s: PositiveFloat = 5 * MINUTE,
2121
) -> None:
@@ -43,7 +43,7 @@ async def on_startup(app: web.Application) -> AsyncGenerator[None, None]:
4343
# add components to state
4444
app[
4545
APP_LONG_RUNNING_TASKS_MANAGER_KEY
46-
] = long_running_task_manager = TaskManager(
46+
] = long_running_task_manager = TasksManager(
4747
stale_task_check_interval_s=stale_task_check_interval_s,
4848
stale_task_detect_timeout_s=stale_task_detect_timeout_s,
4949
)

packages/service-library/src/servicelib/aiohttp/long_running_tasks/server.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,30 @@
55
The server only has to return a `TaskId` in the handler creating the long
66
running task.
77
"""
8-
98
from ...long_running_tasks._task import (
109
TaskAlreadyRunningError,
1110
TaskCancelledError,
1211
TaskId,
13-
TaskManager,
1412
TaskProgress,
1513
TaskResult,
14+
TasksManager,
1615
TaskStatus,
1716
start_task,
1817
)
19-
from ._dependencies import get_task_manager
18+
from ._dependencies import get_tasks_manager
2019
from ._server import setup
2120

2221
__all__: tuple[str, ...] = (
23-
"get_task_manager",
22+
"get_tasks_manager",
2423
"setup",
2524
"start_task",
2625
"TaskAlreadyRunningError",
2726
"TaskCancelledError",
2827
"TaskId",
29-
"TaskManager",
28+
"TasksManager",
3029
"TaskProgress",
3130
"TaskResult",
3231
"TaskStatus",
3332
)
33+
34+
# nopycln: file
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from fastapi import Request
22

3-
from ...long_running_tasks._task import TaskManager
3+
from ...long_running_tasks._task import TasksManager
44

55

6-
def get_task_manager(request: Request) -> TaskManager:
6+
def get_tasks_manager(request: Request) -> TasksManager:
77
return request.app.state.long_running_task_manager

packages/service-library/src/servicelib/fastapi/long_running_tasks/_routes.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from fastapi import APIRouter, Depends, Request, status
22

33
from ...long_running_tasks._models import TaskId, TaskResult, TaskStatus
4-
from ...long_running_tasks._task import TaskManager
4+
from ...long_running_tasks._task import TasksManager
55
from ..requests_decorators import cancel_on_disconnect
6-
from ._dependencies import get_task_manager
6+
from ._dependencies import get_tasks_manager
77

88
router = APIRouter(prefix="/task")
99

@@ -18,10 +18,10 @@
1818
async def get_task_status(
1919
request: Request,
2020
task_id: TaskId,
21-
task_manager: TaskManager = Depends(get_task_manager),
21+
task_manager: TasksManager = Depends(get_tasks_manager),
2222
) -> TaskStatus:
2323
assert request # nosec
24-
return task_manager.get_status(task_id=task_id)
24+
return task_manager.get_task_status(task_id=task_id)
2525

2626

2727
@router.get(
@@ -37,12 +37,12 @@ async def get_task_status(
3737
async def get_task_result(
3838
request: Request,
3939
task_id: TaskId,
40-
task_manager: TaskManager = Depends(get_task_manager),
40+
task_manager: TasksManager = Depends(get_tasks_manager),
4141
) -> TaskResult:
4242
assert request # nosec
4343

44-
task_result = task_manager.get_result(task_id=task_id)
45-
await task_manager.remove(task_id, reraise_errors=False)
44+
task_result = task_manager.get_task_result(task_id=task_id)
45+
await task_manager.remove_task(task_id, reraise_errors=False)
4646

4747
return task_result
4848

@@ -60,7 +60,7 @@ async def get_task_result(
6060
async def cancel_and_delete_task(
6161
request: Request,
6262
task_id: TaskId,
63-
task_manager: TaskManager = Depends(get_task_manager),
63+
task_manager: TasksManager = Depends(get_tasks_manager),
6464
) -> None:
6565
assert request # nosec
66-
await task_manager.remove(task_id)
66+
await task_manager.remove_task(task_id)

packages/service-library/src/servicelib/fastapi/long_running_tasks/_server.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from pydantic import PositiveFloat
55

66
from ...long_running_tasks._errors import BaseLongRunningError
7-
from ...long_running_tasks._task import TaskManager
7+
from ...long_running_tasks._task import TasksManager
88
from ._error_handlers import base_long_running_error_handler
99
from ._routes import router
1010

@@ -35,7 +35,7 @@ async def on_startup() -> None:
3535
app.include_router(main_router)
3636

3737
# add components to state
38-
app.state.long_running_task_manager = TaskManager(
38+
app.state.long_running_task_manager = TasksManager(
3939
stale_task_check_interval_s=stale_task_check_interval_s,
4040
stale_task_detect_timeout_s=stale_task_detect_timeout_s,
4141
)
@@ -45,7 +45,7 @@ async def on_startup() -> None:
4545

4646
async def on_shutdown() -> None:
4747
if app.state.long_running_task_manager:
48-
task_manager: TaskManager = app.state.long_running_task_manager
48+
task_manager: TasksManager = app.state.long_running_task_manager
4949
await task_manager.close()
5050

5151
app.add_event_handler("startup", on_startup)

packages/service-library/src/servicelib/fastapi/long_running_tasks/server.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,26 @@
1010
TaskAlreadyRunningError,
1111
TaskCancelledError,
1212
TaskId,
13-
TaskManager,
1413
TaskProgress,
1514
TaskResult,
15+
TasksManager,
1616
TaskStatus,
1717
start_task,
1818
)
19-
from ._dependencies import get_task_manager
19+
from ._dependencies import get_tasks_manager
2020
from ._server import setup
2121

22-
2322
__all__: tuple[str, ...] = (
24-
"get_task_manager",
23+
"get_tasks_manager",
2524
"setup",
2625
"start_task",
2726
"TaskAlreadyRunningError",
2827
"TaskCancelledError",
2928
"TaskId",
30-
"TaskManager",
29+
"TasksManager",
3130
"TaskProgress",
3231
"TaskResult",
3332
"TaskStatus",
3433
)
34+
35+
# nopycln: file

packages/service-library/src/servicelib/long_running_tasks/_models.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ class TaskProgress(BaseModel):
2626
defined as a float bound between 0.0 and 1.0
2727
"""
2828

29-
message: ProgressMessage
30-
percent: ProgressPercent
29+
message: ProgressMessage = Field(default="")
30+
percent: ProgressPercent = Field(default=0.0)
3131

3232
def publish(
3333
self,
@@ -58,7 +58,7 @@ class TrackedTask(BaseModel):
5858

5959
started: datetime = Field(default_factory=datetime.utcnow)
6060
last_status_check: Optional[datetime] = Field(
61-
None,
61+
default=None,
6262
description=(
6363
"used to detect when if the task is not actively "
6464
"polled by the client who created it"

0 commit comments

Comments
 (0)