diff --git a/cognite_toolkit/_cdf_tk/client/resource_classes/data_product_version.py b/cognite_toolkit/_cdf_tk/client/resource_classes/data_product_version.py index 7ef2efb628..11bfdb471f 100644 --- a/cognite_toolkit/_cdf_tk/client/resource_classes/data_product_version.py +++ b/cognite_toolkit/_cdf_tk/client/resource_classes/data_product_version.py @@ -7,7 +7,7 @@ ResponseResource, UpdatableRequestResource, ) -from cognite_toolkit._cdf_tk.client.identifiers import DataProductVersionId, RuleSetVersionId, SemanticVersion +from cognite_toolkit._cdf_tk.client.identifiers import DataProductVersionId, SemanticVersion from cognite_toolkit._cdf_tk.constants import SPACE_FORMAT_PATTERN SpaceId = Annotated[str, Field(pattern=SPACE_FORMAT_PATTERN, max_length=43)] @@ -30,8 +30,15 @@ class DataProductVersionTerms(BaseModelObject): limitations: str | None = None +class RuleSetVersionRef(BaseModelObject): + """Wire representation of a RuleSetVersionReference as defined in the API spec.""" + + external_id: str + version: SemanticVersion + + class DataProductVersionQuality(BaseModelObject): - rules: list[RuleSetVersionId] = Field(default_factory=list) + rules: list[RuleSetVersionRef] = Field(default_factory=list) class DataProductVersion(BaseModelObject): diff --git a/cognite_toolkit/_cdf_tk/resource_ios/_resource_ios/data_product_version.py b/cognite_toolkit/_cdf_tk/resource_ios/_resource_ios/data_product_version.py index e6657de6e6..109d203b5f 100644 --- a/cognite_toolkit/_cdf_tk/resource_ios/_resource_ios/data_product_version.py +++ b/cognite_toolkit/_cdf_tk/resource_ios/_resource_ios/data_product_version.py @@ -58,10 +58,10 @@ def get_dependent_items(cls, item: dict) -> Iterable[tuple[type[ResourceIO], Has if "dataProductExternalId" in item: yield DataProductIO, ExternalId(external_id=item["dataProductExternalId"]) for rule in (item.get("quality") or {}).get("rules", []): - if "ruleSetExternalId" in rule and "version" in rule: + if "externalId" in rule and "version" in rule: yield ( RuleSetVersionIO, - RuleSetVersionId(rule_set_external_id=rule["ruleSetExternalId"], version=rule["version"]), + RuleSetVersionId(rule_set_external_id=rule["externalId"], version=rule["version"]), ) @classmethod diff --git a/cognite_toolkit/_cdf_tk/yaml_classes/data_product_version.py b/cognite_toolkit/_cdf_tk/yaml_classes/data_product_version.py index 2b5c891af1..d207032bea 100644 --- a/cognite_toolkit/_cdf_tk/yaml_classes/data_product_version.py +++ b/cognite_toolkit/_cdf_tk/yaml_classes/data_product_version.py @@ -38,11 +38,11 @@ class DataProductVersionTerms(BaseModelResource): class DataProductVersionQualityRule(BaseModelResource): - rule_set_external_id: str = Field(description="External ID of the referenced rule set.") + external_id: str = Field(description="External ID of the referenced rule set.") version: SemanticVersion = Field(description="Version of the referenced rule set.") def as_id(self) -> RuleSetVersionId: - return RuleSetVersionId(rule_set_external_id=self.rule_set_external_id, version=self.version) + return RuleSetVersionId(rule_set_external_id=self.external_id, version=self.version) class DataProductVersionQuality(BaseModelResource): diff --git a/tests/test_unit/test_cdf_tk/test_cruds/test_data_product_version.py b/tests/test_unit/test_cdf_tk/test_cruds/test_data_product_version.py index 19ed0648d0..686eb65fa6 100644 --- a/tests/test_unit/test_cdf_tk/test_cruds/test_data_product_version.py +++ b/tests/test_unit/test_cdf_tk/test_cruds/test_data_product_version.py @@ -117,6 +117,20 @@ def test_as_update_replace_empty_cdf_is_all_add(self) -> None: assert update["update"]["views"] == {"add": [self._v_cdm_3d]} + def test_as_update_quality_always_omitted(self) -> None: + """quality is create-only (not in DataProductVersionPatch) so it must never appear in update payloads.""" + request = DataProductVersionRequest.model_validate( + { + "dataProductExternalId": "my-product", + "version": "1.0.0", + "quality": {"rules": [{"externalId": "my-ruleset", "version": "1.0.0"}]}, + } + ) + + for mode in ("patch", "replace"): + update = request.as_update(mode=mode) # type: ignore[arg-type] + assert "quality" not in update["update"], f"quality must not appear in {mode} update payload" + def test_as_update_replace_view_removed_locally_is_ignored(self) -> None: """View refs are immutable/append-only in the API — a view present in CDF but absent locally must not generate a remove operation."""