diff --git a/src/typesense/document.py b/src/typesense/document.py index a707ee4..644602b 100644 --- a/src/typesense/document.py +++ b/src/typesense/document.py @@ -22,7 +22,11 @@ import sys from typesense.api_call import ApiCall -from typesense.types.document import DirtyValuesParameters, DocumentSchema +from typesense.types.document import ( + DeleteSingleDocumentParameters, + DirtyValuesParameters, + DocumentSchema, +) if sys.version_info >= (3, 11): import typing @@ -101,7 +105,10 @@ def update( ) return typing.cast(TDoc, response) - def delete(self) -> TDoc: + def delete( + self, + delete_parameters: typing.Union[DeleteSingleDocumentParameters, None] = None, + ) -> TDoc: """ Delete this specific document. @@ -111,6 +118,7 @@ def delete(self) -> TDoc: response: TDoc = self.api_call.delete( self._endpoint_path, entity_type=typing.Dict[str, str], + params=delete_parameters, ) return response diff --git a/src/typesense/types/document.py b/src/typesense/types/document.py index 2d2c5cf..102ab02 100644 --- a/src/typesense/types/document.py +++ b/src/typesense/types/document.py @@ -827,6 +827,17 @@ class SearchResponse(typing.Generic[TDoc], typing.TypedDict): conversation: typing.NotRequired[Conversation] +class DeleteSingleDocumentParameters(typing.TypedDict): + """ + Parameters for deleting a single document. + + Attributes: + ignore_not_found (bool): Ignore not found documents. + """ + + ignore_not_found: typing.NotRequired[bool] + + class DeleteQueryParameters(typing.TypedDict): """ Parameters for deleting documents. diff --git a/tests/document_test.py b/tests/document_test.py index 42e1cba..ac3042c 100644 --- a/tests/document_test.py +++ b/tests/document_test.py @@ -2,6 +2,7 @@ from __future__ import annotations +import pytest import requests_mock from tests.fixtures.document_fixtures import Companies @@ -13,6 +14,7 @@ from typesense.api_call import ApiCall from typesense.document import Document from typesense.documents import Documents +from typesense.exceptions import ObjectNotFound def test_init(fake_api_call: ApiCall) -> None: @@ -133,3 +135,28 @@ def test_actual_delete( "company_name": "Company", "num_employees": 10, } + + +def test_actual_delete_non_existent( + actual_documents: Documents, + delete_all: None, + create_collection: None, + create_document: None, +) -> None: + """Test that the Document object can delete an document from Typesense Server.""" + with pytest.raises(ObjectNotFound): + actual_documents["1"].delete() + + +def test_actual_delete_non_existent_ignore_not_found( + actual_documents: Documents, + delete_all: None, + create_collection: None, + create_document: None, +) -> None: + """Test that the Document object can delete an document from Typesense Server.""" + response = actual_documents["1"].delete( + delete_parameters={"ignore_not_found": True}, + ) + + assert response == {"id": "1"}