diff --git a/Makefile b/Makefile index 9ef14155e..767ec8d9c 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ .PHONY: run-explorer run-tests run-linters build-ui build-python build-docker run-docker compose-up -version="0.75.2" +version="0.75.3" run-explorer: @echo "Running explorer API server..." # open "http://localhost:8000/static/index.html" || true diff --git a/cognite/neat/_version.py b/cognite/neat/_version.py index cad20c4e2..9ee5368b7 100644 --- a/cognite/neat/_version.py +++ b/cognite/neat/_version.py @@ -1 +1 @@ -__version__ = "0.75.2" +__version__ = "0.75.3" diff --git a/cognite/neat/rules/importers/_dms2rules.py b/cognite/neat/rules/importers/_dms2rules.py index ee69c96fa..2f6e6009a 100644 --- a/cognite/neat/rules/importers/_dms2rules.py +++ b/cognite/neat/rules/importers/_dms2rules.py @@ -152,6 +152,7 @@ def to_rules( class_=class_entity, property_=prop_id, description=prop.description, + name=prop.name, value_type=cast(ViewPropEntity | DMSValueType, direct_value_type), relation="direct", nullable=container_prop.nullable, @@ -169,6 +170,7 @@ def to_rules( class_=ClassEntity(prefix=view.space, suffix=view.external_id, version=view.version), property_=prop_id, description=prop.description, + name=prop.name, value_type=cast(ViewPropEntity | DMSValueType, container_prop.type._type), nullable=container_prop.nullable, is_list=container_prop.type.is_list, @@ -187,6 +189,7 @@ def to_rules( property_=prop_id, relation="multiedge", description=prop.description, + name=prop.name, value_type=view_entity, view=ViewEntity.from_id(view.as_id()), view_property=prop_id, diff --git a/cognite/neat/rules/models/rules/_dms_architect_rules.py b/cognite/neat/rules/models/rules/_dms_architect_rules.py index 82bc4b36c..36c71862a 100644 --- a/cognite/neat/rules/models/rules/_dms_architect_rules.py +++ b/cognite/neat/rules/models/rules/_dms_architect_rules.py @@ -266,6 +266,7 @@ def from_view(cls, view: dm.ViewApply, data_model_view_ids: set[dm.ViewId]) -> " class_=ClassEntity(prefix=view.space, suffix=view.external_id), view=ViewType(prefix=view.space, suffix=view.external_id, version=view.version), description=view.description, + name=view.name, implements=[ ViewType(prefix=parent.space, suffix=parent.external_id, version=parent.version) for parent in view.implements @@ -802,6 +803,8 @@ def _create_views_with_node_types( ), source=source, direction="outwards", + name=prop.name, + description=prop.description, ) elif prop.container and prop.container_property and prop.view_property: container_prop_identifier = prop.container_property @@ -816,6 +819,8 @@ def _create_views_with_node_types( view_property = dm.MappedPropertyApply( container=prop.container.as_id(default_space), container_property_identifier=container_prop_identifier, + name=prop.name, + description=prop.description, **extra_args, ) elif prop.view and prop.view_property and prop.relation == "multiedge": @@ -842,6 +847,8 @@ def _create_views_with_node_types( type=edge_type, source=source, direction="outwards", + name=prop.name, + description=prop.description, ) elif prop.view and prop.view_property and prop.relation == "reversedirect": if isinstance(prop.value_type, ViewPropEntity): @@ -880,6 +887,8 @@ def _create_views_with_node_types( type=edge_type, source=source, direction="inwards", + name=prop.name, + description=prop.description, ) else: args: dict[str, Any] = dict( @@ -905,8 +914,8 @@ def _create_views_with_node_types( continue else: continue - prop_name = prop.view_property - view.properties[prop_name] = view_property + prop_id = prop.view_property + view.properties[prop_id] = view_property node_types = dm.NodeApplyList([]) parent_views = {parent for view in views for parent in view.implements or []} @@ -971,10 +980,10 @@ def _create_containers( else: type_cls = dm.DirectRelation - prop_name = prop.container_property + prop_id = prop.container_property if type_cls is dm.DirectRelation: - container.properties[prop_name] = dm.ContainerProperty( + container.properties[prop_id] = dm.ContainerProperty( type=dm.DirectRelation(), nullable=prop.nullable if prop.nullable is not None else True, default_value=prop.default, @@ -984,7 +993,7 @@ def _create_containers( else: type_: CognitePropertyType type_ = type_cls(is_list=prop.is_list or False) - container.properties[prop_name] = dm.ContainerProperty( + container.properties[prop_id] = dm.ContainerProperty( type=type_, nullable=prop.nullable if prop.nullable is not None else True, default_value=prop.default, diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index d33f5cf21..28987e156 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -15,6 +15,10 @@ Changes are grouped as follows: - `Fixed` for any bug fixes. - `Security` in case of vulnerabilities. +## [0.75.3] - 23-05-24 +### Fixed +- Names and descriptions were not considered for views and view properties + ## [0.75.2] - 23-05-24 ### Fixed - Allowing that multiple View properties can map to the same Container property diff --git a/docs/artifacts/rules/cdf-dms-architect-alice.xlsx b/docs/artifacts/rules/cdf-dms-architect-alice.xlsx index f46a3a1d3..253741cc0 100644 Binary files a/docs/artifacts/rules/cdf-dms-architect-alice.xlsx and b/docs/artifacts/rules/cdf-dms-architect-alice.xlsx differ diff --git a/pyproject.toml b/pyproject.toml index c1e9965e2..482b14a36 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "cognite-neat" -version = "0.75.2" +version = "0.75.3" readme = "README.md" description = "Knowledge graph transformation" authors = [ diff --git a/tests/tests_unit/rules/test_exporters/test_rules2dms.py b/tests/tests_unit/rules/test_exporters/test_rules2dms.py index 206b168b2..9014ee1b9 100644 --- a/tests/tests_unit/rules/test_exporters/test_rules2dms.py +++ b/tests/tests_unit/rules/test_exporters/test_rules2dms.py @@ -12,6 +12,15 @@ class TestDMSExporter: + def test_export_dms_schema_has_names_description(self, alice_rules: DMSRules) -> None: + exporter = DMSExporter() + schema = exporter.export(alice_rules) + + assert schema.views[0].name == "Generating Unit" + assert schema.views[0].description == "An asset that is creating power" + assert schema.views[0].properties["activePower"].name == "active power" + assert schema.views[0].properties["activePower"].description == "Active power of generating unit" + def test_export_dms_schema_to_zip(self, alice_rules: DMSRules, tmp_path: Path) -> None: exporter = DMSExporter() schema = exporter.export(alice_rules) diff --git a/tests/tests_unit/rules/test_importers/test_dms_importer.py b/tests/tests_unit/rules/test_importers/test_dms_importer.py index 820308a7c..8995e670f 100644 --- a/tests/tests_unit/rules/test_importers/test_dms_importer.py +++ b/tests/tests_unit/rules/test_importers/test_dms_importer.py @@ -18,6 +18,10 @@ def test_import_with_direct_relation_none(self) -> None: dms_rules = cast(DMSRules, rules) dump_dms = dms_rules.model_dump() assert dump_dms["properties"][0]["value_type"] == "#N/A" + assert dump_dms["properties"][0]["name"] == "direct" + assert dump_dms["properties"][0]["description"] == "Direction Relation" + assert dump_dms["views"][0]["name"] == "OneView" + assert dump_dms["views"][0]["description"] == "One View" info_rules = dms_rules.as_information_architect_rules() dump_info = info_rules.model_dump() @@ -40,11 +44,7 @@ def test_import_with_direct_relation_none(self) -> None: dm.ContainerApply( space="neat", external_id="container", - properties={ - "direct": dm.ContainerProperty( - type=dm.DirectRelation(), - ) - }, + properties={"direct": dm.ContainerProperty(type=dm.DirectRelation())}, ) ) SCHEMA_WITH_DIRECT_RELATION_NONE.views.append( @@ -52,9 +52,15 @@ def test_import_with_direct_relation_none(self) -> None: space="neat", external_id="OneView", version="1", + name="OneView", + description="One View", properties={ "direct": dm.MappedPropertyApply( - container=dm.ContainerId("neat", "container"), container_property_identifier="direct", source=None + container=dm.ContainerId("neat", "container"), + container_property_identifier="direct", + source=None, + name="direct", + description="Direction Relation", ) }, )