Skip to content
Open
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
7 changes: 5 additions & 2 deletions tests/resolver/test_lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import pytest
from deepdiff import DeepDiff
from deepdiff.operator import BaseOperator
from variantlib.errors import ConfigurationError
from variantlib.errors import ValidationError
from variantlib.models.variant import VariantDescription
from variantlib.models.variant import VariantFeature
Expand Down Expand Up @@ -609,6 +608,7 @@ def test_sort_and_filter_supported_variants_validation_errors(
sort_and_filter_supported_variants(
vdescs=vdescs,
supported_vprops=vprops, # type: ignore[arg-type]
namespace_priorities=["a"],
feature_priorities=feature_priorities,
)

Expand All @@ -617,8 +617,11 @@ def test_sort_and_filter_supported_variants_validation_errors_with_no_priority(
vdescs: list[VariantDescription], vprops: list[VariantProperty]
) -> None:
# This one specifies no ordering/priority => can't sort
with pytest.raises(ConfigurationError, match="The variant environment needs"):
with pytest.raises(
ValidationError, match=r"Missing namespace_priorities for namespaces"
):
sort_and_filter_supported_variants(
vdescs=vdescs,
supported_vprops=vprops,
namespace_priorities=[],
)
10 changes: 4 additions & 6 deletions tests/resolver/test_sorting.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from typing import Any

import pytest
from variantlib.errors import ConfigurationError
from variantlib.errors import ValidationError
from variantlib.models.variant import VariantDescription
from variantlib.models.variant import VariantFeature
Expand Down Expand Up @@ -111,21 +110,20 @@ def test_get_namespace_priorities() -> None:
def test_negative_get_namespace_priorities() -> None:
vprop = VariantProperty(namespace="omnicorp", feature="no_exist", value="value")

assert get_namespace_priorities(vprop, None) == sys.maxsize
assert get_namespace_priorities(vprop, []) == sys.maxsize
assert get_namespace_priorities(vprop, ["other_corp"]) == sys.maxsize


@pytest.mark.parametrize(
("vprop", "namespace_priorities"),
[
("not a `VariantProperty`", None),
("not a `VariantProperty`", []),
(VariantProperty("a", "b", "c"), "not a list or None"),
(VariantProperty("a", "b", "c"), [{"not a str": True}]),
],
)
def test_get_namespace_priorities_validation_error(
vprop: VariantProperty, namespace_priorities: list[str] | None
vprop: VariantProperty, namespace_priorities: list[str]
) -> None:
with pytest.raises(ValidationError):
get_namespace_priorities(vprop=vprop, namespace_priorities=namespace_priorities)
Expand Down Expand Up @@ -208,10 +206,10 @@ def test_sort_variant_properties_validation_error(


def test_sort_variant_properties_configuration_error() -> None:
with pytest.raises(ConfigurationError):
with pytest.raises(ValidationError):
sort_variant_properties(
vprops=[VariantProperty("a", "b", "c"), VariantProperty("x", "y", "z")],
namespace_priorities=None,
namespace_priorities=[],
feature_priorities=None,
property_priorities=None,
)
Expand Down
2 changes: 1 addition & 1 deletion variantlib/resolver/lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ def filter_variants(
def sort_and_filter_supported_variants(
vdescs: list[VariantDescription],
supported_vprops: list[VariantProperty],
namespace_priorities: list[VariantNamespace] | None = None,
namespace_priorities: list[VariantNamespace],
feature_priorities: dict[VariantNamespace, list[VariantFeatureName]] | None = None,
property_priorities: dict[
VariantNamespace, dict[VariantFeatureName, list[VariantFeatureValue]]
Expand Down
27 changes: 5 additions & 22 deletions variantlib/resolver/sorting.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
from itertools import chain
from itertools import groupby

from variantlib.errors import ConfigurationError
from variantlib.errors import ValidationError
from variantlib.models.variant import VariantDescription
from variantlib.models.variant import VariantProperty
Expand Down Expand Up @@ -79,7 +78,7 @@ def get_feature_priorities(

def get_namespace_priorities(
vprop: VariantProperty,
namespace_priorities: list[VariantNamespace] | None,
namespace_priorities: list[VariantNamespace],
) -> int:
"""
Get the namespace priority of a `VariantProperty` object.
Expand All @@ -90,8 +89,6 @@ def get_namespace_priorities(
"""
validate_type(vprop, VariantProperty)

if namespace_priorities is None:
return sys.maxsize
validate_type(namespace_priorities, list[str])

# if not present push at the end
Expand All @@ -103,7 +100,7 @@ def get_namespace_priorities(

def sort_variant_properties(
vprops: list[VariantProperty],
namespace_priorities: list[VariantNamespace] | None,
namespace_priorities: list[VariantNamespace],
feature_priorities: dict[VariantNamespace, list[VariantFeatureName]] | None = None,
property_priorities: dict[
VariantNamespace, dict[VariantFeatureName, list[VariantFeatureValue]]
Expand All @@ -120,9 +117,7 @@ def sort_variant_properties(
:return: Sorted list of `VariantProperty` objects.
"""
validate_type(vprops, list[VariantProperty])

if namespace_priorities is not None:
validate_type(namespace_priorities, list[VariantNamespace])
validate_type(namespace_priorities, list[VariantNamespace])

if feature_priorities is not None:
validate_type(
Expand All @@ -134,22 +129,10 @@ def sort_variant_properties(
dict[VariantNamespace, dict[VariantFeatureName, list[VariantFeatureValue]]],
)

error_message = (
"The variant environment needs to be (re)configured, please execute "
"`variantlib config setup` and re-run your command."
)

found_namespaces = {vprop.namespace for vprop in vprops}

if namespace_priorities is None or not namespace_priorities:
if len(found_namespaces) > 1:
raise ConfigurationError(error_message)

# if there is only one namespace, use it as the default
namespace_priorities = list(found_namespaces)

elif len(found_namespaces.difference(namespace_priorities)) > 0:
raise ConfigurationError(error_message)
if missing := found_namespaces.difference(namespace_priorities):
raise ValidationError(f"Missing namespace_priorities for namespaces {missing}")

# 1. Reorder properties according to namespace priorities.
sorted_by_namespace = sorted(
Expand Down
Loading