Skip to content

Commit

Permalink
Neat 192 description and names are not handled well when creating dms…
Browse files Browse the repository at this point in the history
… schema (#412)

Names and descriptions were not considered for views and view properties
  • Loading branch information
nikokaoja committed Apr 24, 2024
1 parent 8172ce4 commit 3b22e12
Show file tree
Hide file tree
Showing 9 changed files with 45 additions and 14 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion cognite/neat/_version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.75.2"
__version__ = "0.75.3"
3 changes: 3 additions & 0 deletions cognite/neat/rules/importers/_dms2rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand Down
19 changes: 14 additions & 5 deletions cognite/neat/rules/models/rules/_dms_architect_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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":
Expand All @@ -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):
Expand Down Expand Up @@ -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(
Expand All @@ -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 []}
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand Down
4 changes: 4 additions & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Binary file modified docs/artifacts/rules/cdf-dms-architect-alice.xlsx
Binary file not shown.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -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 = [
Expand Down
9 changes: 9 additions & 0 deletions tests/tests_unit/rules/test_exporters/test_rules2dms.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
18 changes: 12 additions & 6 deletions tests/tests_unit/rules/test_importers/test_dms_importer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -40,21 +44,23 @@ 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(
dm.ViewApply(
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",
)
},
)
Expand Down

0 comments on commit 3b22e12

Please sign in to comment.