diff --git a/swh/model/model.py b/swh/model/model.py index c4adfae6a128c95f15debe2fbac2651d6e793863..61eecdbebc8e5e993b1893efd0bb41aa480d5bc2 100644 --- a/swh/model/model.py +++ b/swh/model/model.py @@ -23,6 +23,8 @@ import hashlib from typing import Any, Dict, Iterable, List, Optional, Tuple, Type, TypeVar, Union import attr +from attr._make import _AndValidator +from attr.validators import and_ from attrs_strict import AttributeTypeError import dateutil.parser import iso8601 @@ -287,18 +289,29 @@ def optimized_validator(type_): return union_validator elif origin is ImmutableDict: return _immutable_dict_validator - else: - # No need to check dict or list. because they are converted to ImmutableDict - # and tuple respectively. - raise NotImplementedError(f"Type-checking {type_}") + # No need to check dict or list. because they are converted to ImmutableDict + # and tuple respectively. + raise NotImplementedError(f"Type-checking {type_}") def optimize_all_validators(cls, old_fields): """process validators to turn them into a faster version … eventually""" new_fields = [] for f in old_fields: - if f.validator is generic_type_validator: + validator = f.validator + if validator is generic_type_validator: validator = optimized_validator(f.type) + elif isinstance(validator, _AndValidator): + new_and = [] + for v in validator._validators: + if v is generic_type_validator: + v = optimized_validator(f.type) + new_and.append(v) + validator = and_(*new_and) + else: + validator = None + + if validator is not None: f = f.evolve(validator=validator) new_fields.append(f) return new_fields