Skip to content

Commit 3ead4e1

Browse files
committed
Add task cancel API for v0.30.0
1 parent 65ba249 commit 3ead4e1

File tree

4 files changed

+81
-2
lines changed

4 files changed

+81
-2
lines changed

meilisearch/client.py

Lines changed: 24 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:
@@ -442,6 +443,28 @@ def get_task(self, uid: int) -> dict[str, Any]:
442443
"""
443444
return get_task(self.config, uid)
444445

446+
def cancel_tasks(self, parameters: dict[str, Any] | None = None) -> TaskInfo:
447+
"""Cancel a list of enqueued or processing tasks.
448+
449+
Parameters
450+
----------
451+
parameters (optional):
452+
parameters accepted by the cancel tasks route:https://docs.meilisearch.com/reference/api/tasks.html#cancel-task.
453+
`indexUids` should be set as a List.
454+
455+
Returns
456+
-------
457+
task_info:
458+
TaskInfo instance containing information about a task to track the progress of an asynchronous process.
459+
https://docs.meilisearch.com/reference/api/tasks.html#get-one-task
460+
461+
Raises
462+
------
463+
MeiliSearchApiError
464+
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
465+
"""
466+
return cancel_tasks(self.config, parameters=parameters)
467+
445468
def wait_for_task(
446469
self,
447470
uid: int,

meilisearch/models/task.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ class Task(CamelBase):
1010
index_uid: str
1111
status: str
1212
type: str
13+
canceled_by: Optional[int]
1314
details: Optional[Dict[str, Any]]
15+
error: Optional[str]
1416
duration: str
1517
enqueued_at: str
1618
started_at: str
@@ -19,7 +21,7 @@ class Task(CamelBase):
1921

2022
class TaskInfo(CamelBase):
2123
task_uid: Optional[str]
22-
index_uid: str
24+
index_uid: Optional[str]
2325
status: str
2426
type: str
2527
details: Optional[Dict[str, Any]]

meilisearch/task.py

Lines changed: 33 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(
@@ -68,6 +69,38 @@ def get_task(config: Config, uid: int) -> dict[str, Any]:
6869
return http.get(f"{config.paths.task}/{uid}")
6970

7071

72+
def cancel_tasks(config: Config, parameters: dict[str, Any] | None = None) -> TaskInfo:
73+
"""Cancel a list of enqueued or processing tasks.
74+
75+
Parameters
76+
----------
77+
config:
78+
Config object containing permission and location of Meilisearch.
79+
parameters (optional):
80+
parameters accepted by the cancel tasks route:https://docs.meilisearch.com/reference/api/tasks.html#cancel-task.
81+
`indexUids` should be set as a List.
82+
83+
Returns
84+
-------
85+
task_info:
86+
TaskInfo instance containing information about a task to track the progress of an asynchronous process.
87+
https://docs.meilisearch.com/reference/api/tasks.html#get-one-task
88+
89+
Raises
90+
------
91+
MeiliSearchApiError
92+
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
93+
"""
94+
http = HttpRequests(config)
95+
if parameters is None:
96+
parameters = {}
97+
for param in parameters:
98+
if isinstance(parameters[param], list):
99+
parameters[param] = ",".join(parameters[param])
100+
response = http.post(f"{config.paths.task}/cancel?{parse.urlencode(parameters)}")
101+
return TaskInfo(**response)
102+
103+
71104
def wait_for_task(
72105
config: Config,
73106
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

@@ -66,3 +67,23 @@ def test_get_task_inexistent(client):
6667
"""Tests getting a task that does not exists."""
6768
with pytest.raises(Exception):
6869
client.get_task("abc")
70+
71+
72+
def test_cancel_tasks(client):
73+
"""Tests cancel a task with uid 1."""
74+
task = client.cancel_tasks({"uids": 1})
75+
assert isinstance(task, TaskInfo)
76+
assert task.task_uid is not None
77+
assert task.index_uid is None
78+
assert task.status == "enqueued"
79+
assert task.type == "taskCancelation"
80+
81+
def test_cancel_every_task(client):
82+
"""Tests cancel every task."""
83+
task = client.cancel_tasks({"statuses": ["enqueued", "processing"]})
84+
assert isinstance(task, TaskInfo)
85+
assert task.task_uid is not None
86+
assert task.index_uid is None
87+
assert task.status == "enqueued"
88+
assert task.type == "taskCancelation"
89+

0 commit comments

Comments
 (0)