diff --git a/libs/community/tests/unit_tests/vectorstores/test_indexing_docs.py b/libs/community/tests/unit_tests/vectorstores/test_indexing_docs.py new file mode 100644 index 0000000000000..9a1e438d2f0e0 --- /dev/null +++ b/libs/community/tests/unit_tests/vectorstores/test_indexing_docs.py @@ -0,0 +1,83 @@ +from langchain_core.vectorstores import VectorStore + +import langchain_community.vectorstores + + +def test_compatible_vectorstore_documentation() -> None: + """Test which vectorstores are compatible with the indexing API. + + This serves as a reminder to update the documentation in [1] + that specifies which vectorstores are compatible with the + indexing API. + + Ideally if a developer adds a new vectorstore or modifies + an existing one in such a way that affects its compatibility + with the Indexing API, he/she will see this failed test + case and 1) update docs in [1] and 2) update the `documented` + dict in this test case. + + [1] langchain/docs/docs_skeleton/docs/modules/data_connection/indexing.ipynb + """ + + # Check if a vectorstore is compatible with the indexing API + def check_compatibility(vector_store: VectorStore) -> bool: + """Check if a vectorstore is compatible with the indexing API.""" + methods = ["delete", "add_documents"] + for method in methods: + if not hasattr(vector_store, method): + return False + # Checking if the vectorstore has overridden the default delete method + # implementation which just raises a NotImplementedError + if getattr(vector_store, "delete") == VectorStore.delete: + return False + return True + + # Check all vector store classes for compatibility + compatible = set() + for class_name in langchain_community.vectorstores.__all__: + # Get the definition of the class + cls = getattr(langchain_community.vectorstores, class_name) + + # If the class corresponds to a vectorstore, check its compatibility + if issubclass(cls, VectorStore): + is_compatible = check_compatibility(cls) + if is_compatible: + compatible.add(class_name) + + # These are mentioned in the indexing.ipynb documentation + documented = { + "AnalyticDB", + "AstraDB", + "AzureCosmosDBVectorSearch", + "AwaDB", + "Bagel", + "Cassandra", + "Chroma", + "DashVector", + "DatabricksVectorSearch", + "DeepLake", + "Dingo", + "ElasticVectorSearch", + "ElasticsearchStore", + "FAISS", + "HanaDB", + "MomentoVectorIndex", + "MyScale", + "PGVector", + "Pinecone", + "Qdrant", + "Redis", + "ScaNN", + "SemaDB", + "SupabaseVectorStore", + "SurrealDBStore", + "TileDB", + "TimescaleVector", + "Vald", + "Vearch", + "VespaStore", + "Weaviate", + "ZepVectorStore", + "Lantern", + } + assert compatible == documented diff --git a/libs/langchain/tests/unit_tests/indexes/test_indexing.py b/libs/langchain/tests/unit_tests/indexes/test_indexing.py index b5d4c4ab01258..5febe24ffeeb8 100644 --- a/libs/langchain/tests/unit_tests/indexes/test_indexing.py +++ b/libs/langchain/tests/unit_tests/indexes/test_indexing.py @@ -12,7 +12,6 @@ ) from unittest.mock import patch -import langchain_community.vectorstores import pytest import pytest_asyncio from langchain_community.document_loaders.base import BaseLoader @@ -1174,83 +1173,3 @@ async def test_aindexing_force_update( "num_skipped": 0, "num_updated": 2, } - - -def test_compatible_vectorstore_documentation() -> None: - """Test which vectorstores are compatible with the indexing API. - - This serves as a reminder to update the documentation in [1] - that specifies which vectorstores are compatible with the - indexing API. - - Ideally if a developer adds a new vectorstore or modifies - an existing one in such a way that affects its compatibility - with the Indexing API, he/she will see this failed test - case and 1) update docs in [1] and 2) update the `documented` - dict in this test case. - - [1] langchain/docs/docs_skeleton/docs/modules/data_connection/indexing.ipynb - """ - - # Check if a vectorstore is compatible with the indexing API - def check_compatibility(vector_store: VectorStore) -> bool: - """Check if a vectorstore is compatible with the indexing API.""" - methods = ["delete", "add_documents"] - for method in methods: - if not hasattr(vector_store, method): - return False - # Checking if the vectorstore has overridden the default delete method - # implementation which just raises a NotImplementedError - if getattr(vector_store, "delete") == VectorStore.delete: - return False - return True - - # Check all vector store classes for compatibility - compatible = set() - for class_name in langchain_community.vectorstores.__all__: - # Get the definition of the class - cls = getattr(langchain_community.vectorstores, class_name) - - # If the class corresponds to a vectorstore, check its compatibility - if issubclass(cls, VectorStore): - is_compatible = check_compatibility(cls) - if is_compatible: - compatible.add(class_name) - - # These are mentioned in the indexing.ipynb documentation - documented = { - "AnalyticDB", - "AstraDB", - "AzureCosmosDBVectorSearch", - "AwaDB", - "Bagel", - "Cassandra", - "Chroma", - "DashVector", - "DatabricksVectorSearch", - "DeepLake", - "Dingo", - "ElasticVectorSearch", - "ElasticsearchStore", - "FAISS", - "HanaDB", - "MomentoVectorIndex", - "MyScale", - "PGVector", - "Pinecone", - "Qdrant", - "Redis", - "ScaNN", - "SemaDB", - "SupabaseVectorStore", - "SurrealDBStore", - "TileDB", - "TimescaleVector", - "Vald", - "Vearch", - "VespaStore", - "Weaviate", - "ZepVectorStore", - "Lantern", - } - assert compatible == documented