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
Original file line number Diff line number Diff line change
Expand Up @@ -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)]
Expand All @@ -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):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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."""
Expand Down
Loading