Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 29 additions & 4 deletions meilisearch/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,11 @@
from meilisearch.config import Config
from meilisearch.errors import MeiliSearchError
from meilisearch.index import Index
from meilisearch.task import get_task, get_tasks, wait_for_task
from meilisearch.models.task import TaskInfo
from meilisearch.task import cancel_tasks as cancel_tasks_func
from meilisearch.task import get_task as get_task_func
from meilisearch.task import get_tasks as get_tasks_func
from meilisearch.task import wait_for_task as wait_for_task_func


class Client:
Expand Down Expand Up @@ -419,7 +423,7 @@ def get_tasks(
MeiliSearchApiError
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
"""
return get_tasks(self.config, parameters=parameters)
return get_tasks_func(self.config, parameters=parameters)

def get_task(self, uid: int) -> dict[str, Any]:
"""Get one task.
Expand All @@ -439,7 +443,28 @@ def get_task(self, uid: int) -> dict[str, Any]:
MeiliSearchApiError
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
"""
return get_task(self.config, uid)
return get_task_func(self.config, uid)

def cancel_tasks(self, parameters: dict[str, Any]) -> TaskInfo:
"""Cancel a list of enqueued or processing tasks.

Parameters
----------
parameters (optional):
parameters accepted by the cancel tasks route:https://docs.meilisearch.com/reference/api/tasks.html#cancel-tasks.

Returns
-------
task_info:
TaskInfo instance containing information about a task to track the progress of an asynchronous process.
https://docs.meilisearch.com/reference/api/tasks.html#get-one-task

Raises
------
MeiliSearchApiError
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
"""
return cancel_tasks_func(self.config, parameters=parameters)

def wait_for_task(
self,
Expand Down Expand Up @@ -468,7 +493,7 @@ def wait_for_task(
MeiliSearchTimeoutError
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
"""
return wait_for_task(self.config, uid, timeout_in_ms, interval_in_ms)
return wait_for_task_func(self.config, uid, timeout_in_ms, interval_in_ms)

def generate_tenant_token(
self,
Expand Down
10 changes: 6 additions & 4 deletions meilisearch/index.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
from meilisearch.models.document import Document, DocumentsResults
from meilisearch.models.index import IndexStats
from meilisearch.models.task import Task, TaskInfo, TaskResults
from meilisearch.task import get_task, get_tasks, wait_for_task
from meilisearch.task import get_task as get_task_func
from meilisearch.task import get_tasks as get_tasks_func
from meilisearch.task import wait_for_task as wait_for_task_func


# pylint: disable=too-many-public-methods
Expand Down Expand Up @@ -163,7 +165,7 @@ def get_tasks(self, parameters: dict[str, Any] | None = None) -> TaskResults:
else:
parameters = {"indexUids": [self.uid]}

tasks = get_tasks(self.config, parameters=parameters)
tasks = get_tasks_func(self.config, parameters=parameters)
return TaskResults(tasks)

def get_task(self, uid: int) -> Task:
Expand All @@ -184,7 +186,7 @@ def get_task(self, uid: int) -> Task:
MeiliSearchApiError
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
"""
task = get_task(self.config, uid)
task = get_task_func(self.config, uid)
return Task(**task)

def wait_for_task(
Expand Down Expand Up @@ -214,7 +216,7 @@ def wait_for_task(
MeiliSearchTimeoutError
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
"""
task = wait_for_task(self.config, uid, timeout_in_ms, interval_in_ms)
task = wait_for_task_func(self.config, uid, timeout_in_ms, interval_in_ms)
return Task(**task)

def get_stats(self) -> IndexStats:
Expand Down
5 changes: 3 additions & 2 deletions meilisearch/models/task.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from __future__ import annotations

from typing import Any, Dict, Optional, Union
from typing import Any, Dict, Union

from camel_converter.pydantic_base import CamelBase

Expand All @@ -11,7 +11,8 @@ class Task(CamelBase):
status: str
type: str
details: Dict[str, Any]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In another PR, this should be changed to Union[Dict[str, Any], None]

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

error: Optional[Dict[str, Any]]
error: Union[Dict[str, Any], None]
canceled_by: Union[int, None]
duration: str
enqueued_at: str
started_at: str
Expand Down
32 changes: 32 additions & 0 deletions meilisearch/task.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from meilisearch._httprequests import HttpRequests
from meilisearch.config import Config
from meilisearch.errors import MeiliSearchTimeoutError
from meilisearch.models.task import TaskInfo


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


def cancel_tasks(config: Config, parameters: dict[str, Any]) -> TaskInfo:
"""Cancel a list of enqueued or processing tasks.

Parameters
----------
config:
Config object containing permission and location of Meilisearch.
parameters (optional):
parameters accepted by the cancel tasks https://docs.meilisearch.com/reference/api/tasks.html#cancel-task.

Returns
-------
task_info:
TaskInfo instance containing information about a task to track the progress of an asynchronous process.
https://docs.meilisearch.com/reference/api/tasks.html#get-one-task

Raises
------
MeiliSearchApiError
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
"""
http = HttpRequests(config)
if parameters is None:
parameters = {}
for param in parameters:
if isinstance(parameters[param], list):
parameters[param] = ",".join(parameters[param])
response = http.post(f"{config.paths.task}/cancel?{parse.urlencode(parameters)}")
return TaskInfo(**response)


def wait_for_task(
config: Config,
uid: int,
Expand Down
28 changes: 28 additions & 0 deletions tests/client/test_client_task_meilisearch.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import pytest

from meilisearch.models.task import TaskInfo
from tests import common


Expand Down Expand Up @@ -91,3 +92,30 @@ def test_get_task_inexistent(client):
"""Tests getting a task that does not exists."""
with pytest.raises(Exception):
client.get_task("abc")


def test_cancel_tasks(client):
"""Tests cancel a task with uid 1."""
task = client.cancel_tasks({"uids": ["1", "2"]})
tasks = client.get_tasks({"types": "taskCancelation"})

assert isinstance(task, TaskInfo)
assert task.task_uid is not None
assert task.index_uid is None
assert task.status in {"enqueued", "processing", "succeeded"}
assert task.type == "taskCancelation"
assert "uids" in tasks["results"][0]["details"]["originalFilter"]
assert "uids=1%2C2" in tasks["results"][0]["details"]["originalFilter"]


def test_cancel_every_task(client):
"""Tests cancel every task."""
task = client.cancel_tasks({"statuses": ["enqueued", "processing"]})
tasks = client.get_tasks({"types": "taskCancelation"})

assert isinstance(task, TaskInfo)
assert task.task_uid is not None
assert task.index_uid is None
assert task.status in {"enqueued", "processing", "succeeded"}
assert task.type == "taskCancelation"
assert "statuses=enqueued%2Cprocessing" in tasks["results"][0]["details"]["originalFilter"]