Skip to content

Commit 82413df

Browse files
authored
Merge pull request #476 from meilisearch/task_changes
Apply tasks changes
2 parents 3c0374d + 0d6a002 commit 82413df

21 files changed

+216
-164
lines changed

meilisearch/client.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -383,20 +383,26 @@ def create_dump(self) -> Dict[str, str]:
383383
"""
384384
return self.http.post(self.config.paths.dumps)
385385

386-
def get_tasks(self) -> Dict[str, List[Dict[str, Any]]]:
386+
def get_tasks(self, parameters: Optional[Dict[str, Any]] = None) -> Dict[str, List[Dict[str, Any]]]:
387387
"""Get all tasks.
388388
389+
Parameters
390+
----------
391+
parameters (optional):
392+
parameters accepted by the get tasks route: https://docs.meilisearch.com/reference/api/tasks.html#get-all-tasks.
393+
`indexUid` should be set as a List.
394+
389395
Returns
390396
-------
391397
task:
392-
Dictionary containing a list of all enqueued, processing, succeeded or failed tasks.
398+
Dictionary with limit, from, next and results containing a list of all enqueued, processing, succeeded or failed tasks.
393399
394400
Raises
395401
------
396402
MeiliSearchApiError
397403
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
398404
"""
399-
return get_tasks(self.config)
405+
return get_tasks(self.config, parameters=parameters)
400406

401407
def get_task(self, uid: int) -> Dict[str, Any]:
402408
"""Get one task.

meilisearch/index.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,20 +124,30 @@ def create(config: Config, uid: str, options: Optional[Dict[str, Any]] = None) -
124124
payload = {**options, 'uid': uid}
125125
return HttpRequests(config).post(config.paths.index, payload)
126126

127-
def get_tasks(self) -> Dict[str, List[Dict[str, Any]]]:
127+
def get_tasks(self, parameters: Optional[Dict[str, Any]] = None) -> Dict[str, List[Dict[str, Any]]]:
128128
"""Get all tasks of a specific index from the last one.
129129
130+
Parameters
131+
----------
132+
parameters (optional):
133+
parameters accepted by the get tasks route: https://docs.meilisearch.com/reference/api/tasks.html#get-all-tasks.
134+
`indexUid` should be set as a List.
135+
130136
Returns
131137
-------
132138
task:
133-
Dictionary containing a list of all enqueued, processing, succeeded or failed tasks of the index.
139+
Dictionary with limit, from, next and results containing a list of all enqueued, processing, succeeded or failed tasks of the index.
134140
135141
Raises
136142
------
137143
MeiliSearchApiError
138144
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
139145
"""
140-
return get_tasks(self.config, self.uid)
146+
if parameters is not None:
147+
parameters.setdefault('indexUid', []).append(self.uid)
148+
else:
149+
parameters = {'indexUid': self.uid}
150+
return get_tasks(self.config, parameters=parameters)
141151

142152
def get_task(self, uid: int) -> Dict[str, Any]:
143153
"""Get one task through the route of a specific index.
@@ -157,7 +167,7 @@ def get_task(self, uid: int) -> Dict[str, Any]:
157167
MeiliSearchApiError
158168
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
159169
"""
160-
return get_task(self.config, uid, self.uid)
170+
return get_task(self.config, uid)
161171

162172
def wait_for_task(
163173
self, uid: int,

meilisearch/task.py

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from urllib import parse
12
from time import sleep
23
from datetime import datetime
34
from typing import Any, Dict, List, Optional
@@ -6,36 +7,37 @@
67
from meilisearch.config import Config
78
from meilisearch.errors import MeiliSearchTimeoutError
89

9-
def get_tasks(config: Config, index_id: Optional[str] = None) -> Dict[str, List[Dict[str, Any]]]:
10+
def get_tasks(config: Config, parameters: Optional[Dict[str, Any]] = None) -> Dict[str, List[Dict[str, Any]]]:
1011
"""Get all tasks.
1112
1213
Parameters
1314
----------
1415
config:
1516
Config object containing permission and location of Meilisearch.
16-
index_id:
17-
The id of the `Index`.
17+
parameters (optional):
18+
parameters accepted by the get tasks route: https://docs.meilisearch.com/reference/api/tasks.html#get-all-tasks.
19+
`indexUid` should be set as a List.
1820
1921
Returns
2022
-------
2123
task:
22-
Dictionary containing a list of all enqueued, processing, succeeded or failed tasks.
24+
Dictionary with limit, from, next and results containing a list of all enqueued, processing, succeeded or failed tasks.
2325
2426
Raises
2527
------
2628
MeiliSearchApiError
2729
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
2830
"""
2931
http = HttpRequests(config)
30-
if index_id is None:
31-
return http.get(
32-
f'{config.paths.task}'
33-
)
32+
if parameters is None or parameters == {}:
33+
parameters = {}
34+
elif 'indexUid' in parameters:
35+
parameters['indexUid'] = ",".join(parameters['indexUid'])
3436
return http.get(
35-
f'{config.paths.index}/{index_id}/{config.paths.task}'
37+
f"{config.paths.task}?{parse.urlencode(parameters)}"
3638
)
3739

38-
def get_task(config: Config, uid: int, index_id: Optional[str] = None) -> Dict[str, Any]:
40+
def get_task(config: Config, uid: int) -> Dict[str, Any]:
3941
"""Get one task.
4042
4143
Parameters
@@ -58,12 +60,8 @@ def get_task(config: Config, uid: int, index_id: Optional[str] = None) -> Dict[s
5860
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
5961
"""
6062
http = HttpRequests(config)
61-
if index_id is None:
62-
return http.get(
63-
f'{config.paths.task}/{uid}'
64-
)
6563
return http.get(
66-
f'{config.paths.index}/{index_id}/{config.paths.task}/{uid}'
64+
f'{config.paths.task}/{uid}'
6765
)
6866

6967

tests/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
from .common import MASTER_KEY, BASE_URL
2-
from .helper import wait_for_dump_creation

tests/client/test_client_task_meilisearch.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,38 @@ def test_get_tasks_default(client):
1010
assert 'results' in tasks
1111

1212
def test_get_tasks(client, empty_index):
13-
"""Tests getting the global tasks list after populated an index."""
13+
"""Tests getting the global tasks list after populating an index."""
1414
current_tasks = client.get_tasks()
15-
pre_count = len(current_tasks["results"])
15+
pre_count = current_tasks["from"]
1616
empty_index()
1717
tasks = client.get_tasks()
1818
assert isinstance(tasks, dict)
19-
assert len(tasks['results']) == pre_count + 1
19+
assert tasks['from'] == pre_count + 1
20+
21+
def test_get_tasks_empty_parameters(client, empty_index):
22+
"""Tests getting the global tasks list after populating an index."""
23+
tasks = client.get_tasks({})
24+
assert isinstance(tasks, dict)
25+
assert isinstance(tasks['results'], list)
26+
27+
def test_get_tasks_with_parameters(client):
28+
"""Tests getting the global tasks list after populating an index."""
29+
tasks = client.get_tasks({'limit': 1, 'from': 1})
30+
assert isinstance(tasks, dict)
31+
assert len(tasks['results']) == 1
32+
assert tasks['results'][0]['uid'] == 1
33+
34+
def test_get_tasks_with_index_uid(client):
35+
"""Tests getting the global tasks list after populating an index."""
36+
tasks = client.get_tasks({'limit': 1, 'indexUid': [common.INDEX_UID]})
37+
assert isinstance(tasks, dict)
38+
assert len(tasks['results']) == 1
2039

2140
def test_get_task(client):
2241
"""Tests getting the tasks list of an empty index."""
2342
response = client.create_index(uid=common.INDEX_UID)
24-
client.wait_for_task(response['uid'])
25-
task = client.get_task(response['uid'])
43+
client.wait_for_task(response['taskUid'])
44+
task = client.get_task(response['taskUid'])
2645
assert isinstance(task, dict)
2746
assert len(task) == 9
2847
assert 'uid' in task

tests/conftest.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ def clear_indexes(client):
2323
indexes = client.get_indexes()
2424
for index in indexes:
2525
task = client.index(index.uid).delete()
26-
client.wait_for_task(task['uid'])
26+
client.wait_for_task(task['taskUid'])
2727

2828
@fixture(scope='function')
2929
def indexes_sample(client):
3030
indexes = []
3131
for index_args in common.INDEX_FIXTURE:
3232
task = client.create_index(**index_args)
33-
client.wait_for_task(task['uid'])
33+
client.wait_for_task(task['taskUid'])
3434
indexes.append(client.get_index(index_args['uid']))
3535
# Yields the indexes to the test to make them accessible.
3636
yield indexes
@@ -78,18 +78,18 @@ def nested_movies():
7878
@fixture(scope='function')
7979
def empty_index(client, index_uid: Optional[str] = None):
8080
index_uid = index_uid if index_uid else common.INDEX_UID
81-
def index_maker(index_name=index_uid):
82-
task = client.create_index(uid=index_name)
83-
client.wait_for_task(task['uid'])
84-
return client.get_index(uid=index_name)
81+
def index_maker(index_uid=index_uid):
82+
task = client.create_index(uid=index_uid)
83+
client.wait_for_task(task['taskUid'])
84+
return client.get_index(uid=index_uid)
8585
return index_maker
8686

8787
@fixture(scope='function')
8888
def index_with_documents(empty_index, small_movies):
89-
def index_maker(index_name=common.INDEX_UID, documents=small_movies):
90-
index = empty_index(index_name)
89+
def index_maker(index_uid=common.INDEX_UID, documents=small_movies):
90+
index = empty_index(index_uid)
9191
task = index.add_documents(documents)
92-
index.wait_for_task(task['uid'])
92+
index.wait_for_task(task['taskUid'])
9393
return index
9494
return index_maker
9595

tests/index/test_index.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def test_create_index(client, empty_index):
1919
def test_create_index_with_primary_key(client):
2020
"""Tests creating an index with a primary key."""
2121
response = client.create_index(uid=common.INDEX_UID2, options={'primaryKey': 'book_id'})
22-
client.wait_for_task(response['uid'])
22+
client.wait_for_task(response['taskUid'])
2323
index = client.get_index(uid=common.INDEX_UID2)
2424
assert isinstance(index, Index)
2525
assert index.uid == common.INDEX_UID2
@@ -29,7 +29,7 @@ def test_create_index_with_primary_key(client):
2929
def test_create_index_with_uid_in_options(client):
3030
"""Tests creating an index with a primary key."""
3131
response = client.create_index(uid=common.INDEX_UID3, options={'uid': 'wrong', 'primaryKey': 'book_id'})
32-
client.wait_for_task(response['uid'])
32+
client.wait_for_task(response['taskUid'])
3333
index = client.get_index(uid=common.INDEX_UID3)
3434
assert isinstance(index, Index)
3535
assert index.uid == common.INDEX_UID3
@@ -140,7 +140,7 @@ def test_update_index(empty_index):
140140
"""Tests updating an index."""
141141
index = empty_index()
142142
response = index.update(primary_key='objectID')
143-
index.wait_for_task(response['uid'])
143+
index.wait_for_task(response['taskUid'])
144144
response = index.fetch_info()
145145
assert isinstance(response, Index)
146146
assert index.get_primary_key() == 'objectID'
@@ -152,17 +152,17 @@ def test_delete_index_by_client(client):
152152
"""Tests deleting an index."""
153153
response = client.index(uid=common.INDEX_UID).delete()
154154
assert response['status'] == 'enqueued'
155-
client.wait_for_task(response['uid'])
155+
client.wait_for_task(response['taskUid'])
156156
with pytest.raises(Exception):
157157
client.get_index(uid=common.INDEX_UID)
158158
response = client.index(uid=common.INDEX_UID2).delete()
159159
assert response['status'] == 'enqueued'
160-
client.wait_for_task(response['uid'])
160+
client.wait_for_task(response['taskUid'])
161161
with pytest.raises(Exception):
162162
client.get_index(uid=common.INDEX_UID2)
163163
response = client.index(uid=common.INDEX_UID3).delete()
164164
assert response['status'] == 'enqueued'
165-
client.wait_for_task(response['uid'])
165+
client.wait_for_task(response['taskUid'])
166166
with pytest.raises(Exception):
167167
client.get_index(uid=common.INDEX_UID3)
168168
assert len(client.get_indexes()) == 0
@@ -171,14 +171,14 @@ def test_delete_index_by_client(client):
171171
def test_delete(client):
172172
assert client.get_index(uid=common.INDEX_UID)
173173
deleted = Client(BASE_URL, MASTER_KEY).index(common.INDEX_UID).delete()
174-
client.wait_for_task(deleted['uid'])
174+
client.wait_for_task(deleted['taskUid'])
175175
with pytest.raises(MeiliSearchApiError):
176176
client.get_index(uid=common.INDEX_UID)
177177

178178
@pytest.mark.usefixtures("indexes_sample")
179179
def test_delete_index(client):
180180
assert client.get_index(uid=common.INDEX_UID)
181181
deleted = Client(BASE_URL, MASTER_KEY).delete_index(uid=common.INDEX_UID)
182-
client.wait_for_task(deleted['uid'])
182+
client.wait_for_task(deleted['taskUid'])
183183
with pytest.raises(MeiliSearchApiError):
184184
client.get_index(uid=common.INDEX_UID)

0 commit comments

Comments
 (0)