diff --git a/chromadb/api/__init__.py b/chromadb/api/__init__.py index d443f9ab005..c383923e9e6 100644 --- a/chromadb/api/__init__.py +++ b/chromadb/api/__init__.py @@ -1,5 +1,5 @@ from abc import ABC, abstractmethod -from typing import Sequence, Optional +from typing import Sequence, Optional, List from uuid import UUID from overrides import override @@ -347,19 +347,19 @@ def list_collections( self, limit: Optional[int] = None, offset: Optional[int] = None, - ) -> Sequence[Collection]: + ) -> List[str]: """List all collections. Args: limit: The maximum number of entries to return. Defaults to None. offset: The number of entries to skip before returning. Defaults to None. Returns: - Sequence[Collection]: A list of collections + List[str]: A list of collection names Examples: ```python client.list_collections() - # [collection(name="my_collection", metadata={})] + # ["my_collection"] ``` """ pass diff --git a/chromadb/api/async_api.py b/chromadb/api/async_api.py index 8396d1e9a97..529e10e9761 100644 --- a/chromadb/api/async_api.py +++ b/chromadb/api/async_api.py @@ -1,5 +1,5 @@ from abc import ABC, abstractmethod -from typing import Sequence, Optional +from typing import Sequence, Optional, List from uuid import UUID from overrides import override @@ -338,19 +338,19 @@ async def list_collections( self, limit: Optional[int] = None, offset: Optional[int] = None, - ) -> Sequence[AsyncCollection]: + ) -> List[str]: """List all collections. Args: limit: The maximum number of entries to return. Defaults to None. offset: The number of entries to skip before returning. Defaults to None. Returns: - Sequence[Collection]: A list of collections + List[str]: A list of collection names. Examples: ```python await client.list_collections() - # [collection(name="my_collection", metadata={})] + # ["my_collection"] ``` """ pass diff --git a/chromadb/api/async_client.py b/chromadb/api/async_client.py index 56491e5ca81..779ac7f7b07 100644 --- a/chromadb/api/async_client.py +++ b/chromadb/api/async_client.py @@ -1,5 +1,5 @@ import httpx -from typing import Optional, Sequence +from typing import Optional, Sequence, List from uuid import UUID from overrides import override from chromadb.auth import UserIdentity @@ -152,17 +152,11 @@ async def heartbeat(self) -> int: @override async def list_collections( self, limit: Optional[int] = None, offset: Optional[int] = None - ) -> Sequence[AsyncCollection]: + ) -> List[str]: models = await self._server.list_collections( limit, offset, tenant=self.tenant, database=self.database ) - return [ - AsyncCollection( - client=self._server, - model=model, - ) - for model in models - ] + return [model.name for model in models] @override async def count_collections(self) -> int: diff --git a/chromadb/api/client.py b/chromadb/api/client.py index de9ca1e7115..05afc35ce9b 100644 --- a/chromadb/api/client.py +++ b/chromadb/api/client.py @@ -1,4 +1,4 @@ -from typing import Optional, Sequence +from typing import Optional, Sequence, List from uuid import UUID from overrides import override @@ -118,9 +118,9 @@ def heartbeat(self) -> int: @override def list_collections( self, limit: Optional[int] = None, offset: Optional[int] = None - ) -> Sequence[Collection]: + ) -> List[str]: return [ - Collection(client=self._server, model=model) + model.name for model in self._server.list_collections( limit, offset, tenant=self.tenant, database=self.database ) diff --git a/chromadb/cli/cli.py b/chromadb/cli/cli.py index 14ab1bc34a3..11579d19d1c 100644 --- a/chromadb/cli/cli.py +++ b/chromadb/cli/cli.py @@ -154,7 +154,8 @@ def vacuum( sqlite, system.instance(SegmentManager) ) - for collection in collections: + for collection_name in collections: + collection = client.get_collection(collection_name) sqlite.purge_log(collection_id=collection.id) progress.update(task, advance=1) except Exception as e: diff --git a/chromadb/test/client/test_database_tenant.py b/chromadb/test/client/test_database_tenant.py index 1c84e013812..4ccb678401f 100644 --- a/chromadb/test/client/test_database_tenant.py +++ b/chromadb/test/client/test_database_tenant.py @@ -24,32 +24,38 @@ def test_database_tenant_collections(client_factories: ClientFactories) -> None: # List collections in the default database collections = client.list_collections() assert len(collections) == 1 - assert collections[0].name == "collection" - assert collections[0].metadata == {"database": DEFAULT_DATABASE} + assert collections[0] == "collection" + collection = client.get_collection(collections[0]) + assert collection.metadata == {"database": DEFAULT_DATABASE} # List collections in the new database client.set_tenant(tenant=DEFAULT_TENANT, database="test_db") collections = client.list_collections() assert len(collections) == 1 - assert collections[0].metadata == {"database": "test_db"} + collection = client.get_collection(collections[0]) + assert collection.metadata == {"database": "test_db"} # Update the metadata in both databases to different values client.set_tenant(tenant=DEFAULT_TENANT, database=DEFAULT_DATABASE) - client.list_collections()[0].modify(metadata={"database": "default2"}) + collection = client.get_collection(client.list_collections()[0]) + collection.modify(metadata={"database": "default2"}) client.set_tenant(tenant=DEFAULT_TENANT, database="test_db") - client.list_collections()[0].modify(metadata={"database": "test_db2"}) + collection = client.get_collection(client.list_collections()[0]) + collection.modify(metadata={"database": "test_db2"}) # Validate that the metadata was updated client.set_tenant(tenant=DEFAULT_TENANT, database=DEFAULT_DATABASE) collections = client.list_collections() assert len(collections) == 1 - assert collections[0].metadata == {"database": "default2"} + collection = client.get_collection(collections[0]) + assert collection.metadata == {"database": "default2"} client.set_tenant(tenant=DEFAULT_TENANT, database="test_db") collections = client.list_collections() assert len(collections) == 1 - assert collections[0].metadata == {"database": "test_db2"} + collection = client.get_collection(collections[0]) + assert collection.metadata == {"database": "test_db2"} # Delete the collections and make sure databases are isolated client.set_tenant(tenant=DEFAULT_TENANT, database=DEFAULT_DATABASE) diff --git a/chromadb/test/client/test_multiple_clients_concurrency.py b/chromadb/test/client/test_multiple_clients_concurrency.py index a9e855fb435..458fd3c2353 100644 --- a/chromadb/test/client/test_multiple_clients_concurrency.py +++ b/chromadb/test/client/test_multiple_clients_concurrency.py @@ -44,6 +44,7 @@ def run_target(n: int) -> None: client.set_database(database) seen_collections = client.list_collections() assert len(seen_collections) == COLLECTION_COUNT - for collection in seen_collections: + for collection_name in seen_collections: + collection = client.get_collection(collection_name) assert collection.name in collections assert collection.metadata == {"database": database} diff --git a/chromadb/test/property/test_collections.py b/chromadb/test/property/test_collections.py index 8dd10837ce1..4b3eaecba09 100644 --- a/chromadb/test/property/test_collections.py +++ b/chromadb/test/property/test_collections.py @@ -89,7 +89,7 @@ def list_collections(self) -> None: colls = self.client.list_collections() assert len(colls) == len(self.model) for c in colls: - assert c.name in self.model + assert c in self.model # @rule for list_collections with limit and offset @rule( diff --git a/chromadb/test/test_api.py b/chromadb/test/test_api.py index ab91408c992..0be44498e32 100644 --- a/chromadb/test/test_api.py +++ b/chromadb/test/test_api.py @@ -485,7 +485,8 @@ def test_metadata_cru(client): # Test list collections collections = client.list_collections() - for collection in collections: + for collection_name in collections: + collection = client.get_collection(collection_name) if collection.name == "testspace": assert collection.metadata is not None assert collection.metadata["a"] == 2 diff --git a/docs/docs.trychroma.com/pages/reference/py-client.md b/docs/docs.trychroma.com/pages/reference/py-client.md index 2ab4bac6318..e9be33571f6 100644 --- a/docs/docs.trychroma.com/pages/reference/py-client.md +++ b/docs/docs.trychroma.com/pages/reference/py-client.md @@ -257,10 +257,10 @@ class ClientAPI(BaseAPI, ABC) ```python def list_collections(limit: Optional[int] = None, - offset: Optional[int] = None) -> Sequence[Collection] + offset: Optional[int] = None) -> List[str] ``` -List all collections. +List all collection names. **Arguments**: