From cdeb83084fc438fc3f11e16e3354e19c0017de46 Mon Sep 17 00:00:00 2001 From: AdrianSosic Date: Mon, 28 Jul 2025 09:16:42 +0200 Subject: [PATCH 1/4] Bump attrs --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8938b4af0b..82793fa3af 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ keywords = [ ] dynamic = ['version'] dependencies = [ - "attrs>=24.1.0", + "attrs>=25.4.0", "botorch>=0.13.0,<1", "cattrs>=25.2.0", "exceptiongroup", diff --git a/uv.lock b/uv.lock index 3b1162616a..46263ca835 100644 --- a/uv.lock +++ b/uv.lock @@ -126,11 +126,11 @@ wheels = [ [[package]] name = "attrs" -version = "25.3.0" +version = "25.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, ] [[package]] @@ -356,7 +356,7 @@ test = [ [package.metadata] requires-dist = [ - { name = "attrs", specifier = ">=24.1.0" }, + { name = "attrs", specifier = ">=25.4.0" }, { name = "baybe", extras = ["benchmarking"], marker = "extra == 'dev'" }, { name = "baybe", extras = ["chem"], marker = "extra == 'benchmarking'" }, { name = "baybe", extras = ["chem"], marker = "extra == 'extras'" }, From 4b3fafa637d026f51c7fb2cc555346003ec4add0 Mon Sep 17 00:00:00 2001 From: AdrianSosic Date: Mon, 28 Jul 2025 09:16:01 +0200 Subject: [PATCH 2/4] Drop mypy workarounds for deep_mapping validator https://github.com/python-attrs/attrs/pull/1448 --- baybe/parameters/substance.py | 2 -- baybe/utils/metadata.py | 2 -- 2 files changed, 4 deletions(-) diff --git a/baybe/parameters/substance.py b/baybe/parameters/substance.py index d1de197fae..97db220913 100644 --- a/baybe/parameters/substance.py +++ b/baybe/parameters/substance.py @@ -44,9 +44,7 @@ class SubstanceParameter(_DiscreteLabelLikeParameter): converter=lambda x: dict(sorted(x.items())), validator=deep_mapping( mapping_validator=min_len(2), - # FIXME[typing]: https://github.com/python-attrs/attrs/issues/1206 key_validator=and_(instance_of(str), min_len(1)), - value_validator=lambda *x: None, ), ) """A mapping that provides the SMILES strings for all available parameter values.""" diff --git a/baybe/utils/metadata.py b/baybe/utils/metadata.py index b2a37c0239..5a45ada530 100644 --- a/baybe/utils/metadata.py +++ b/baybe/utils/metadata.py @@ -31,8 +31,6 @@ class Metadata(SerialMixin): validator=deep_mapping( mapping_validator=instance_of(dict), key_validator=instance_of(str), - # FIXME: https://github.com/python-attrs/attrs/issues/1246 - value_validator=lambda *x: None, ), kw_only=True, ) From f1fd5f9397260f688f0d562ae64132eb265200d7 Mon Sep 17 00:00:00 2001 From: AdrianSosic Date: Tue, 29 Jul 2025 10:29:44 +0200 Subject: [PATCH 3/4] Drop mypy workaround for deep_iterable https://github.com/python-attrs/attrs/pull/1449 --- baybe/parameters/substance.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/baybe/parameters/substance.py b/baybe/parameters/substance.py index 97db220913..061fcf4508 100644 --- a/baybe/parameters/substance.py +++ b/baybe/parameters/substance.py @@ -6,7 +6,7 @@ import pandas as pd from attrs import define, field -from attrs.validators import and_, deep_mapping, instance_of, min_len +from attrs.validators import deep_mapping, instance_of, min_len from typing_extensions import override from baybe.parameters.base import _DiscreteLabelLikeParameter @@ -44,7 +44,7 @@ class SubstanceParameter(_DiscreteLabelLikeParameter): converter=lambda x: dict(sorted(x.items())), validator=deep_mapping( mapping_validator=min_len(2), - key_validator=and_(instance_of(str), min_len(1)), + key_validator=[instance_of(str), min_len(1)], ), ) """A mapping that provides the SMILES strings for all available parameter values.""" From d556c21816f236a26687cab2c44bd97873a558a3 Mon Sep 17 00:00:00 2001 From: AdrianSosic Date: Tue, 7 Oct 2025 11:45:21 +0200 Subject: [PATCH 4/4] Use tuples for sequences of validators https://github.com/python/mypy/issues/20013 --- baybe/parameters/substance.py | 2 +- baybe/transformations/composite.py | 6 +++--- benchmarks/definition/regression.py | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/baybe/parameters/substance.py b/baybe/parameters/substance.py index 061fcf4508..892fe50112 100644 --- a/baybe/parameters/substance.py +++ b/baybe/parameters/substance.py @@ -44,7 +44,7 @@ class SubstanceParameter(_DiscreteLabelLikeParameter): converter=lambda x: dict(sorted(x.items())), validator=deep_mapping( mapping_validator=min_len(2), - key_validator=[instance_of(str), min_len(1)], + key_validator=(instance_of(str), min_len(1)), ), ) """A mapping that provides the SMILES strings for all available parameter values.""" diff --git a/baybe/transformations/composite.py b/baybe/transformations/composite.py index 3e379ba9ba..09ed2f50d2 100644 --- a/baybe/transformations/composite.py +++ b/baybe/transformations/composite.py @@ -7,7 +7,7 @@ from typing import TYPE_CHECKING, Any from attrs import define, field -from attrs.validators import and_, deep_iterable, instance_of, max_len, min_len +from attrs.validators import deep_iterable, instance_of, max_len, min_len from typing_extensions import override from baybe.transformations.base import Transformation @@ -69,7 +69,7 @@ class AdditiveTransformation(Transformation): transformations: tuple[Transformation, Transformation] = field( converter=to_tuple, validator=deep_iterable( - iterable_validator=and_(min_len(2), max_len(2)), + iterable_validator=(min_len(2), max_len(2)), member_validator=instance_of(Transformation), ), ) @@ -94,7 +94,7 @@ class MultiplicativeTransformation(Transformation): transformations: tuple[Transformation, Transformation] = field( converter=to_tuple, validator=deep_iterable( - iterable_validator=and_(min_len(2), max_len(2)), + iterable_validator=(min_len(2), max_len(2)), member_validator=instance_of(Transformation), ), ) diff --git a/benchmarks/definition/regression.py b/benchmarks/definition/regression.py index aade535aae..98b9746cc6 100644 --- a/benchmarks/definition/regression.py +++ b/benchmarks/definition/regression.py @@ -1,7 +1,7 @@ """Regression benchmark configuration.""" from attrs import define, field -from attrs.validators import and_, deep_iterable, ge, instance_of, le +from attrs.validators import deep_iterable, ge, instance_of, le from baybe.utils.validation import finite_float from benchmarks.definition.base import Benchmark, BenchmarkSettings @@ -17,7 +17,7 @@ class RegressionBenchmarkSettings(BenchmarkSettings): max_n_train_points: int = field(validator=instance_of(int)) """Maximum number of training points to consider.""" - noise_std: float = field(converter=float, validator=and_(finite_float, ge(0.0))) + noise_std: float = field(converter=float, validator=[finite_float, ge(0.0)]) """Standard deviation of noise to add to the data.""" @@ -27,7 +27,7 @@ class TransferLearningRegressionBenchmarkSettings(RegressionBenchmarkSettings): source_fractions: tuple[float, ...] = field( validator=deep_iterable( - member_validator=and_(ge(0.0), le(1.0)), + member_validator=(ge(0.0), le(1.0)), iterable_validator=instance_of(tuple), ) )