Skip to content

Commit

Permalink
Merge pull request #332 from sanders41/delete-tasks
Browse files Browse the repository at this point in the history
Add delete tasks
  • Loading branch information
sanders41 committed Nov 22, 2022
2 parents f97b757 + afb0199 commit 0db1240
Show file tree
Hide file tree
Showing 2 changed files with 123 additions and 3 deletions.
74 changes: 73 additions & 1 deletion meilisearch_python_async/task.py
Expand Up @@ -56,7 +56,6 @@ async def cancel_tasks(
>>> async with Client("http://localhost.com", "masterKey") as client:
>>> await cancel_tasks(client.http_client, uids=[1, 2])
"""
# parameters = {"uids": uids, "indexUids": index_uids}
parameters = {}
if uids:
parameters["uids"] = ",".join([str(x) for x in uids])
Expand Down Expand Up @@ -85,6 +84,79 @@ async def cancel_tasks(
return TaskInfo(**response.json())


async def delete_tasks(
http_client: AsyncClient,
*,
uids: list[str] | None = None,
index_uids: list[str] | None = None,
statuses: list[str] | None = None,
types: list[str] | None = None,
before_enqueued_at: datetime | None = None,
after_enqueueda_at: datetime | None = None,
before_started_at: datetime | None = None,
after_finished_at: datetime | None = None,
) -> TaskInfo:
"""Delete a list of tasks.
Defaults to deleting all tasks.
Args:
uids: A list of task UIDs to cancel.
index_uids: A list of index UIDs for which to cancel tasks.
statuses: A list of statuses to cancel.
types: A list of types to cancel.
before_enqueued_at: Cancel tasks that were enqueued before the specified date time.
after_enqueueda_at: Cancel tasks that were enqueued after the specified date time.
before_started_at: Cancel tasks that were started before the specified date time.
after_finished_at: Cancel tasks that were finished after the specified date time.
Returns:
The details of the task
Raises:
MeilisearchCommunicationError: If there was an error communicating with the server.
MeilisearchApiError: If the MeiliSearch API returned an error.
MeiliSearchTimeoutError: If the connection times out.
Examples:
>>> from meilisearch_python_async import Client
>>> from meilisearch_python_async.task import delete_tasks
>>>
>>> async with Client("http://localhost.com", "masterKey") as client:
>>> await delete_tasks(client.http_client, uids=[1, 2])
"""
parameters = {}
if uids:
parameters["uids"] = ",".join([str(x) for x in uids])
if index_uids:
parameters["indexUids"] = ",".join([str(x) for x in index_uids])
if statuses:
parameters["statuses"] = ",".join(statuses)
if types:
parameters["types"] = ",".join(types)
if before_enqueued_at:
parameters["beforeEnqueuedAt"] = str(before_enqueued_at)
if after_enqueueda_at:
parameters["afterEnqueuedAt"] = str(after_enqueueda_at)
if before_started_at:
parameters["beforeStartedAt"] = str(before_started_at)
if after_finished_at:
parameters["afterFinishedAt"] = str(after_finished_at)

if not parameters:
# delete all tasks if no parmaeters provided
parameters["statuses"] = "canceled,enqueued,failed,processing,succeeded"

url = f"tasks?{urlencode(parameters)}"
response = await http_client.delete(url)

return TaskInfo(**response.json())


async def get_tasks(
http_client: AsyncClient,
*,
Expand Down
52 changes: 50 additions & 2 deletions tests/test_task.py
@@ -1,7 +1,13 @@
import pytest

from meilisearch_python_async.errors import MeiliSearchTimeoutError
from meilisearch_python_async.task import cancel_tasks, get_task, get_tasks, wait_for_task
from meilisearch_python_async.task import (
cancel_tasks,
delete_tasks,
get_task,
get_tasks,
wait_for_task,
)


@pytest.fixture
Expand All @@ -15,7 +21,7 @@ async def create_tasks(empty_index, small_movies):


@pytest.mark.usefixtures("create_tasks")
async def test_cancel_every_task(test_client):
async def test_cancel_statuses(test_client):
task = await cancel_tasks(test_client.http_client, statuses=["enqueued", "processing"])
await wait_for_task(test_client.http_client, task.task_uid)
completed_task = await get_task(test_client.http_client, task.task_uid)
Expand Down Expand Up @@ -54,6 +60,48 @@ async def test_cancel_task_no_params(test_client):
assert "statuses=enqueued%2Cprocessing" in tasks[0].details["originalFilter"]


@pytest.mark.usefixtures("create_tasks")
async def test_delete_statuses(test_client):
task = await delete_tasks(test_client.http_client, statuses=["enqueued", "processing"])
await wait_for_task(test_client.http_client, task.task_uid)
deleted_tasks = await get_task(test_client.http_client, task.task_uid)
tasks = await get_tasks(test_client.http_client, types="taskDeletion")

assert deleted_tasks.status == "succeeded"
assert deleted_tasks.task_type == "taskDeletion"
assert tasks[0].details is not None
assert "statuses=enqueued%2Cprocessing" in tasks[0].details["originalFilter"]


@pytest.mark.usefixtures("create_tasks")
async def test_delete_tasks(test_client):
task = await delete_tasks(test_client.http_client, uids=["1", "2"])
await wait_for_task(test_client.http_client, task.task_uid)
completed_task = await get_task(test_client.http_client, task.task_uid)
tasks = await get_tasks(test_client.http_client, types="taskDeletion")

assert completed_task.status == "succeeded"
assert completed_task.task_type == "taskDeletion"
assert tasks[0].details is not None
assert "uids=1%2C2" in tasks[0].details["originalFilter"]


@pytest.mark.usefixtures("create_tasks")
async def test_delete_no_params(test_client):
task = await delete_tasks(test_client.http_client)
await wait_for_task(test_client.http_client, task.task_uid)
deleted_tasks = await get_task(test_client.http_client, task.task_uid)
tasks = await get_tasks(test_client.http_client, types="taskDeletion")

assert deleted_tasks.status == "succeeded"
assert deleted_tasks.task_type == "taskDeletion"
assert tasks[0].details is not None
assert (
"statuses=canceled%2Cenqueued%2Cfailed%2Cprocessing%2Csucceeded"
in tasks[0].details["originalFilter"]
)


async def test_get_tasks(empty_index, small_movies):
index = await empty_index()
tasks = await get_tasks(index.http_client)
Expand Down

0 comments on commit 0db1240

Please sign in to comment.