cognite-neat 0.103.0__py3-none-any.whl → 0.103.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of cognite-neat might be problematic. Click here for more details.

@@ -194,6 +194,8 @@ class DMSValidation:
194
194
  ) -> dict[ViewId, set[ViewId]]:
195
195
  @lru_cache
196
196
  def get_parents(child_view_id: ViewId) -> set[ViewId]:
197
+ if child_view_id not in all_views_by_id:
198
+ return set()
197
199
  child_view = all_views_by_id[child_view_id]
198
200
  parents = set(child_view.implements or [])
199
201
  for parent_id in child_view.implements or []:
@@ -201,16 +201,36 @@ class Entity(BaseModel, extra="ignore"):
201
201
  for field_name, field in self.model_fields.items()
202
202
  if (v := getattr(self, field_name)) is not None and field_name not in {"prefix", "suffix"}
203
203
  }
204
+ # We only remove the default values if all the fields are default
205
+ # For example, if we dump `cdf_cdm:CogniteAsset(version=v1)` and the default is `version=v1`,
206
+ # we should not remove it unless the space is `cdf_cdm`
207
+ to_delete: list[str] = []
208
+ is_removing_defaults = True
204
209
  if isinstance(defaults, dict):
205
210
  for key, value in defaults.items():
206
- if key in model_dump and model_dump[key] == value:
207
- del model_dump[key]
208
- # Sorting to ensure deterministic order
209
- args = ",".join(f"{k}={v}" for k, v in sorted(model_dump.items(), key=lambda x: x[0]))
210
- if self.prefix == Undefined or (isinstance(defaults, dict) and self.prefix == defaults.get("prefix")):
211
+ if key not in model_dump:
212
+ continue
213
+ if model_dump[key] == value:
214
+ to_delete.append(key)
215
+ elif isinstance(self, EdgeEntity):
216
+ # Exception is edge entity, then, we remove all the defaults we can.
217
+ continue
218
+ else:
219
+ # Not all fields are default. We should not remove any of them.
220
+ is_removing_defaults = False
221
+ break
222
+ if isinstance(defaults, dict) and self.prefix == defaults.get("prefix") and is_removing_defaults:
223
+ base_id = str(self.suffix)
224
+ elif self.prefix == Undefined:
211
225
  base_id = str(self.suffix)
212
226
  else:
227
+ is_removing_defaults = False
213
228
  base_id = f"{self.prefix}:{self.suffix!s}"
229
+ if is_removing_defaults:
230
+ for key in to_delete:
231
+ del model_dump[key]
232
+ # Sorting to ensure deterministic order
233
+ args = ",".join(f"{k}={v}" for k, v in sorted(model_dump.items(), key=lambda x: x[0]))
214
234
  if args:
215
235
  return f"{base_id}({args})"
216
236
  else:
@@ -13,6 +13,7 @@ from cognite.neat._rules.models.dms._rules import DMSRules
13
13
  from cognite.neat._rules.models.entities._single_value import ClassEntity, ViewEntity
14
14
  from cognite.neat._rules.models.information._rules import InformationRules
15
15
  from cognite.neat._session.exceptions import NeatSessionError
16
+ from cognite.neat._utils.io_ import to_directory_compatible
16
17
  from cognite.neat._utils.rdf_ import remove_namespace_from_uri
17
18
 
18
19
  from ._state import SessionState
@@ -106,16 +107,16 @@ class ShowDataModelAPI(ShowBaseAPI):
106
107
  rules = self._state.data_model.last_verified_rule[1]
107
108
 
108
109
  if isinstance(rules, DMSRules):
109
- di_graph = self._generate_dms_di_graph(self._state.data_model.last_verified_dms_rules[1])
110
- name = "dms_data_model.html"
110
+ di_graph = self._generate_dms_di_graph(rules)
111
111
  elif isinstance(rules, InformationRules):
112
- di_graph = self._generate_info_di_graph(self._state.data_model.last_verified_information_rules[1])
113
- name = "information_data_model.html"
112
+ di_graph = self._generate_info_di_graph(rules)
114
113
  else:
115
114
  # This should never happen, but we need to handle it to satisfy mypy
116
115
  raise NeatSessionError(
117
116
  f"Unsupported type {type(rules) }. Make sure you have either information or DMS rules."
118
117
  )
118
+ identifier = to_directory_compatible(str(rules.metadata.identifier))
119
+ name = f"{identifier}.html"
119
120
 
120
121
  return self._generate_visualization(di_graph, name)
121
122
 
@@ -195,17 +196,16 @@ class ShowDataModelImplementsAPI(ShowBaseAPI):
195
196
  rules = self._state.data_model.last_verified_rule[1]
196
197
 
197
198
  if isinstance(rules, DMSRules):
198
- di_graph = self._generate_dms_di_graph(self._state.data_model.last_verified_dms_rules[1])
199
- name = "dms_data_model_implements.html"
199
+ di_graph = self._generate_dms_di_graph(rules)
200
200
  elif isinstance(rules, InformationRules):
201
- di_graph = self._generate_info_di_graph(self._state.data_model.last_verified_information_rules[1])
202
- name = "information_data_model_implements.html"
201
+ di_graph = self._generate_info_di_graph(rules)
203
202
  else:
204
203
  # This should never happen, but we need to handle it to satisfy mypy
205
204
  raise NeatSessionError(
206
205
  f"Unsupported type {type(rules) }. Make sure you have either information or DMS rules."
207
206
  )
208
-
207
+ identifier = to_directory_compatible(str(rules.metadata.identifier))
208
+ name = f"{identifier}_implements.html"
209
209
  return self._generate_visualization(di_graph, name)
210
210
 
211
211
  def _generate_dms_di_graph(self, rules: DMSRules) -> nx.DiGraph:
@@ -0,0 +1,11 @@
1
+ import re
2
+
3
+ # Spaces are allowed, but we replace them as well
4
+ _ILLEGAL_CHARACTERS = re.compile(r"[<>:\"/\\|?*\s]")
5
+
6
+
7
+ def to_directory_compatible(text: str) -> str:
8
+ """Convert a string to be compatible with directory names on all platforms"""
9
+ cleaned = _ILLEGAL_CHARACTERS.sub("_", text)
10
+ # Replace multiple underscores with a single one
11
+ return re.sub(r"_+", "_", cleaned)
cognite/neat/_version.py CHANGED
@@ -1,2 +1,2 @@
1
- __version__ = "0.103.0"
1
+ __version__ = "0.103.1"
2
2
  __engine__ = "^2.0.3"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cognite-neat
3
- Version: 0.103.0
3
+ Version: 0.103.1
4
4
  Summary: Knowledge graph transformation
5
5
  Home-page: https://cognite-neat.readthedocs-hosted.com/
6
6
  License: Apache-2.0
@@ -182,12 +182,12 @@ cognite/neat/_rules/models/dms/__init__.py,sha256=fRaUH0IwG0YwWd_DNKM6j-jHHFyiIV
182
182
  cognite/neat/_rules/models/dms/_exporter.py,sha256=eB5uDX06XYkQkON96eykSk7ZCegb9a5dCxTmTIr252c,28020
183
183
  cognite/neat/_rules/models/dms/_rules.py,sha256=xQ8NoSE9D4tMjcEwKn4z7HdF9l_3OR-1xRlH3uamQPM,20186
184
184
  cognite/neat/_rules/models/dms/_rules_input.py,sha256=mVW-gHrjjlqFuq82qTkxIaMZ7OlzQFxjopxdlwQergY,12949
185
- cognite/neat/_rules/models/dms/_validation.py,sha256=c3egIGDlsQTETReX57JkolBidn7H3zNV6Y-dUGY8Cl8,27652
185
+ cognite/neat/_rules/models/dms/_validation.py,sha256=PNFHsDNHJZfbHY1qt6D4t3eFOGjqe6Koa702Gzcz0I8,27734
186
186
  cognite/neat/_rules/models/entities/__init__.py,sha256=Hlucp3LyV6ncLl79aqRTbSy2qgiGzoyN8x54D_zaJCY,1469
187
187
  cognite/neat/_rules/models/entities/_constants.py,sha256=ToiLaaF-hGLPfn3AsKIIrfB4ZdTk4cY1RjM9gA1Qjkg,288
188
188
  cognite/neat/_rules/models/entities/_loaders.py,sha256=jFllRty5XpS6uLklr9wJkx7Bzm-qwg65um6hnVistvw,2728
189
189
  cognite/neat/_rules/models/entities/_multi_value.py,sha256=6j-nlUA392yQP_uB_CFB6_qFReNhi54ZlbFTcOKpbKY,2755
190
- cognite/neat/_rules/models/entities/_single_value.py,sha256=dVfqIx3_Agi_LddhsqPOyWcAt0s06PNpRxrW-7n-z0Y,18513
190
+ cognite/neat/_rules/models/entities/_single_value.py,sha256=GW1R8ko1vwjGhAs2Fl5BGgpz3qtiYnYoahT4hBgJdkA,19441
191
191
  cognite/neat/_rules/models/entities/_types.py,sha256=df9rnXJJKciv2Bp-Ve2q4xdEJt6WWniq12Z0hW2d6sk,1917
192
192
  cognite/neat/_rules/models/entities/_wrapped.py,sha256=FxC8HztW_tUUtuArAOwxyFfkdJnSEB4bgZoNmmmfiPk,7137
193
193
  cognite/neat/_rules/models/information/__init__.py,sha256=lV7l8RTfWBvN_DFkzea8OzADjq0rZGgWe_0Fiwtfje0,556
@@ -212,7 +212,7 @@ cognite/neat/_session/_mapping.py,sha256=brXv1C7426OwknAulYzv55xKVBtCdeAqwPZ1Moe
212
212
  cognite/neat/_session/_prepare.py,sha256=uJemU23b-mR-fsgkvlYIQe_qrEC2ZicuNO8GATLWHWE,29588
213
213
  cognite/neat/_session/_read.py,sha256=3HbzXbfXmIv6D5f47OgzF1Lgs8gvyH_pyWHfBvlEQH4,20459
214
214
  cognite/neat/_session/_set.py,sha256=DflpDN4gc9Iu7RfuitId-1IJZDBIW8pn4wBOLYJs71s,2353
215
- cognite/neat/_session/_show.py,sha256=imSp95XTAOXJf9l-Vxxtmhen4n7i8D2h8QTlDeYlZt4,15500
215
+ cognite/neat/_session/_show.py,sha256=4PAqOxS_T0Q1S9ltCiqDh4yKl4m5FHls8pBFDSRp-60,15402
216
216
  cognite/neat/_session/_state.py,sha256=rqKHkikagO1pf_fKpY-LZI1X5R_v6AyYpV72_3eSduM,5783
217
217
  cognite/neat/_session/_to.py,sha256=7SBZ-wXkmJE9f1UgMdqlaQ31yU4l_E81I3ftLXWzi1w,9316
218
218
  cognite/neat/_session/_wizard.py,sha256=O8d0FA87RIoiTOD2KLyTVsxwA2-ewAG2By4JfxXSL84,1474
@@ -230,6 +230,7 @@ cognite/neat/_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
230
230
  cognite/neat/_utils/auth.py,sha256=Y35foeQHHbnAWhfDtgNqXGOoPqBk5gtrfhPWgoSa5XQ,13444
231
231
  cognite/neat/_utils/auxiliary.py,sha256=WFOycFgoYipvDmtGvn6ZNH3H8iNZmHamrfe2kXRb8lM,6667
232
232
  cognite/neat/_utils/collection_.py,sha256=Q_LN1qypr0SeAV3dAR5KLD1szHNohSdYxyA8hr3n4T8,1433
233
+ cognite/neat/_utils/io_.py,sha256=D2Mg8sOxfBoDg3fC0jBzaxO3vkXmr0QvZSgYIv6xRkM,386
233
234
  cognite/neat/_utils/rdf_.py,sha256=_nmZqo6_Ef7Aep0kXR_uoiRxGQR2u5lMK4g5mxWneeY,8586
234
235
  cognite/neat/_utils/reader/__init__.py,sha256=fPkrNB_9hLB7CyHTCFV_xEbIfOMqUQzNly5JN33-QfM,146
235
236
  cognite/neat/_utils/reader/_base.py,sha256=mk_kZDnfg5LcvYJr5IiBosYwbF82mLWo1p1Wq3K2p_Y,4681
@@ -238,7 +239,7 @@ cognite/neat/_utils/text.py,sha256=0IffvBIAmeGh92F4T6xiEdd-vv3B7FOGEMbfuTktO5Y,4
238
239
  cognite/neat/_utils/time_.py,sha256=O30LUiDH9TdOYz8_a9pFqTtJdg8vEjC3qHCk8xZblG8,345
239
240
  cognite/neat/_utils/upload.py,sha256=iWKmsQgw4EHLv-11NjYu7zAj5LtqTAfNa87a1kWeuaU,5727
240
241
  cognite/neat/_utils/xml_.py,sha256=FQkq84u35MUsnKcL6nTMJ9ajtG9D5i1u4VBnhGqP2DQ,1710
241
- cognite/neat/_version.py,sha256=XasIHNUoR5yEKcSpbN-2IEcv1b20UHkxPc8KrEJo6II,46
242
+ cognite/neat/_version.py,sha256=CxnOw_AydGeiyL5JDLpMWSJxR74QM4HNXJkepkmVhjo,46
242
243
  cognite/neat/_workflows/__init__.py,sha256=CbnZi0l84-ixeQQCnhE6ldpemzCf-mZtf5UpxW_sS8U,420
243
244
  cognite/neat/_workflows/base.py,sha256=O1pcmfbme2gIVF2eOGrKZSUDmhZc8L9rI8UfvLN2YAM,26839
244
245
  cognite/neat/_workflows/cdf_store.py,sha256=3pebnATPo6In4-1srpa3wzstynTOi3T6hwFX5uaie4c,18050
@@ -267,8 +268,8 @@ cognite/neat/_workflows/tasks.py,sha256=dr2xuIb8P5e5e9p_fjzRlvDbKsre2xGYrkc3wnRx
267
268
  cognite/neat/_workflows/triggers.py,sha256=u69xOsaTtM8_WD6ZeIIBB-XKwvlZmPHAsZQh_TnyHcM,7073
268
269
  cognite/neat/_workflows/utils.py,sha256=gKdy3RLG7ctRhbCRwaDIWpL9Mi98zm56-d4jfHDqP1E,453
269
270
  cognite/neat/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
270
- cognite_neat-0.103.0.dist-info/LICENSE,sha256=W8VmvFia4WHa3Gqxq1Ygrq85McUNqIGDVgtdvzT-XqA,11351
271
- cognite_neat-0.103.0.dist-info/METADATA,sha256=2369m9OcvLldJSc94bGxCbHHlPAr3ERzHPk2dy1Ruv4,5708
272
- cognite_neat-0.103.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
273
- cognite_neat-0.103.0.dist-info/entry_points.txt,sha256=SsQlnl8SNMSSjE3acBI835JYFtsIinLSbVmHmMEXv6E,51
274
- cognite_neat-0.103.0.dist-info/RECORD,,
271
+ cognite_neat-0.103.1.dist-info/LICENSE,sha256=W8VmvFia4WHa3Gqxq1Ygrq85McUNqIGDVgtdvzT-XqA,11351
272
+ cognite_neat-0.103.1.dist-info/METADATA,sha256=2ti0M9vLhaDHSBgHIQYAxUjVGmxBNdPkwImBvqlQIhA,5708
273
+ cognite_neat-0.103.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
274
+ cognite_neat-0.103.1.dist-info/entry_points.txt,sha256=SsQlnl8SNMSSjE3acBI835JYFtsIinLSbVmHmMEXv6E,51
275
+ cognite_neat-0.103.1.dist-info/RECORD,,