Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions variantlib/models/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

from dataclasses import dataclass
from dataclasses import field
from operator import attrgetter

from variantlib.constants import VALIDATION_FEATURE_REGEX
from variantlib.constants import VALIDATION_NAMESPACE_REGEX
Expand Down Expand Up @@ -67,7 +66,7 @@ class ProviderConfig(BaseModel):
[
lambda v: validate_type(v, list[VariantFeatureConfig]),
lambda v: validate_list_min_len(v, 1),
lambda v: validate_list_all_unique(v, key=attrgetter("name")),
lambda v: validate_list_all_unique(v, keys=["name"]),
],
value=val,
),
Expand Down
16 changes: 10 additions & 6 deletions variantlib/models/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,21 +32,25 @@ def validate_list_min_len(values: list, min_length: int) -> None:
)


def validate_list_all_unique(values: list[Any], key: None | Callable = None) -> None:
def validate_list_all_unique(values: list[Any], keys: list[str] | None = None) -> None:
"""
Validate that all elements in the list are unique.
Raises a ValueError if duplicates are found.
"""
seen = set()

for value in values:
if key is not None:
value = key(value) # noqa: PLW2901
_value = value

if value in seen:
raise ValidationError(f"Duplicate value found: '{value}' in list.")
if keys is not None:
_value = tuple([getattr(value, key) for key in keys])
if len(_value) == 1:
_value = _value[0]

seen.add(value)
if _value in seen:
raise ValidationError(f"Duplicate value found: '{_value}' in list.")

seen.add(_value)


def validate_or(validators: list[Callable], value: Any) -> None:
Expand Down
3 changes: 1 addition & 2 deletions variantlib/models/variant.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
from dataclasses import asdict
from dataclasses import dataclass
from dataclasses import field
from operator import attrgetter

from variantlib.constants import VALIDATION_FEATURE_REGEX
from variantlib.constants import VALIDATION_NAMESPACE_REGEX
Expand Down Expand Up @@ -165,7 +164,7 @@ class VariantDescription(BaseModel):
lambda v: validate_type(v, list[VariantProperty]),
lambda v: validate_list_min_len(v, 1),
lambda v: validate_list_all_unique(
v, key=attrgetter("feature_hash")
v, keys=["namespace", "feature"]
),
],
value=val,
Expand Down
Loading