Skip to content

Commit 8a7de8d

Browse files
authored
Merge pull request #157 from meilisearch/implement_dumps
Add dumps implementation, tests and code samples
2 parents 92d8406 + f940fd5 commit 8a7de8d

File tree

5 files changed

+97
-0
lines changed

5 files changed

+97
-0
lines changed

.code-samples.meilisearch.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,3 +361,7 @@ faceted_search_walkthrough_facets_distribution_1: |-
361361
client.get_index('movies').search('Batman', {
362362
'facetsDistribution': ['genres']
363363
})
364+
post_dump_1: |-
365+
client.create_dump()
366+
get_dump_status_1: |-
367+
client.get_dump_status('20201101-110357260')

meilisearch/client.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,32 @@ def version(self):
176176
Information about the version of MeiliSearch.
177177
"""
178178
return self.get_version()
179+
180+
def create_dump(self):
181+
"""Triggers the creation of a MeiliSearch dump
182+
183+
Returns
184+
----------
185+
Dump: dict
186+
Information about the dump.
187+
https://docs.meilisearch.com/references/dump.html#create-a-dump
188+
"""
189+
return self.http.post(self.config.paths.dumps)
190+
191+
def get_dump_status(self, uid):
192+
"""Retrieves the status of a MeiliSearch dump creation
193+
194+
Parameters
195+
----------
196+
uid: str
197+
UID of the dump
198+
199+
Returns
200+
----------
201+
Dump status: dict
202+
Information about the dump status.
203+
https://docs.meilisearch.com/references/dump.html#get-dump-status
204+
"""
205+
return self.http.get(
206+
self.config.paths.dumps + '/' + str(uid) + '/status'
207+
)

meilisearch/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class Paths():
2121
synonyms = 'synonyms'
2222
accept_new_fields = 'accept-new-fields'
2323
attributes_for_faceting = 'attributes-for-faceting'
24+
dumps = 'dumps'
2425

2526
def __init__(self, url, api_key=None):
2627
"""

meilisearch/tests/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
1+
import time
2+
13
MASTER_KEY = 'masterKey'
24
BASE_URL = 'http://127.0.0.1:7700'
35

46
def clear_all_indexes(client):
57
indexes = client.get_indexes()
68
for index in indexes:
79
client.get_index(index['uid']).delete()
10+
11+
def wait_for_dump_creation(client, dump_uid):
12+
dump_status = client.get_dump_status(dump_uid)
13+
while dump_status['status'] == 'processing':
14+
time.sleep(0.1)
15+
dump_status = client.get_dump_status(dump_uid)
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import json
2+
import pytest
3+
import meilisearch
4+
from meilisearch.tests import BASE_URL, MASTER_KEY, clear_all_indexes, wait_for_dump_creation
5+
from meilisearch.errors import MeiliSearchApiError
6+
7+
class TestClientDumps:
8+
9+
""" TESTS: Client dumps creation and status """
10+
11+
client = meilisearch.Client(BASE_URL, MASTER_KEY)
12+
index = None
13+
dataset_file = None
14+
dataset_json = None
15+
16+
def setup_class(self):
17+
clear_all_indexes(self.client)
18+
self.dataset_file = open('./datasets/small_movies.json', 'r')
19+
self.dataset_json = json.loads(self.dataset_file.read())
20+
self.dataset_file.close()
21+
22+
def setup_method(self, method):
23+
"""Creates and populates an index before each test is run"""
24+
self.index = self.client.create_index(uid='indexUID-' + method.__name__)
25+
response = self.index.add_documents(self.dataset_json, primary_key='id')
26+
self.index.wait_for_pending_update(response['updateId'])
27+
28+
def teardown_method(self, method):
29+
self.client.get_index('indexUID-' + method.__name__).delete()
30+
31+
def teardown_class(self):
32+
"""Cleans all indexes in MEiliSearch when all the test are done"""
33+
clear_all_indexes(self.client)
34+
35+
def test_dump_creation(self):
36+
"""Tests the creation of a MeiliSearch dump"""
37+
dump = self.client.create_dump()
38+
assert dump['uid'] is not None
39+
assert dump['status'] == 'processing'
40+
wait_for_dump_creation(self.client, dump['uid'])
41+
42+
def test_dump_status_route(self):
43+
"""Tests the route for getting a MeiliSearch dump status"""
44+
dump = self.client.create_dump()
45+
assert dump['uid'] is not None
46+
assert dump['status'] == 'processing'
47+
dump_status = self.client.get_dump_status(dump['uid'])
48+
assert dump_status['uid'] is not None
49+
assert dump_status['status'] == 'processing'
50+
wait_for_dump_creation(self.client, dump['uid'])
51+
52+
def test_dump_status_nonexistent_uid_raises_error(self):
53+
"""Tests the route for getting a nonexistent dump status"""
54+
with pytest.raises(MeiliSearchApiError):
55+
self.client.get_dump_status('uid_not_exists')

0 commit comments

Comments
 (0)