From 4259fef30fdf4f9f2f210a77f1982297b482a119 Mon Sep 17 00:00:00 2001 From: yenkins-admin <5391010+yenkins-admin@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:44:59 +0000 Subject: [PATCH] feat(gooddata-sdk): [AUTO] Add DashboardArbitraryAttributeFilter and DashboardMatchAttributeFilter --- .../src/gooddata_sdk/compute/model/filter.py | 22 ++++++++++++++--- .../compute_model/test_attribute_filters.py | 24 +++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/packages/gooddata-sdk/src/gooddata_sdk/compute/model/filter.py b/packages/gooddata-sdk/src/gooddata_sdk/compute/model/filter.py index 94171f156..2ceafbc6b 100644 --- a/packages/gooddata-sdk/src/gooddata_sdk/compute/model/filter.py +++ b/packages/gooddata-sdk/src/gooddata_sdk/compute/model/filter.py @@ -96,11 +96,17 @@ def _to_identifier(val: Union[ObjId, str]) -> Union[afm_models.AfmLocalIdentifie class AttributeFilter(Filter): - def __init__(self, label: Union[ObjId, str, Attribute], values: list[str] | None = None) -> None: + def __init__( + self, + label: Union[ObjId, str, Attribute], + values: list[str] | None = None, + uses_arbitrary_values: bool | None = None, + ) -> None: super().__init__() self._label = _extract_id_or_local_id(label) self._values = values or [] + self._uses_arbitrary_values = uses_arbitrary_values @property def label(self) -> Union[ObjId, str]: @@ -114,6 +120,10 @@ def label(self, label: Union[ObjId, str]) -> None: def values(self) -> list[str]: return self._values + @property + def uses_arbitrary_values(self) -> bool | None: + return self._uses_arbitrary_values + def is_noop(self) -> bool: return False @@ -128,7 +138,10 @@ class PositiveAttributeFilter(AttributeFilter): def as_api_model(self) -> afm_models.PositiveAttributeFilter: label_id = _to_identifier(self._label) elements = afm_models.AttributeFilterElements(values=self.values) - body = PositiveAttributeFilterBody(label=label_id, _in=elements, _check_type=False) + kwargs: dict[str, Any] = {} + if self._uses_arbitrary_values is not None: + kwargs["uses_arbitrary_values"] = self._uses_arbitrary_values + body = PositiveAttributeFilterBody(label=label_id, _in=elements, _check_type=False, **kwargs) return afm_models.PositiveAttributeFilter(body, _check_type=False) def description(self, labels: dict[str, str], format_locale: str | None = None) -> str: @@ -144,7 +157,10 @@ def is_noop(self) -> bool: def as_api_model(self) -> afm_models.NegativeAttributeFilter: label_id = _to_identifier(self._label) elements = afm_models.AttributeFilterElements(values=self.values) - body = NegativeAttributeFilterBody(label=label_id, not_in=elements, _check_type=False) + kwargs: dict[str, Any] = {} + if self._uses_arbitrary_values is not None: + kwargs["uses_arbitrary_values"] = self._uses_arbitrary_values + body = NegativeAttributeFilterBody(label=label_id, not_in=elements, _check_type=False, **kwargs) return afm_models.NegativeAttributeFilter(body) def description(self, labels: dict[str, str], format_locale: str | None = None) -> str: diff --git a/packages/gooddata-sdk/tests/compute_model/test_attribute_filters.py b/packages/gooddata-sdk/tests/compute_model/test_attribute_filters.py index e36fb8dea..29b99f97d 100644 --- a/packages/gooddata-sdk/tests/compute_model/test_attribute_filters.py +++ b/packages/gooddata-sdk/tests/compute_model/test_attribute_filters.py @@ -188,3 +188,27 @@ def test_match_filter_inequality_different_case_sensitive(): f1 = MatchAttributeFilter(label="test", literal="foo", match_type="CONTAINS") f2 = MatchAttributeFilter(label="test", literal="foo", match_type="CONTAINS", case_sensitive=True) assert f1 != f2 + + +def test_positive_filter_uses_arbitrary_values(): + f = PositiveAttributeFilter(label="local_id", values=["val1"], uses_arbitrary_values=True) + api_dict = f.as_api_model().to_dict() + assert api_dict["positive_attribute_filter"]["uses_arbitrary_values"] is True + + +def test_positive_filter_uses_arbitrary_values_not_set(): + f = PositiveAttributeFilter(label="local_id", values=["val1"]) + api_dict = f.as_api_model().to_dict() + assert "uses_arbitrary_values" not in api_dict["positive_attribute_filter"] + + +def test_negative_filter_uses_arbitrary_values(): + f = NegativeAttributeFilter(label="local_id", values=["val1"], uses_arbitrary_values=True) + api_dict = f.as_api_model().to_dict() + assert api_dict["negative_attribute_filter"]["uses_arbitrary_values"] is True + + +def test_negative_filter_uses_arbitrary_values_not_set(): + f = NegativeAttributeFilter(label="local_id", values=["val1"]) + api_dict = f.as_api_model().to_dict() + assert "uses_arbitrary_values" not in api_dict["negative_attribute_filter"]