Skip to content

Commit 463ea19

Browse files
committed
Add delete task api for v0.30.0
1 parent 753a826 commit 463ea19

File tree

4 files changed

+87
-1
lines changed

4 files changed

+87
-1
lines changed

meilisearch/client.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from meilisearch.errors import MeiliSearchError
1515
from meilisearch.index import Index
1616
from meilisearch.models.task import TaskInfo
17-
from meilisearch.task import cancel_tasks, get_task, get_tasks, wait_for_task
17+
from meilisearch.task import cancel_tasks, delete_tasks, get_task, get_tasks, wait_for_task
1818

1919

2020
class Client:
@@ -463,6 +463,25 @@ def cancel_tasks(self, parameters: dict[str, Any]) -> TaskInfo:
463463
"""
464464
return cancel_tasks(self.config, parameters=parameters)
465465

466+
def delete_tasks(self, parameters: dict[str, Any]) -> TaskInfo:
467+
"""Delete a list of finished tasks.
468+
469+
Parameters
470+
----------
471+
parameters (optional):
472+
parameters accepted by the delete tasks route:https://docs.meilisearch.com/reference/api/tasks.html#delete-task.
473+
Returns
474+
-------
475+
task_info:
476+
TaskInfo instance containing information about a task to track the progress of an asynchronous process.
477+
https://docs.meilisearch.com/reference/api/tasks.html#get-one-task
478+
Raises
479+
------
480+
MeiliSearchApiError
481+
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
482+
"""
483+
return delete_tasks(self.config, parameters=parameters)
484+
466485
def wait_for_task(
467486
self,
468487
uid: int,

meilisearch/task.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,34 @@ def cancel_tasks(config: Config, parameters: dict[str, Any]) -> TaskInfo:
9999
return TaskInfo(**response)
100100

101101

102+
def delete_tasks(config: Config, parameters: dict[str, Any] | None = None) -> TaskInfo:
103+
"""Delete a list of enqueued or processing tasks.
104+
Parameters
105+
----------
106+
config:
107+
Config object containing permission and location of Meilisearch.
108+
parameters (optional):
109+
parameters accepted by the delete tasks route:https://docs.meilisearch.com/reference/api/tasks.html#delete-task.
110+
Returns
111+
-------
112+
task_info:
113+
TaskInfo instance containing information about a task to track the progress of an asynchronous process.
114+
https://docs.meilisearch.com/reference/api/tasks.html#get-one-task
115+
Raises
116+
------
117+
MeiliSearchApiError
118+
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
119+
"""
120+
http = HttpRequests(config)
121+
if parameters is None:
122+
parameters = {}
123+
for param in parameters:
124+
if isinstance(parameters[param], list):
125+
parameters[param] = ",".join(parameters[param])
126+
response = http.delete(f"{config.paths.task}?{parse.urlencode(parameters)}")
127+
return TaskInfo(**response)
128+
129+
102130
def wait_for_task(
103131
config: Config,
104132
uid: int,

tests/client/test_client_task_meilisearch.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,3 +131,33 @@ def test_cancel_every_task(client):
131131
assert task.index_uid is None
132132
assert task.type == "taskCancelation"
133133
assert "statuses=enqueued%2Cprocessing" in tasks["results"][0]["details"]["originalFilter"]
134+
135+
136+
def test_delete_tasks_by_uid(client, empty_index, small_movies):
137+
"""Tests getting a task of an inexistent operation."""
138+
index = empty_index()
139+
task = index.add_documents(small_movies)
140+
task_deleted = client.delete_tasks({"uids": task.task_uid})
141+
client.wait_for_task(task_deleted.task_uid)
142+
with pytest.raises(Exception):
143+
client.get_task(task.task_uid)
144+
145+
assert isinstance(task_deleted, TaskInfo)
146+
assert task_deleted.task_uid is not None
147+
assert task_deleted.index_uid is None
148+
assert task_deleted.status == "enqueued" or "processing" or "succeeded"
149+
assert task_deleted.type == "taskDeletion"
150+
151+
152+
def test_delete_all_tasks(client):
153+
tasks_before = client.get_tasks()
154+
task = client.delete_tasks({"statuses": ["succeeded", "failed", "canceled"]})
155+
tasks_after = client.get_tasks()
156+
157+
assert isinstance(task, TaskInfo)
158+
assert task.task_uid is not None
159+
assert task.index_uid is None
160+
assert task.status == "enqueued" or "processing" or "succeeded"
161+
assert task.type == "taskDeletion"
162+
assert len(tasks_after["results"]) == 1
163+
assert len(tasks_before["results"]) == len(tasks_after["results"])

tests/conftest.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,15 @@ def clear_indexes(client):
2929
client.wait_for_task(task["taskUid"])
3030

3131

32+
@fixture(autouse=True)
33+
def clear_all_tasks(client):
34+
"""
35+
Auto-clears the tasks after each test function run.
36+
Makes all the test functions independent.
37+
"""
38+
client.delete_tasks({"statuses": ["succeeded", "failed", "canceled"]})
39+
40+
3241
@fixture(scope="function")
3342
def indexes_sample(client):
3443
indexes = []

0 commit comments

Comments
 (0)