Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🐛 Container requires other container #1027

Merged
merged 8 commits into from
Mar 4, 2025
Merged
Show file tree
Hide file tree
Changes from 4 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
10 changes: 5 additions & 5 deletions cognite/neat/_rules/models/dms/_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from collections import Counter, defaultdict
from collections.abc import Mapping
from functools import lru_cache
from typing import ClassVar

from cognite.client import data_modeling as dm
from cognite.client.data_classes.data_modeling import ContainerList, ViewId, ViewList
Expand Down Expand Up @@ -54,10 +53,6 @@ class DMSValidation:
"""This class does all the validation of the DMS rules that have dependencies between
components."""

# When checking for changes extension=addition, we need to check if the new view has changed.
# For example, changing the filter is allowed, but changing the properties is not.
changeable_view_attributes: ClassVar[set[str]] = {"filter"}

def __init__(
self,
rules: DMSRules,
Expand Down Expand Up @@ -91,6 +86,11 @@ def imported_views_and_containers_ids(
imported_views.add(prop.view)
view_with_properties.add(prop.view)

for container in self._containers or []:
for required in container.constraint or []:
if required not in existing_containers:
imported_containers.add(required)

if include_views_with_no_properties:
extra_views = existing_views - view_with_properties
imported_views.update({view for view in extra_views})
Expand Down
6 changes: 5 additions & 1 deletion cognite/neat/_rules/models/entities/_wrapped.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,11 @@ def as_dms_filter(self, default: Any | None = None) -> dm.filters.Filter:
@classmethod
def from_dms_filter(cls, filter: dm.Filter) -> "DMSFilter":
dumped = filter.dump()
if (body := dumped.get(dm.filters.Equals._filter_name)) and (value := body.get("value")):
if (
(body := dumped.get(dm.filters.Equals._filter_name))
and (value := body.get("value"))
and isinstance(value, dict)
):
space = value.get("space")
external_id = value.get("externalId")
if space is not None and external_id is not None:
Expand Down
31 changes: 30 additions & 1 deletion tests/tests_unit/rules/test_models/test_dms_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
DMSValidation,
)
from cognite.neat._rules.models.dms._exporter import _DMSExporter
from cognite.neat._rules.models.entities._single_value import UnknownEntity, ViewEntity
from cognite.neat._rules.models.entities._single_value import ContainerEntity, UnknownEntity, ViewEntity
from cognite.neat._rules.transformers import (
DMSToInformation,
InformationToDMS,
Expand Down Expand Up @@ -1779,3 +1779,32 @@ def test_edge_types_by_view_property_id(
actual = exporter._edge_types_by_view_property_id(properties_by_view_id, view_by_id)

assert actual == expected_edge_types_by_view_property_id


class TestDMSValidation:
@pytest.mark.parametrize(
"input_rules, expected_views, expected_containers",
[
pytest.param(
DMSInputRules(
DMSInputMetadata("my_space", "MyModel", "Me", "v1"),
properties=[
DMSInputProperty("MyView", "name", "text", container="MyContainer", container_property="name"),
],
views=[DMSInputView("MyView")],
containers=[DMSInputContainer("MyContainer", constraint="cdf_cdm:CogniteDescribable")],
),
set(),
{ContainerEntity(space="cdf_cdm", externalId="CogniteDescribable")},
id="Container requiring other container",
)
],
)
def test_imported_views_and_containers_ids(
self, input_rules: DMSInputRules, expected_views: set[ViewEntity], expected_containers: set[ContainerEntity]
) -> None:
validation = DMSValidation(input_rules.as_verified_rules())
actual_views, actual_containers = validation.imported_views_and_containers_ids()

assert actual_views == expected_views
assert actual_containers == expected_containers
5 changes: 5 additions & 0 deletions tests/tests_unit/rules/test_models/test_wrapped_entities.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,11 @@ def test_load(self, cls_: type[WrappedEntity], raw: Any, expected: WrappedEntity
]
),
),
pytest.param(
dm.filters.Equals(["govern-space", "Property", "type"], "Input"),
RawFilter(filter='{"equals": {"property": ["govern-space", "Property", "type"], "value": "Input"}}'),
id="Equal filter on property",
),
],
)
def test_from_dms_filter(self, filter_: dm.Filter, expected: DMSFilter) -> None:
Expand Down