From 3bb57df872999f071e842da75369a9f35f0b91d1 Mon Sep 17 00:00:00 2001 From: Eric Hare Date: Mon, 23 Feb 2026 11:05:42 -0800 Subject: [PATCH 1/2] feat: Switch set_ to with_ and alias --- CHANGES | 4 + README.md | 8 +- astrapy/admin/admin.py | 6 +- astrapy/authentication.py | 6 +- astrapy/client.py | 6 +- astrapy/data/collection.py | 20 +-- astrapy/data/database.py | 20 +-- astrapy/data/info/collection_descriptor.py | 121 ++++++++++++++---- astrapy/utils/meta.py | 27 ++++ tests/base/conftest.py | 20 +-- .../collections/test_collection_ddl_async.py | 18 +-- .../collections/test_collection_ddl_sync.py | 18 +-- .../collections/test_collection_typing.py | 24 ++-- ...test_collection_vectorize_methods_async.py | 4 +- .../test_collection_vectorize_methods_sync.py | 4 +- tests/base/unit/test_collection_options.py | 22 ++-- ...test_findandrerank_collectiondefinition.py | 22 ++-- .../integration/test_vectorize_providers.py | 18 +-- 18 files changed, 235 insertions(+), 133 deletions(-) diff --git a/CHANGES b/CHANGES index 14fa6629..18b5ee0b 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,9 @@ main ==== +CollectionDefinition fluent interface: renamed all `set_*` methods to `with_*` (e.g., `set_vector_dimension` → `with_vector_dimension`): + - This better conveys the immutable builder pattern (methods return new objects rather than mutating in place) + - Old `set_*` methods remain as deprecated aliases (deprecated in 2.1.0, will be removed in 3.0.0) + - Affected methods: `with_indexing`, `with_default_id`, `with_vector_dimension`, `with_vector_metric`, `with_vector_source_model`, `with_vector_service`, `with_rerank`, `with_lexical` Supported Python versions are now 3.9 to 3.14: - extend to 3.13 and 3.14 - removal of Python 3.8 [Breaking change w.r.t. 2.1] diff --git a/README.md b/README.md index 01fbfee5..f809ee53 100644 --- a/README.md +++ b/README.md @@ -35,8 +35,8 @@ my_collection = my_database.create_collection( "dreams_collection", definition=( CollectionDefinition.builder() - .set_vector_dimension(3) - .set_vector_metric(VectorMetric.COSINE) + .with_vector_dimension(3) + .with_vector_metric(VectorMetric.COSINE) .build() ) ) @@ -104,7 +104,7 @@ my_collection = database.create_collection( "my_vectorize_collection", definition=( CollectionDefinition.builder() - .set_vector_service( + .with_vector_service( provider="example_vendor", model_name="embedding_model_name", authentication={"providerKey": ""} # if needed @@ -651,7 +651,7 @@ my_database = my_client.get_database( my_collection = my_database.create_collection( "ecommerce", - definition=CollectionDefinition.builder().set_default_id( + definition=CollectionDefinition.builder().with_default_id( DefaultIdType.UUIDV6 ).build(), ) diff --git a/astrapy/admin/admin.py b/astrapy/admin/admin.py index f43255b5..395fd947 100644 --- a/astrapy/admin/admin.py +++ b/astrapy/admin/admin.py @@ -1125,7 +1125,7 @@ def create_database( ... "movies", ... definition=( ... CollectionDefinition.builder() - ... .set_vector_dimension(2) + ... .with_vector_dimension(2) ... .build() ... ) ... ) @@ -1794,7 +1794,7 @@ def get_database( ... "movies", ... definition=( ... CollectionDefinition.builder() - ... .set_vector_dimension(2) + ... .with_vector_dimension(2) ... .build() ... ) ... ) @@ -1920,7 +1920,7 @@ def get_async_database( ... "movies", ... definition=( ... CollectionDefinition.builder() - ... .set_vector_dimension(2) + ... .with_vector_dimension(2) ... .build() ... ) ... ) diff --git a/astrapy/authentication.py b/astrapy/authentication.py index 9f045af0..e33a364f 100644 --- a/astrapy/authentication.py +++ b/astrapy/authentication.py @@ -327,7 +327,7 @@ class EmbeddingAPIKeyHeaderProvider(EmbeddingHeadersProvider): ... "vectorize_aws_collection", ... definition=( ... CollectionDefinition.builder() - ... .set_vector_service(service_options) + ... .with_vector_service(service_options) ... .build() ... ), ... embedding_api_key=my_emb_api_key, @@ -393,7 +393,7 @@ class AWSEmbeddingHeadersProvider(EmbeddingHeadersProvider): ... "vectorize_aws_collection", ... definition=( ... CollectionDefinition.builder() - ... .set_vector_service(service_options) + ... .with_vector_service(service_options) ... .build() ... ), ... embedding_api_key=my_aws_emb_api_key, @@ -465,7 +465,7 @@ class RerankingAPIKeyHeaderProvider(RerankingHeadersProvider): ... "my_reranking_collection", ... definition=( ... CollectionDefinition.builder() - ... .set_rerank(CollectionRerankOptions(service=service_options)) + ... .with_rerank(CollectionRerankOptions(service=service_options)) ... .build() ... ), ... reranking_api_key=my_rrk_api_key, diff --git a/astrapy/client.py b/astrapy/client.py index d194022c..a52adfba 100644 --- a/astrapy/client.py +++ b/astrapy/client.py @@ -88,7 +88,7 @@ class DataAPIClient: ... "movies", ... definition=( ... CollectionDefinition.builder() - ... .set_vector_dimension(2) + ... .with_vector_dimension(2) ... .build() ... ), ... ) @@ -244,7 +244,7 @@ def get_database( ... "movies", ... definition=( ... CollectionDefinition.builder() - ... .set_vector_dimension(2) + ... .with_vector_dimension(2) ... .build() ... ), ... ) @@ -340,7 +340,7 @@ def get_async_database( ... "movies", ... definition=( ... CollectionDefinition.builder() - ... .set_vector_dimension(2) + ... .with_vector_dimension(2) ... .build() ... ) ... ) diff --git a/astrapy/data/collection.py b/astrapy/data/collection.py index b2ca5056..6e45f18f 100644 --- a/astrapy/data/collection.py +++ b/astrapy/data/collection.py @@ -161,9 +161,9 @@ class Collection(Generic[DOC]): >>> >>> collection_definition = ( ... CollectionDefinition.builder() - ... .set_vector_dimension(3) - ... .set_vector_metric(VectorMetric.DOT_PRODUCT) - ... .set_indexing("deny", ["annotations", "logs"]) + ... .with_vector_dimension(3) + ... .with_vector_metric(VectorMetric.DOT_PRODUCT) + ... .with_indexing("deny", ["annotations", "logs"]) ... .build() ... ) >>> my_collection = database.create_collection( @@ -212,7 +212,7 @@ class Collection(Generic[DOC]): >>> # Create a collection with 'vectorize' and on-the-fly authentication (by headers) >>> collection_definition_vz1 = ( ... CollectionDefinition.builder() - ... .set_vector_service( + ... .with_vector_service( ... "openai", ... "text-embedding-3-small", ... ) @@ -228,7 +228,7 @@ class Collection(Generic[DOC]): >>> # Create a 'vectorize' collection, its secret pre-stored on DB as 'EMB_AUTH_KEY' >>> collection_definition_vz2 = ( ... CollectionDefinition.builder() - ... .set_vector_service( + ... .with_vector_service( ... "openai", ... "text-embedding-3-small", ... authentication={ @@ -3132,9 +3132,9 @@ class AsyncCollection(Generic[DOC]): >>> >>> collection_definition = ( ... CollectionDefinition.builder() - ... .set_vector_dimension(3) - ... .set_vector_metric(VectorMetric.DOT_PRODUCT) - ... .set_indexing("deny", ["annotations", "logs"]) + ... .with_vector_dimension(3) + ... .with_vector_metric(VectorMetric.DOT_PRODUCT) + ... .with_indexing("deny", ["annotations", "logs"]) ... .build() ... ) >>> my_collection = await async_database.create_collection( @@ -3183,7 +3183,7 @@ class AsyncCollection(Generic[DOC]): >>> # Create a collection with 'vectorize' and on-the-fly authentication (by headers) >>> collection_definition_vz1 = ( ... CollectionDefinition.builder() - ... .set_vector_service( + ... .with_vector_service( ... "openai", ... "text-embedding-3-small", ... ) @@ -3199,7 +3199,7 @@ class AsyncCollection(Generic[DOC]): >>> # Create a 'vectorize' collection, its secret pre-stored on DB as 'EMB_AUTH_KEY' >>> collection_definition_vz2 = ( ... CollectionDefinition.builder() - ... .set_vector_service( + ... .with_vector_service( ... "openai", ... "text-embedding-3-small", ... authentication={ diff --git a/astrapy/data/database.py b/astrapy/data/database.py index c0295017..8af71b02 100644 --- a/astrapy/data/database.py +++ b/astrapy/data/database.py @@ -723,9 +723,9 @@ def create_collection( >>> >>> collection_definition = ( ... CollectionDefinition.builder() - ... .set_vector_dimension(3) - ... .set_vector_metric(VectorMetric.DOT_PRODUCT) - ... .set_indexing("deny", ["annotations", "logs"]) + ... .with_vector_dimension(3) + ... .with_vector_metric(VectorMetric.DOT_PRODUCT) + ... .with_indexing("deny", ["annotations", "logs"]) ... .build() ... ) >>> my_collection = database.create_collection( @@ -769,7 +769,7 @@ def create_collection( >>> # Create a collection with 'vectorize' and on-the-fly authentication (by headers) >>> collection_definition_vz1 = ( ... CollectionDefinition.builder() - ... .set_vector_service( + ... .with_vector_service( ... "openai", ... "text-embedding-3-small", ... ) @@ -785,7 +785,7 @@ def create_collection( >>> # Create a 'vectorize' collection, its secret pre-stored on DB as 'EMB_AUTH_KEY' >>> collection_definition_vz2 = ( ... CollectionDefinition.builder() - ... .set_vector_service( + ... .with_vector_service( ... "openai", ... "text-embedding-3-small", ... authentication={ @@ -2973,9 +2973,9 @@ async def create_collection( >>> >>> collection_definition = ( ... CollectionDefinition.builder() - ... .set_vector_dimension(3) - ... .set_vector_metric(VectorMetric.DOT_PRODUCT) - ... .set_indexing("deny", ["annotations", "logs"]) + ... .with_vector_dimension(3) + ... .with_vector_metric(VectorMetric.DOT_PRODUCT) + ... .with_indexing("deny", ["annotations", "logs"]) ... .build() ... ) >>> my_collection = asyncio.run(async_database.create_collection( @@ -3019,7 +3019,7 @@ async def create_collection( >>> # Create a collection with 'vectorize' and on-the-fly authentication (by headers) >>> collection_definition_vz1 = ( ... CollectionDefinition.builder() - ... .set_vector_service( + ... .with_vector_service( ... "openai", ... "text-embedding-3-small", ... ) @@ -3035,7 +3035,7 @@ async def create_collection( >>> # Create a 'vectorize' collection, its secret pre-stored on DB as 'EMB_AUTH_KEY' >>> collection_definition_vz2 = ( ... CollectionDefinition.builder() - ... .set_vector_service( + ... .with_vector_service( ... "openai", ... "text-embedding-3-small", ... authentication={ diff --git a/astrapy/data/info/collection_descriptor.py b/astrapy/data/info/collection_descriptor.py index 64de41b0..57b6d0ff 100644 --- a/astrapy/data/info/collection_descriptor.py +++ b/astrapy/data/info/collection_descriptor.py @@ -20,6 +20,7 @@ from astrapy.data.info.database_info import AstraDBDatabaseInfo from astrapy.data.info.reranking import RerankServiceOptions from astrapy.data.info.vectorize import VectorServiceOptions +from astrapy.utils.meta import deprecated_method from astrapy.utils.parsing import _warn_residual_keys from astrapy.utils.unset import _UNSET, UnsetType @@ -277,9 +278,9 @@ class CollectionDefinition: >>> # Create a collection definition with the fluent interface: >>> collection_definition = ( ... CollectionDefinition.builder() - ... .set_vector_dimension(3) - ... .set_vector_metric(VectorMetric.DOT_PRODUCT) - ... .set_indexing("deny", ["annotations", "logs"]) + ... .with_vector_dimension(3) + ... .with_vector_metric(VectorMetric.DOT_PRODUCT) + ... .with_indexing("deny", ["annotations", "logs"]) ... .build() ... ) >>> @@ -404,7 +405,7 @@ def builder() -> CollectionDefinition: return CollectionDefinition() - def set_indexing( + def with_indexing( self, indexing_mode: str | None, indexing_target: list[str] | None = None ) -> CollectionDefinition: """ @@ -453,7 +454,14 @@ def set_indexing( default_id=self.default_id, ) - def set_default_id(self, default_id_type: str | None) -> CollectionDefinition: + @deprecated_method(new_name="with_indexing", deprecated_in="2.1.0", removed_in="3.0.0") + def set_indexing( + self, indexing_mode: str | None, indexing_target: list[str] | None = None + ) -> CollectionDefinition: + """Deprecated alias for with_indexing. Use with_indexing instead.""" + return self.with_indexing(indexing_mode, indexing_target) + + def with_default_id(self, default_id_type: str | None) -> CollectionDefinition: """ Return a new collection definition object with a new setting for the collection 'default ID type'. This method is for use within the @@ -490,7 +498,12 @@ def set_default_id(self, default_id_type: str | None) -> CollectionDefinition: ), ) - def set_vector_dimension(self, dimension: int | None) -> CollectionDefinition: + @deprecated_method(new_name="with_default_id", deprecated_in="2.1.0", removed_in="3.0.0") + def set_default_id(self, default_id_type: str | None) -> CollectionDefinition: + """Deprecated alias for with_default_id. Use with_default_id instead.""" + return self.with_default_id(default_id_type) + + def with_vector_dimension(self, dimension: int | None) -> CollectionDefinition: """ Return a new collection definition object with a new setting for the collection's vector dimension. This method is for use within the @@ -523,7 +536,12 @@ def set_vector_dimension(self, dimension: int | None) -> CollectionDefinition: default_id=self.default_id, ) - def set_vector_metric(self, metric: str | None) -> CollectionDefinition: + @deprecated_method(new_name="with_vector_dimension", deprecated_in="2.1.0", removed_in="3.0.0") + def set_vector_dimension(self, dimension: int | None) -> CollectionDefinition: + """Deprecated alias for with_vector_dimension. Use with_vector_dimension instead.""" + return self.with_vector_dimension(dimension) + + def with_vector_metric(self, metric: str | None) -> CollectionDefinition: """ Return a new collection definition object with a new setting for the collection's vector similarity metric. This method is for use within the @@ -557,7 +575,12 @@ def set_vector_metric(self, metric: str | None) -> CollectionDefinition: default_id=self.default_id, ) - def set_vector_source_model(self, source_model: str | None) -> CollectionDefinition: + @deprecated_method(new_name="with_vector_metric", deprecated_in="2.1.0", removed_in="3.0.0") + def set_vector_metric(self, metric: str | None) -> CollectionDefinition: + """Deprecated alias for with_vector_metric. Use with_vector_metric instead.""" + return self.with_vector_metric(metric) + + def with_vector_source_model(self, source_model: str | None) -> CollectionDefinition: """ Return a new collection definition object with a new setting for the collection's vector 'source model' parameter. This method is for use within the @@ -592,7 +615,12 @@ def set_vector_source_model(self, source_model: str | None) -> CollectionDefinit default_id=self.default_id, ) - def set_vector_service( + @deprecated_method(new_name="with_vector_source_model", deprecated_in="2.1.0", removed_in="3.0.0") + def set_vector_source_model(self, source_model: str | None) -> CollectionDefinition: + """Deprecated alias for with_vector_source_model. Use with_vector_source_model instead.""" + return self.with_vector_source_model(source_model) + + def with_vector_service( self, provider: str | VectorServiceOptions | None, model_name: str | None = None, @@ -636,7 +664,7 @@ def set_vector_service( >>> >>> zero = CollectionDefinition.builder() >>> - >>> svc1 = zero.set_vector_service( + >>> svc1 = zero.with_vector_service( ... "myProvider", ... "myModelName", ... parameters={"p": "z"}, @@ -649,11 +677,11 @@ def set_vector_service( ... model_name="myModelName", ... parameters={"p": "z"}, ... ) - >>> svc2 = zero.set_vector_service(myVecSvcOpt).build() + >>> svc2 = zero.with_vector_service(myVecSvcOpt).build() >>> print(svc2.as_dict()) {'vector': {'service': {'provider': 'myProvider', 'modelName': 'myModelName', 'parameters': {'p': 'z'}}}} >>> - >>> reset = svc1.set_vector_service(None).build() + >>> reset = svc1.with_vector_service(None).build() >>> print(reset.as_dict()) {} """ @@ -716,7 +744,19 @@ def set_vector_service( default_id=self.default_id, ) - def set_rerank( + @deprecated_method(new_name="with_vector_service", deprecated_in="2.1.0", removed_in="3.0.0") + def set_vector_service( + self, + provider: str | VectorServiceOptions | None, + model_name: str | None = None, + *, + authentication: dict[str, Any] | None = None, + parameters: dict[str, Any] | None = None, + ) -> CollectionDefinition: + """Deprecated alias for with_vector_service. Use with_vector_service instead.""" + return self.with_vector_service(provider, model_name, authentication=authentication, parameters=parameters) + + def with_rerank( self, provider: str | CollectionRerankOptions @@ -775,7 +815,7 @@ def set_rerank( >>> >>> zero = CollectionDefinition.builder() >>> - >>> rrk1 = zero.set_rerank( + >>> rrk1 = zero.with_rerank( ... "myProvider", ... "myModelName", ... parameters={"p": "z"}, @@ -788,7 +828,7 @@ def set_rerank( ... model_name="myModelName", ... parameters={"p": "z"}, ... ) - >>> rrk2 = zero.set_rerank(myRrkSvcOpt).build() + >>> rrk2 = zero.with_rerank(myRrkSvcOpt).build() >>> print(rrk2.as_dict()) {'rerank': {'enabled': True, 'service': {'provider': 'myProvider', 'modelName': 'myModelName', 'parameters': {'p': 'z'}}}} >>> @@ -796,15 +836,15 @@ def set_rerank( ... enabled=True, ... service=myRrkSvcOpt, ... ) - >>> rrk3 = zero.set_rerank(myColRrkOpt).build() + >>> rrk3 = zero.with_rerank(myColRrkOpt).build() >>> print(rrk3.as_dict()) {'rerank': {'enabled': True, 'service': {'provider': 'myProvider', 'modelName': 'myModelName', 'parameters': {'p': 'z'}}}} >>> - >>> rrk4 = rrk1.set_rerank(enabled=False).build() + >>> rrk4 = rrk1.with_rerank(enabled=False).build() >>> print(rrk4.as_dict()) {'rerank': {'enabled': False}} >>> - >>> reset = rrk1.set_rerank(None).build() + >>> reset = rrk1.with_rerank(None).build() >>> print(reset.as_dict()) {} """ @@ -883,7 +923,7 @@ def set_rerank( if enabled is None: msg = ( "At least one of 'provider' and 'enabled' must be passed " - "to `set_rerank`." + "to `with_rerank`." ) raise ValueError(msg) return CollectionDefinition( @@ -911,7 +951,24 @@ def set_rerank( default_id=self.default_id, ) - def set_lexical( + @deprecated_method(new_name="with_rerank", deprecated_in="2.1.0", removed_in="3.0.0") + def set_rerank( + self, + provider: str + | CollectionRerankOptions + | RerankServiceOptions + | None + | UnsetType = _UNSET, + model_name: str | None = None, + *, + authentication: dict[str, Any] | None = None, + parameters: dict[str, Any] | None = None, + enabled: bool | None = None, + ) -> CollectionDefinition: + """Deprecated alias for with_rerank. Use with_rerank instead.""" + return self.with_rerank(provider, model_name, authentication=authentication, parameters=parameters, enabled=enabled) + + def with_lexical( self, analyzer: str | dict[str, Any] @@ -949,19 +1006,19 @@ def set_lexical( >>> >>> zero = CollectionDefinition.builder() >>> - >>> anz1 = zero.set_lexical( + >>> anz1 = zero.with_lexical( ... "analyzer_setting", ... ) >>> print(anz1.build().as_dict()) {'lexical': {'enabled': True, 'analyzer': 'analyzer_setting'}} >>> myLexOpt = CollectionLexicalOptions(analyzer="analyzer_setting") - >>> anz2 = zero.set_lexical(myLexOpt).build() + >>> anz2 = zero.with_lexical(myLexOpt).build() >>> print(anz2.as_dict()) {'lexical': {'enabled': True, 'analyzer': 'analyzer_setting'}} - >>> reset = anz1.set_lexical(None).build() + >>> reset = anz1.with_lexical(None).build() >>> print(reset.as_dict()) {} - >>> anz3 = zero.set_lexical(enabled=False).build() + >>> anz3 = zero.with_lexical(enabled=False).build() >>> print(anz3.as_dict()) {'lexical': {'enabled': False}} """ @@ -995,7 +1052,7 @@ def set_lexical( if enabled is None: msg = ( "At least one of 'enabled' and 'analyzer' must be passed " - "to set_lexical." + "to with_lexical." ) raise ValueError(msg) return CollectionDefinition( @@ -1018,6 +1075,20 @@ def set_lexical( default_id=self.default_id, ) + @deprecated_method(new_name="with_lexical", deprecated_in="2.1.0", removed_in="3.0.0") + def set_lexical( + self, + analyzer: str + | dict[str, Any] + | CollectionLexicalOptions + | None + | UnsetType = _UNSET, + *, + enabled: bool | None = None, + ) -> CollectionDefinition: + """Deprecated alias for with_lexical. Use with_lexical instead.""" + return self.with_lexical(analyzer, enabled=enabled) + def build(self) -> CollectionDefinition: """ The final step in the fluent (builder) interface. Calling this method diff --git a/astrapy/utils/meta.py b/astrapy/utils/meta.py index 0fe994ab..2825ead7 100644 --- a/astrapy/utils/meta.py +++ b/astrapy/utils/meta.py @@ -98,6 +98,33 @@ def wrapper(*args: P.args, **kwargs: P.kwargs) -> R: return _deprecator +def deprecated_method( + new_name: str, deprecated_in: str, removed_in: str +) -> Callable[[Callable[P, R]], Callable[P, R]]: + """ + Decorator for a method that is a deprecated alias for method 'new_name'. + """ + + def _deprecator(method: Callable[P, R]) -> Callable[P, R]: + @wraps(method) + def wrapper(*args: P.args, **kwargs: P.kwargs) -> R: + the_warning = DeprecatedWarning( + f"Method '{method.__name__}'", + deprecated_in=deprecated_in, + removed_in=removed_in, + details=f"Please use '{new_name}' instead.", + ) + warnings.warn( + the_warning, + stacklevel=2, + ) + return method(*args, **kwargs) + + return wrapper + + return _deprecator + + def beta_method(method: Callable[P, R]) -> Callable[P, R]: @wraps(method) def wrapper(*args: P.args, **kwargs: P.kwargs) -> R: diff --git a/tests/base/conftest.py b/tests/base/conftest.py index 1e17ef92..83ce6fbf 100644 --- a/tests/base/conftest.py +++ b/tests/base/conftest.py @@ -249,8 +249,8 @@ def sync_service_collection( TEST_SERVICE_COLLECTION_NAME, definition=( CollectionDefinition.builder() - .set_vector_metric(VectorMetric.DOT_PRODUCT) - .set_vector_service( + .with_vector_metric(VectorMetric.DOT_PRODUCT) + .with_vector_service( provider=params["provider"], model_name=params["modelName"], ) @@ -314,13 +314,13 @@ def sync_farr_vectorize_collection( TEST_FARR_VECTORIZE_COLLECTION_NAME, definition=( CollectionDefinition.builder() - .set_vector_metric(VectorMetric.DOT_PRODUCT) - .set_vector_service( + .with_vector_metric(VectorMetric.DOT_PRODUCT) + .with_vector_service( provider=params["provider"], model_name=params["modelName"], ) - .set_rerank(rerankservice_collection_parameters) - .set_lexical(lexical_collection_parameters) + .with_rerank(rerankservice_collection_parameters) + .with_lexical(lexical_collection_parameters) .build() ), embedding_api_key=params["api_key"], @@ -367,10 +367,10 @@ def sync_farr_vector_collection( TEST_FARR_VECTOR_COLLECTION_NAME, definition=( CollectionDefinition.builder() - .set_vector_metric(VectorMetric.DOT_PRODUCT) - .set_vector_dimension(2) - .set_rerank(rerankservice_collection_parameters) - .set_lexical(lexical_collection_parameters) + .with_vector_metric(VectorMetric.DOT_PRODUCT) + .with_vector_dimension(2) + .with_rerank(rerankservice_collection_parameters) + .with_lexical(lexical_collection_parameters) .build() ), reranking_api_key=params["reranking_api_key"] diff --git a/tests/base/integration/collections/test_collection_ddl_async.py b/tests/base/integration/collections/test_collection_ddl_async.py index 3f4a74d3..6e34ef30 100644 --- a/tests/base/integration/collections/test_collection_ddl_async.py +++ b/tests/base/integration/collections/test_collection_ddl_async.py @@ -73,9 +73,9 @@ async def test_collection_lifecycle_async( assert col1_dict == col1 fluent_definition1 = ( CollectionDefinition.builder() - .set_vector_dimension(123) - .set_vector_metric(VectorMetric.EUCLIDEAN) - .set_indexing("deny", ["a", "b", "c"]) + .with_vector_dimension(123) + .with_vector_metric(VectorMetric.EUCLIDEAN) + .with_indexing("deny", ["a", "b", "c"]) .build() ) col1_fluent = await async_database.create_collection( @@ -518,10 +518,10 @@ async def test_collection_farr_lifecycle_async( assert col1_dict == col1 fluent_definition1 = ( CollectionDefinition.builder() - .set_vector_dimension(10) - .set_vector_metric(VectorMetric.EUCLIDEAN) - .set_rerank("nvidia", "nvidia/llama-3.2-nv-rerankqa-1b-v2") - .set_lexical("STANDARD") + .with_vector_dimension(10) + .with_vector_metric(VectorMetric.EUCLIDEAN) + .with_rerank("nvidia", "nvidia/llama-3.2-nv-rerankqa-1b-v2") + .with_lexical("STANDARD") .build() ) col1_fluent = await async_database.create_collection( @@ -573,7 +573,7 @@ async def test_collection_lexical_detailedconfig_async( TEST_LEXICAL_DETAILEDCONFIG_COLLECTION_NAME, definition=( CollectionDefinition.builder() - .set_lexical( + .with_lexical( { "tokenizer": {"name": "standard", "args": {}}, "filters": [ @@ -624,7 +624,7 @@ async def test_collection_lexical_omittedsettings_async( await async_database.create_collection( TEST_LEXICAL_OMITTEDSETTINGS_COLLECTION_NAME, definition=( - CollectionDefinition.builder().set_lexical(enabled=True).build() + CollectionDefinition.builder().with_lexical(enabled=True).build() ), ) diff --git a/tests/base/integration/collections/test_collection_ddl_sync.py b/tests/base/integration/collections/test_collection_ddl_sync.py index 2aa3a784..13fe3f7d 100644 --- a/tests/base/integration/collections/test_collection_ddl_sync.py +++ b/tests/base/integration/collections/test_collection_ddl_sync.py @@ -73,9 +73,9 @@ def test_collection_lifecycle_sync( assert col1_dict == col1 fluent_definition1 = ( CollectionDefinition.builder() - .set_vector_dimension(123) - .set_vector_metric(VectorMetric.EUCLIDEAN) - .set_indexing("deny", ["a", "b", "c"]) + .with_vector_dimension(123) + .with_vector_metric(VectorMetric.EUCLIDEAN) + .with_indexing("deny", ["a", "b", "c"]) .build() ) col1_fluent = sync_database.create_collection( @@ -514,10 +514,10 @@ def test_collection_farr_lifecycle_sync( assert col1_dict == col1 fluent_definition1 = ( CollectionDefinition.builder() - .set_vector_dimension(10) - .set_vector_metric(VectorMetric.EUCLIDEAN) - .set_rerank("nvidia", "nvidia/llama-3.2-nv-rerankqa-1b-v2") - .set_lexical("STANDARD") + .with_vector_dimension(10) + .with_vector_metric(VectorMetric.EUCLIDEAN) + .with_rerank("nvidia", "nvidia/llama-3.2-nv-rerankqa-1b-v2") + .with_lexical("STANDARD") .build() ) col1_fluent = sync_database.create_collection( @@ -569,7 +569,7 @@ def test_collection_lexical_detailedconfig_sync( TEST_LEXICAL_DETAILEDCONFIG_COLLECTION_NAME, definition=( CollectionDefinition.builder() - .set_lexical( + .with_lexical( { "tokenizer": {"name": "standard", "args": {}}, "filters": [ @@ -618,7 +618,7 @@ def test_collection_lexical_omittedsettings_sync( sync_database.create_collection( TEST_LEXICAL_OMITTEDSETTINGS_COLLECTION_NAME, definition=( - CollectionDefinition.builder().set_lexical(enabled=True).build() + CollectionDefinition.builder().with_lexical(enabled=True).build() ), ) diff --git a/tests/base/integration/collections/test_collection_typing.py b/tests/base/integration/collections/test_collection_typing.py index 84611b1e..61ef8fe8 100644 --- a/tests/base/integration/collections/test_collection_typing.py +++ b/tests/base/integration/collections/test_collection_typing.py @@ -76,9 +76,9 @@ def test_create_collection_typing_sync( sync_empty_collection.name, definition=( CollectionDefinition.builder() - .set_vector_dimension(2) - .set_vector_metric(VectorMetric.COSINE) - .set_indexing("deny", ["not_indexed"]) + .with_vector_dimension(2) + .with_vector_metric(VectorMetric.COSINE) + .with_indexing("deny", ["not_indexed"]) .build() ), ) @@ -118,9 +118,9 @@ def test_create_collection_typing_sync( sync_empty_collection.name, definition=( CollectionDefinition.builder() - .set_vector_dimension(2) - .set_vector_metric(VectorMetric.COSINE) - .set_indexing("deny", ["not_indexed"]) + .with_vector_dimension(2) + .with_vector_metric(VectorMetric.COSINE) + .with_indexing("deny", ["not_indexed"]) .build() ), document_type=MyTestDoc, @@ -427,9 +427,9 @@ async def test_create_collection_typing_async( async_empty_collection.name, definition=( CollectionDefinition.builder() - .set_vector_dimension(2) - .set_vector_metric(VectorMetric.COSINE) - .set_indexing("deny", ["not_indexed"]) + .with_vector_dimension(2) + .with_vector_metric(VectorMetric.COSINE) + .with_indexing("deny", ["not_indexed"]) .build() ), ) @@ -471,9 +471,9 @@ async def test_create_collection_typing_async( async_empty_collection.name, definition=( CollectionDefinition.builder() - .set_vector_dimension(2) - .set_vector_metric(VectorMetric.COSINE) - .set_indexing("deny", ["not_indexed"]) + .with_vector_dimension(2) + .with_vector_metric(VectorMetric.COSINE) + .with_indexing("deny", ["not_indexed"]) .build() ), document_type=MyTestDoc, diff --git a/tests/base/integration/collections/test_collection_vectorize_methods_async.py b/tests/base/integration/collections/test_collection_vectorize_methods_async.py index 22f58aaf..95fad0b7 100644 --- a/tests/base/integration/collections/test_collection_vectorize_methods_async.py +++ b/tests/base/integration/collections/test_collection_vectorize_methods_async.py @@ -279,10 +279,10 @@ async def test_database_create_collection_dimension_mismatch_failure_async( "collection_name", definition=( CollectionDefinition.builder() - .set_vector_dimension( + .with_vector_dimension( service_collection_parameters["dimension"] + 10 ) - .set_vector_service( + .with_vector_service( provider=service_collection_parameters["provider"], model_name=service_collection_parameters["modelName"], ) diff --git a/tests/base/integration/collections/test_collection_vectorize_methods_sync.py b/tests/base/integration/collections/test_collection_vectorize_methods_sync.py index 6ca8afad..cc746e7a 100644 --- a/tests/base/integration/collections/test_collection_vectorize_methods_sync.py +++ b/tests/base/integration/collections/test_collection_vectorize_methods_sync.py @@ -261,10 +261,10 @@ def test_database_create_collection_dimension_mismatch_failure_sync( "collection_name", definition=( CollectionDefinition.builder() - .set_vector_dimension( + .with_vector_dimension( service_collection_parameters["dimension"] + 10 ) - .set_vector_service( + .with_vector_service( provider=service_collection_parameters["provider"], model_name=service_collection_parameters["modelName"], ) diff --git a/tests/base/unit/test_collection_options.py b/tests/base/unit/test_collection_options.py index f9fdc437..65329daa 100644 --- a/tests/base/unit/test_collection_options.py +++ b/tests/base/unit/test_collection_options.py @@ -265,11 +265,11 @@ def test_fluent_collection_definition() -> None: assert zero.build().as_dict() == {} rich = ( - zero.set_indexing("allow", ["a", "b"]) - .set_default_id("UUID") - .set_vector_dimension(123) - .set_vector_metric("cosine") - .set_vector_service( + zero.with_indexing("allow", ["a", "b"]) + .with_default_id("UUID") + .with_vector_dimension(123) + .with_vector_metric("cosine") + .with_vector_service( "prov", "mod", authentication={"a": "u"}, parameters={"p": "a"} ) .build() @@ -291,12 +291,12 @@ def test_fluent_collection_definition() -> None: assert rich.as_dict() == expected_rich_dict zero_2 = ( - rich.set_indexing(None) - .set_default_id(None) - .set_vector_dimension(None) - .set_vector_metric(None) - .set_vector_source_model(None) - .set_vector_service(None) + rich.with_indexing(None) + .with_default_id(None) + .with_vector_dimension(None) + .with_vector_metric(None) + .with_vector_source_model(None) + .with_vector_service(None) .build() ) assert zero_2.build().as_dict() == {} diff --git a/tests/base/unit/test_findandrerank_collectiondefinition.py b/tests/base/unit/test_findandrerank_collectiondefinition.py index 9756c674..8cdcb680 100644 --- a/tests/base/unit/test_findandrerank_collectiondefinition.py +++ b/tests/base/unit/test_findandrerank_collectiondefinition.py @@ -127,7 +127,7 @@ def test_farr_collectionrerankoptions_conversions(self) -> None: def test_farr_collectiondefinition_rerank_builders(self) -> None: zero = CollectionDefinition.builder() - rer1 = zero.set_rerank("p", "m", parameters={"p": "q"}).build() + rer1 = zero.with_rerank("p", "m", parameters={"p": "q"}).build() assert rer1.as_dict() == { "rerank": { "enabled": True, @@ -140,7 +140,7 @@ def test_farr_collectiondefinition_rerank_builders(self) -> None: } r_svc = RerankServiceOptions("P", "M") - rer2 = zero.set_rerank(r_svc).build() + rer2 = zero.with_rerank(r_svc).build() assert rer2.as_dict() == { "rerank": { "enabled": True, @@ -151,7 +151,7 @@ def test_farr_collectiondefinition_rerank_builders(self) -> None: cr_opt = CollectionRerankOptions( service=RerankServiceOptions("pp", "mm"), ) - rer3 = zero.set_rerank(cr_opt).build() + rer3 = zero.with_rerank(cr_opt).build() assert rer3.as_dict() == { "rerank": { "enabled": True, @@ -159,8 +159,8 @@ def test_farr_collectiondefinition_rerank_builders(self) -> None: } } - rer_z = zero.set_rerank("x", "y") - reset = rer_z.set_rerank(None).build() + rer_z = zero.with_rerank("x", "y") + reset = rer_z.with_rerank(None).build() assert reset.as_dict() == {} @pytest.mark.describe( @@ -169,7 +169,7 @@ def test_farr_collectiondefinition_rerank_builders(self) -> None: def test_farr_collectiondefinition_lexical_builders(self) -> None: zero = CollectionDefinition.builder() - lex1 = zero.set_lexical("an").build() + lex1 = zero.with_lexical("an").build() assert lex1.as_dict() == { "lexical": { "enabled": True, @@ -178,7 +178,7 @@ def test_farr_collectiondefinition_lexical_builders(self) -> None: } lx_opt = CollectionLexicalOptions(enabled=False, analyzer="AN") - lex2 = zero.set_lexical(lx_opt).build() + lex2 = zero.with_lexical(lx_opt).build() assert lex2.as_dict() == { "lexical": { "enabled": False, @@ -186,12 +186,12 @@ def test_farr_collectiondefinition_lexical_builders(self) -> None: } } - lex3 = zero.set_lexical(enabled=False) + lex3 = zero.with_lexical(enabled=False) assert lex3.as_dict() == {"lexical": {"enabled": False}} - lex4 = zero.set_lexical(enabled=True) + lex4 = zero.with_lexical(enabled=True) assert lex4.as_dict() == {"lexical": {"enabled": True}} - lex_z = zero.set_lexical("aaa") - reset = lex_z.set_lexical(None) + lex_z = zero.with_lexical("aaa") + reset = lex_z.with_lexical(None) assert reset.as_dict() == {} diff --git a/tests/vectorize/integration/test_vectorize_providers.py b/tests/vectorize/integration/test_vectorize_providers.py index 531ac59f..203e7f1c 100644 --- a/tests/vectorize/integration/test_vectorize_providers.py +++ b/tests/vectorize/integration/test_vectorize_providers.py @@ -127,9 +127,9 @@ def test_vectorize_usage_auth_type_header_sync( collection_name, definition=( CollectionDefinition.builder() - .set_vector_dimension(dimension) - .set_vector_metric("cosine") - .set_vector_service(service_options) + .with_vector_dimension(dimension) + .with_vector_metric("cosine") + .with_vector_service(service_options) .build() ), embedding_api_key=embedding_api_key, @@ -219,9 +219,9 @@ def test_vectorize_usage_auth_type_none_sync( collection_name, definition=( CollectionDefinition.builder() - .set_vector_dimension(dimension) - .set_vector_metric("cosine") - .set_vector_service(service_options) + .with_vector_dimension(dimension) + .with_vector_metric("cosine") + .with_vector_service(service_options) .build() ), ) @@ -323,9 +323,9 @@ def test_vectorize_usage_auth_type_shared_secret_sync( collection_name, definition=( CollectionDefinition.builder() - .set_vector_dimension(dimension) - .set_vector_metric("cosine") - .set_vector_service(service_options) + .with_vector_dimension(dimension) + .with_vector_metric("cosine") + .with_vector_service(service_options) .build() ), ) From 5edf680bbd69a688d5bba43f0a4e46911e98ce95 Mon Sep 17 00:00:00 2001 From: Eric Hare Date: Mon, 23 Feb 2026 11:08:23 -0800 Subject: [PATCH 2/2] Ruff fixes in collection_descriptor.py --- astrapy/data/info/collection_descriptor.py | 48 +++++++++++++++++----- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/astrapy/data/info/collection_descriptor.py b/astrapy/data/info/collection_descriptor.py index 57b6d0ff..afa074d0 100644 --- a/astrapy/data/info/collection_descriptor.py +++ b/astrapy/data/info/collection_descriptor.py @@ -454,7 +454,9 @@ def with_indexing( default_id=self.default_id, ) - @deprecated_method(new_name="with_indexing", deprecated_in="2.1.0", removed_in="3.0.0") + @deprecated_method( + new_name="with_indexing", deprecated_in="2.1.0", removed_in="3.0.0" + ) def set_indexing( self, indexing_mode: str | None, indexing_target: list[str] | None = None ) -> CollectionDefinition: @@ -498,7 +500,9 @@ def with_default_id(self, default_id_type: str | None) -> CollectionDefinition: ), ) - @deprecated_method(new_name="with_default_id", deprecated_in="2.1.0", removed_in="3.0.0") + @deprecated_method( + new_name="with_default_id", deprecated_in="2.1.0", removed_in="3.0.0" + ) def set_default_id(self, default_id_type: str | None) -> CollectionDefinition: """Deprecated alias for with_default_id. Use with_default_id instead.""" return self.with_default_id(default_id_type) @@ -536,7 +540,9 @@ def with_vector_dimension(self, dimension: int | None) -> CollectionDefinition: default_id=self.default_id, ) - @deprecated_method(new_name="with_vector_dimension", deprecated_in="2.1.0", removed_in="3.0.0") + @deprecated_method( + new_name="with_vector_dimension", deprecated_in="2.1.0", removed_in="3.0.0" + ) def set_vector_dimension(self, dimension: int | None) -> CollectionDefinition: """Deprecated alias for with_vector_dimension. Use with_vector_dimension instead.""" return self.with_vector_dimension(dimension) @@ -575,12 +581,16 @@ def with_vector_metric(self, metric: str | None) -> CollectionDefinition: default_id=self.default_id, ) - @deprecated_method(new_name="with_vector_metric", deprecated_in="2.1.0", removed_in="3.0.0") + @deprecated_method( + new_name="with_vector_metric", deprecated_in="2.1.0", removed_in="3.0.0" + ) def set_vector_metric(self, metric: str | None) -> CollectionDefinition: """Deprecated alias for with_vector_metric. Use with_vector_metric instead.""" return self.with_vector_metric(metric) - def with_vector_source_model(self, source_model: str | None) -> CollectionDefinition: + def with_vector_source_model( + self, source_model: str | None + ) -> CollectionDefinition: """ Return a new collection definition object with a new setting for the collection's vector 'source model' parameter. This method is for use within the @@ -615,7 +625,9 @@ def with_vector_source_model(self, source_model: str | None) -> CollectionDefini default_id=self.default_id, ) - @deprecated_method(new_name="with_vector_source_model", deprecated_in="2.1.0", removed_in="3.0.0") + @deprecated_method( + new_name="with_vector_source_model", deprecated_in="2.1.0", removed_in="3.0.0" + ) def set_vector_source_model(self, source_model: str | None) -> CollectionDefinition: """Deprecated alias for with_vector_source_model. Use with_vector_source_model instead.""" return self.with_vector_source_model(source_model) @@ -744,7 +756,9 @@ def with_vector_service( default_id=self.default_id, ) - @deprecated_method(new_name="with_vector_service", deprecated_in="2.1.0", removed_in="3.0.0") + @deprecated_method( + new_name="with_vector_service", deprecated_in="2.1.0", removed_in="3.0.0" + ) def set_vector_service( self, provider: str | VectorServiceOptions | None, @@ -754,7 +768,9 @@ def set_vector_service( parameters: dict[str, Any] | None = None, ) -> CollectionDefinition: """Deprecated alias for with_vector_service. Use with_vector_service instead.""" - return self.with_vector_service(provider, model_name, authentication=authentication, parameters=parameters) + return self.with_vector_service( + provider, model_name, authentication=authentication, parameters=parameters + ) def with_rerank( self, @@ -951,7 +967,9 @@ def with_rerank( default_id=self.default_id, ) - @deprecated_method(new_name="with_rerank", deprecated_in="2.1.0", removed_in="3.0.0") + @deprecated_method( + new_name="with_rerank", deprecated_in="2.1.0", removed_in="3.0.0" + ) def set_rerank( self, provider: str @@ -966,7 +984,13 @@ def set_rerank( enabled: bool | None = None, ) -> CollectionDefinition: """Deprecated alias for with_rerank. Use with_rerank instead.""" - return self.with_rerank(provider, model_name, authentication=authentication, parameters=parameters, enabled=enabled) + return self.with_rerank( + provider, + model_name, + authentication=authentication, + parameters=parameters, + enabled=enabled, + ) def with_lexical( self, @@ -1075,7 +1099,9 @@ def with_lexical( default_id=self.default_id, ) - @deprecated_method(new_name="with_lexical", deprecated_in="2.1.0", removed_in="3.0.0") + @deprecated_method( + new_name="with_lexical", deprecated_in="2.1.0", removed_in="3.0.0" + ) def set_lexical( self, analyzer: str