Skip to content

Commit f13edf8

Browse files
committed
Add task cancel API for v0.30.0
1 parent dee4333 commit f13edf8

File tree

4 files changed

+78
-3
lines changed

4 files changed

+78
-3
lines changed

meilisearch/client.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
from meilisearch.config import Config
1414
from meilisearch.errors import MeiliSearchError
1515
from meilisearch.index import Index
16-
from meilisearch.task import get_task, get_tasks, wait_for_task
16+
from meilisearch.models.task import TaskInfo
17+
from meilisearch.task import cancel_tasks, get_task, get_tasks, wait_for_task
1718

1819

1920
class Client:
@@ -441,6 +442,27 @@ def get_task(self, uid: int) -> dict[str, Any]:
441442
"""
442443
return get_task(self.config, uid)
443444

445+
def cancel_tasks(self, parameters: dict[str, Any] | None = None) -> TaskInfo:
446+
"""Cancel a list of enqueued or processing tasks.
447+
448+
Parameters
449+
----------
450+
parameters (optional):
451+
parameters accepted by the cancel tasks route:https://docs.meilisearch.com/reference/api/tasks.html#cancel-tasks.
452+
453+
Returns
454+
-------
455+
task_info:
456+
TaskInfo instance containing information about a task to track the progress of an asynchronous process.
457+
https://docs.meilisearch.com/reference/api/tasks.html#get-one-task
458+
459+
Raises
460+
------
461+
MeiliSearchApiError
462+
An error containing details about why Meilisearch can't process your request. Meilisearch error codes are described here: https://docs.meilisearch.com/errors/#meilisearch-errors
463+
"""
464+
return cancel_tasks(self.config, parameters=parameters)
465+
444466
def wait_for_task(
445467
self,
446468
uid: int,

meilisearch/models/task.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from __future__ import annotations
22

3-
from typing import Any, Dict, Optional
3+
from typing import Any, Dict, Optional, Union
44

55
from camel_converter.pydantic_base import CamelBase
66

@@ -10,7 +10,7 @@ class Task(CamelBase):
1010
index_uid: str
1111
status: str
1212
type: str
13-
details: Optional[Dict[str, Any]]
13+
canceled_by: Union[int, None]
1414
duration: str
1515
enqueued_at: str
1616
started_at: str

meilisearch/task.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from meilisearch._httprequests import HttpRequests
99
from meilisearch.config import Config
1010
from meilisearch.errors import MeiliSearchTimeoutError
11+
from meilisearch.models.task import TaskInfo
1112

1213

1314
def get_tasks(
@@ -67,6 +68,37 @@ def get_task(config: Config, uid: int) -> dict[str, Any]:
6768
return http.get(f"{config.paths.task}/{uid}")
6869

6970

71+
def cancel_tasks(config: Config, parameters: dict[str, Any] | None = None) -> TaskInfo:
72+
"""Cancel a list of enqueued or processing tasks.
73+
74+
Parameters
75+
----------
76+
config:
77+
Config object containing permission and location of Meilisearch.
78+
parameters (optional):
79+
parameters accepted by the cancel tasks route:https://docs.meilisearch.com/reference/api/tasks.html#cancel-task.
80+
81+
Returns
82+
-------
83+
task_info:
84+
TaskInfo instance containing information about a task to track the progress of an asynchronous process.
85+
https://docs.meilisearch.com/reference/api/tasks.html#get-one-task
86+
87+
Raises
88+
------
89+
MeiliSearchApiError
90+
An error containing details about why Meilisearch can't process your request. Meilisearch error codes are described here: https://docs.meilisearch.com/errors/#meilisearch-errors
91+
"""
92+
http = HttpRequests(config)
93+
if parameters is None:
94+
parameters = {}
95+
for param in parameters:
96+
if isinstance(parameters[param], list):
97+
parameters[param] = ",".join(parameters[param])
98+
response = http.post(f"{config.paths.task}/cancel?{parse.urlencode(parameters)}")
99+
return TaskInfo(**response)
100+
101+
70102
def wait_for_task(
71103
config: Config,
72104
uid: int,

tests/client/test_client_task_meilisearch.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import pytest
44

5+
from meilisearch.models.task import TaskInfo
56
from tests import common
67

78

@@ -91,3 +92,23 @@ def test_get_task_inexistent(client):
9192
"""Tests getting a task that does not exists."""
9293
with pytest.raises(Exception):
9394
client.get_task("abc")
95+
96+
97+
def test_cancel_tasks(client):
98+
"""Tests cancel a task with uid 1."""
99+
task = client.cancel_tasks({"uids": ["1"]})
100+
assert isinstance(task, TaskInfo)
101+
assert task.task_uid is not None
102+
assert task.index_uid is None
103+
assert task.status == "enqueued" or "processing" or "succeeded"
104+
assert task.type == "taskCancelation"
105+
106+
def test_cancel_every_task(client):
107+
"""Tests cancel every task."""
108+
task = client.cancel_tasks({"statuses": ["enqueued", "processing"]})
109+
assert isinstance(task, TaskInfo)
110+
assert task.task_uid is not None
111+
assert task.index_uid is None
112+
assert task.status == "enqueued" or "processing" or "succeeded"
113+
assert task.type == "taskCancelation"
114+

0 commit comments

Comments
 (0)