Skip to content

Commit 5c59b0c

Browse files
bidoubiwaeskombro
authored andcommitted
Improved error handling
- Parent MeiliSearch error class, single file and heritage - Tests: MeiliSearchCommunicationError and MeiliSearchApiError - Http requests error raise refacto
1 parent a816019 commit 5c59b0c

File tree

5 files changed

+81
-32
lines changed

5 files changed

+81
-32
lines changed

meilisearch/_httprequests.py

Lines changed: 16 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import requests
2+
from meilisearch.errors import MeiliSearchApiError, MeiliSearchCommunicationError
23

34
class HttpRequests:
45

@@ -12,43 +13,28 @@ def __init__(self, config):
1213
'Content-Type': 'application/json'
1314
}
1415

16+
def send_request(self, http_method, path, body=None):
17+
try:
18+
request_path = self.config.url + '/' + path
19+
if body is None:
20+
request = http_method(request_path, headers=self.headers)
21+
else:
22+
request = http_method(request_path, headers=self.headers, json=body)
23+
return self.__validate(request)
24+
except requests.exceptions.ConnectionError as err:
25+
raise MeiliSearchCommunicationError(err)
1526

1627
def get(self, path):
17-
request = requests.get(
18-
self.config.url + '/' + path,
19-
headers=self.headers,
20-
)
21-
return self.__validate(request)
28+
return self.send_request(requests.get, path)
2229

2330
def post(self, path, body=None):
24-
if body is None:
25-
body = {}
26-
request = requests.post(
27-
self.config.url + '/' + path,
28-
headers=self.headers,
29-
json=body
30-
)
31-
return self.__validate(request)
31+
return self.send_request(requests.post, path, body)
3232

3333
def put(self, path, body=None):
34-
if body is None:
35-
body = {}
36-
request = requests.put(
37-
self.config.url + '/' + path,
38-
headers=self.headers,
39-
json=body
40-
)
41-
return self.__validate(request)
34+
return self.send_request(requests.put, path, body)
4235

4336
def delete(self, path, body=None):
44-
if body is None:
45-
body = {}
46-
request = requests.delete(
47-
self.config.url + '/' + path,
48-
headers=self.headers,
49-
json=body
50-
)
51-
return self.__validate(request)
37+
return self.send_request(requests.delete, path, body)
5238

5339
@staticmethod
5440
def __to_json(request):
@@ -62,6 +48,4 @@ def __validate(request):
6248
request.raise_for_status()
6349
return HttpRequests.__to_json(request)
6450
except requests.exceptions.HTTPError as err:
65-
raise Exception(err)
66-
except requests.exceptions.ConnectionError as err:
67-
raise Exception(err)
51+
raise MeiliSearchApiError(err, request)

meilisearch/errors.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import json
2+
3+
class MeiliSearchError(Exception):
4+
"""Generic class for MeiliSearch error handling"""
5+
6+
def __init__(self, message):
7+
self.message = message
8+
super().__init__(self.message)
9+
10+
def __str__(self):
11+
return f'MeiliSearchError, {self.message}'
12+
13+
class MeiliSearchApiError(MeiliSearchError):
14+
"""Error sent by MeiliSearch API"""
15+
16+
def __init__(self, error, request):
17+
self.status_code = request.status_code
18+
if request.text:
19+
self.message = f'{json.loads(request.text)["message"]}'
20+
else:
21+
self.message = error
22+
super().__init__(self.message)
23+
24+
def __str__(self):
25+
return f'MeiliSearchApiError, HTTP status: {self.status_code} -> {self.message}'
26+
27+
class MeiliSearchCommunicationError(MeiliSearchError):
28+
"""Error connecting to MeiliSearch"""
29+
30+
def __str__(self):
31+
return f'MeiliSearchCommunicationError, {self.message}'

meilisearch/tests/errors/__init__.py

Whitespace-only changes.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import pytest
2+
import meilisearch
3+
from meilisearch.errors import MeiliSearchApiError
4+
from meilisearch.tests import BASE_URL, MASTER_KEY
5+
6+
class TestMeiliSearchApiError:
7+
8+
""" TESTS: MeiliSearchApiError class """
9+
10+
@staticmethod
11+
def test_meilisearch_api_error_no_master_key():
12+
client = meilisearch.Client(BASE_URL)
13+
with pytest.raises(MeiliSearchApiError):
14+
client.create_index("some_index")
15+
16+
@staticmethod
17+
def test_meilisearch_api_error_wrong_master_key():
18+
client = meilisearch.Client(BASE_URL, MASTER_KEY + '123')
19+
with pytest.raises(MeiliSearchApiError):
20+
client.create_index("some_index")
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import pytest
2+
import meilisearch
3+
from meilisearch.errors import MeiliSearchCommunicationError
4+
from meilisearch.tests import MASTER_KEY
5+
6+
class TestMeiliSearchCommunicationError:
7+
8+
""" TESTS: MeiliSearchCommunicationError class """
9+
10+
@staticmethod
11+
def test_meilisearch_communication_error_host():
12+
client = meilisearch.Client("http://wrongurl:1234", MASTER_KEY)
13+
with pytest.raises(MeiliSearchCommunicationError):
14+
client.create_index("some_index")

0 commit comments

Comments
 (0)