Skip to content

Commit 27a7f98

Browse files
authored
Merge pull request #97 from sanders41/delete_if_exists
Delete if exists
2 parents 81aa85d + 464fd14 commit 27a7f98

File tree

7 files changed

+98
-5
lines changed

7 files changed

+98
-5
lines changed

async_search_client/client.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from __future__ import annotations
22

3+
from asyncio import get_running_loop
4+
from functools import partial
35
from types import TracebackType
46
from typing import Optional, Type
57

@@ -43,6 +45,19 @@ async def create_dump(self) -> DumpInfo:
4345
async def create_index(self, uid: str, primary_key: Optional[str] = None) -> Index:
4446
return await Index.create(self._http_client, uid, primary_key)
4547

48+
async def delete_index_if_exists(self, uid: str) -> bool:
49+
try:
50+
loop = get_running_loop()
51+
url = await loop.run_in_executor(
52+
None, partial(build_url, section=Paths.INDEXES, uid=uid)
53+
)
54+
await self._http_requests.delete(url)
55+
return True
56+
except MeiliSearchApiError as error:
57+
if error.error_code != "index_not_found":
58+
raise error
59+
return False
60+
4661
async def get_indexes(self) -> Optional[list[Index]]:
4762
response = await self._http_requests.get(build_url(Paths.INDEXES))
4863

async_search_client/errors.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ def __init__(self, error: str, response: Response) -> None:
2121
self.message = ""
2222
self.error_link = ""
2323
if response.text:
24-
self.message = f" Error code: {response.json().get('message') or ''}."
25-
self.error_code = f" Error message: {response.json().get('errorCode') or ''}"
24+
self.message = f" Error message: {response.json().get('message') or ''}."
25+
self.error_code = f"{response.json().get('errorCode') or ''}"
2626
self.error_link = f" Error documentation: {response.json().get('errorLink') or ''}"
2727
else:
2828
self.message = error

async_search_client/index.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@
1212
from httpx import AsyncClient
1313

1414
from async_search_client._http_requests import HttpRequests
15-
from async_search_client.errors import MeiliSearchError, MeiliSearchTimeoutError
15+
from async_search_client.errors import (
16+
MeiliSearchApiError,
17+
MeiliSearchError,
18+
MeiliSearchTimeoutError,
19+
)
1620
from async_search_client.models import (
1721
IndexStats,
1822
MeiliSearchSettings,
@@ -53,6 +57,18 @@ async def delete(self) -> int:
5357
response = await self._http_requests.delete(url)
5458
return response.status_code
5559

60+
async def delete_if_exists(self) -> bool:
61+
"""
62+
Deletes the index if it already exists
63+
"""
64+
try:
65+
await self.delete()
66+
return True
67+
except MeiliSearchApiError as error:
68+
if error.error_code != "index_not_found":
69+
raise error
70+
return False
71+
5672
async def update(self, primary_key: str = None) -> Index:
5773
"""
5874
Update the index primary-key.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
from async_search_client.paths.build_url import build_url # noqa: F401
1+
from async_search_client.paths.url import build_url # noqa: F401
22
from async_search_client.paths.valid_paths import Paths # noqa: F401
File renamed without changes.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "async-search-client"
3-
version = "0.7.3"
3+
version = "0.8.0"
44
description = "A Python async client for the MeiliSearch API"
55
authors = ["Paul Sanders <[email protected]>"]
66
license = "MIT"

tests/integration/test_index.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
from datetime import datetime
22

33
import pytest
4+
from httpx import Response
45

6+
from async_search_client._http_requests import HttpRequests
57
from async_search_client.errors import MeiliSearchApiError, MeiliSearchTimeoutError
68
from async_search_client.index import Index
79
from async_search_client.models import MeiliSearchSettings
@@ -441,3 +443,63 @@ async def test_repr(empty_index):
441443
assert "primary_key" in got
442444
assert "created_at" in got
443445
assert "updated_at" in got
446+
447+
448+
@pytest.mark.asyncio
449+
@pytest.mark.usefixtures("indexes_sample")
450+
async def test_delete_if_exists(test_client, index_uid):
451+
assert await test_client.get_index(uid=index_uid)
452+
deleted = await test_client.index(index_uid).delete_if_exists()
453+
assert deleted is True
454+
with pytest.raises(MeiliSearchApiError):
455+
await test_client.get_index(uid=index_uid)
456+
457+
458+
@pytest.mark.asyncio
459+
async def test_delete_if_exists_no_delete(test_client):
460+
with pytest.raises(MeiliSearchApiError):
461+
await test_client.get_index(uid="none")
462+
463+
deleted = await test_client.index("none").delete_if_exists()
464+
assert deleted is False
465+
466+
467+
@pytest.mark.asyncio
468+
@pytest.mark.usefixtures("indexes_sample")
469+
async def test_delete_if_exists_error(test_client, index_uid, monkeypatch):
470+
async def mock_response(*args, **kwargs):
471+
raise MeiliSearchApiError("test", Response(status_code=404))
472+
473+
monkeypatch.setattr(HttpRequests, "_send_request", mock_response)
474+
with pytest.raises(MeiliSearchApiError):
475+
await test_client.index(index_uid).delete_if_exists()
476+
477+
478+
@pytest.mark.asyncio
479+
@pytest.mark.usefixtures("indexes_sample")
480+
async def test_delete_index_if_exists(test_client, index_uid):
481+
assert await test_client.get_index(uid=index_uid)
482+
deleted = await test_client.delete_index_if_exists(index_uid)
483+
assert deleted is True
484+
with pytest.raises(MeiliSearchApiError):
485+
await test_client.get_index(uid=index_uid)
486+
487+
488+
@pytest.mark.asyncio
489+
async def test_delete_index_if_exists_no_delete(test_client):
490+
with pytest.raises(MeiliSearchApiError):
491+
await test_client.get_index(uid="none")
492+
493+
deleted = await test_client.delete_index_if_exists("none")
494+
assert deleted is False
495+
496+
497+
@pytest.mark.asyncio
498+
@pytest.mark.usefixtures("indexes_sample")
499+
async def test_delete_index_if_exists_error(test_client, index_uid, monkeypatch):
500+
async def mock_response(*args, **kwargs):
501+
raise MeiliSearchApiError("test", Response(status_code=404))
502+
503+
monkeypatch.setattr(HttpRequests, "_send_request", mock_response)
504+
with pytest.raises(MeiliSearchApiError):
505+
await test_client.delete_index_if_exists(index_uid)

0 commit comments

Comments
 (0)