From 24310a80b306a9aa727b8d4f9216bd2015faaca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Tue, 18 Nov 2025 18:03:09 +0100 Subject: [PATCH 1/4] Make `namespace_priorities` parameter non-optional MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Górny --- tests/resolver/test_lib.py | 2 ++ tests/resolver/test_sorting.py | 7 +++---- variantlib/resolver/lib.py | 2 +- variantlib/resolver/sorting.py | 12 ++++-------- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/tests/resolver/test_lib.py b/tests/resolver/test_lib.py index 80fe1c1..2505cfe 100644 --- a/tests/resolver/test_lib.py +++ b/tests/resolver/test_lib.py @@ -609,6 +609,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, ) @@ -621,4 +622,5 @@ def test_sort_and_filter_supported_variants_validation_errors_with_no_priority( sort_and_filter_supported_variants( vdescs=vdescs, supported_vprops=vprops, + namespace_priorities=[], ) diff --git a/tests/resolver/test_sorting.py b/tests/resolver/test_sorting.py index 9b17338..d0befdd 100644 --- a/tests/resolver/test_sorting.py +++ b/tests/resolver/test_sorting.py @@ -111,7 +111,6 @@ 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 @@ -119,13 +118,13 @@ def test_negative_get_namespace_priorities() -> None: @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) @@ -211,7 +210,7 @@ def test_sort_variant_properties_configuration_error() -> None: with pytest.raises(ConfigurationError): sort_variant_properties( vprops=[VariantProperty("a", "b", "c"), VariantProperty("x", "y", "z")], - namespace_priorities=None, + namespace_priorities=[], feature_priorities=None, property_priorities=None, ) diff --git a/variantlib/resolver/lib.py b/variantlib/resolver/lib.py index 7cc00a8..f81daf4 100644 --- a/variantlib/resolver/lib.py +++ b/variantlib/resolver/lib.py @@ -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]] diff --git a/variantlib/resolver/sorting.py b/variantlib/resolver/sorting.py index ec44fbe..5796a6b 100644 --- a/variantlib/resolver/sorting.py +++ b/variantlib/resolver/sorting.py @@ -79,7 +79,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. @@ -90,8 +90,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 @@ -103,7 +101,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]] @@ -120,9 +118,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( @@ -141,7 +137,7 @@ def sort_variant_properties( found_namespaces = {vprop.namespace for vprop in vprops} - if namespace_priorities is None or not namespace_priorities: + if not namespace_priorities: if len(found_namespaces) > 1: raise ConfigurationError(error_message) From 7d6febc965baf6ff57763036688fa493fe0a929a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Tue, 18 Nov 2025 18:04:56 +0100 Subject: [PATCH 2/4] Make no namespace-priorities an error with one namespace too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Górny --- variantlib/resolver/sorting.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/variantlib/resolver/sorting.py b/variantlib/resolver/sorting.py index 5796a6b..d734e2c 100644 --- a/variantlib/resolver/sorting.py +++ b/variantlib/resolver/sorting.py @@ -138,13 +138,8 @@ def sort_variant_properties( found_namespaces = {vprop.namespace for vprop in vprops} if 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 len(found_namespaces.difference(namespace_priorities)) > 0: raise ConfigurationError(error_message) # 1. Reorder properties according to namespace priorities. From 6b05406d0685f384efcd9d0f7cbff89eadea6b30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Tue, 18 Nov 2025 18:31:44 +0100 Subject: [PATCH 3/4] Remove obsolete `ConfigurationError` message for missing ns prios MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Namespace priorities are now part of package metadata, so remove the misleading error telling people to configure variantlib. Signed-off-by: Michał Górny --- tests/resolver/test_lib.py | 7 +++++-- tests/resolver/test_sorting.py | 3 +-- variantlib/resolver/sorting.py | 12 ++---------- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/tests/resolver/test_lib.py b/tests/resolver/test_lib.py index 2505cfe..c883775 100644 --- a/tests/resolver/test_lib.py +++ b/tests/resolver/test_lib.py @@ -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 @@ -618,7 +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 \{'omnicorp', " + r"'tyrell_corp'\}", + ): sort_and_filter_supported_variants( vdescs=vdescs, supported_vprops=vprops, diff --git a/tests/resolver/test_sorting.py b/tests/resolver/test_sorting.py index d0befdd..3966aeb 100644 --- a/tests/resolver/test_sorting.py +++ b/tests/resolver/test_sorting.py @@ -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 @@ -207,7 +206,7 @@ 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=[], diff --git a/variantlib/resolver/sorting.py b/variantlib/resolver/sorting.py index d734e2c..1de41d8 100644 --- a/variantlib/resolver/sorting.py +++ b/variantlib/resolver/sorting.py @@ -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 @@ -130,17 +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 not namespace_priorities: - raise ConfigurationError(error_message) - if 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( From af09d8cdee97fa6e5f0d6d5f94fbbd66c8990585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Tue, 18 Nov 2025 18:45:04 +0100 Subject: [PATCH 4/4] Fix test flakiness MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Górny --- tests/resolver/test_lib.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/resolver/test_lib.py b/tests/resolver/test_lib.py index c883775..2d32449 100644 --- a/tests/resolver/test_lib.py +++ b/tests/resolver/test_lib.py @@ -618,9 +618,7 @@ def test_sort_and_filter_supported_variants_validation_errors_with_no_priority( ) -> None: # This one specifies no ordering/priority => can't sort with pytest.raises( - ValidationError, - match=r"Missing namespace_priorities for namespaces \{'omnicorp', " - r"'tyrell_corp'\}", + ValidationError, match=r"Missing namespace_priorities for namespaces" ): sort_and_filter_supported_variants( vdescs=vdescs,