cognite-neat 0.77.3__py3-none-any.whl → 0.77.4__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.

Files changed (28) hide show
  1. cognite/neat/_version.py +1 -1
  2. cognite/neat/rules/analysis/_information_rules.py +2 -12
  3. cognite/neat/rules/exporters/_rules2excel.py +4 -4
  4. cognite/neat/rules/importers/_dms2rules.py +15 -6
  5. cognite/neat/rules/importers/_dtdl2rules/dtdl_importer.py +1 -0
  6. cognite/neat/rules/importers/_spreadsheet2rules.py +21 -8
  7. cognite/neat/rules/issues/spreadsheet.py +60 -5
  8. cognite/neat/rules/models/_base.py +6 -0
  9. cognite/neat/rules/models/dms/_converter.py +2 -0
  10. cognite/neat/rules/models/dms/_exporter.py +2 -1
  11. cognite/neat/rules/models/dms/_rules.py +3 -2
  12. cognite/neat/rules/models/dms/_rules_input.py +4 -11
  13. cognite/neat/rules/models/dms/_schema.py +5 -4
  14. cognite/neat/rules/models/dms/_serializer.py +1 -1
  15. cognite/neat/rules/models/dms/_validation.py +27 -60
  16. cognite/neat/rules/models/information/__init__.py +8 -1
  17. cognite/neat/rules/models/information/_rules.py +41 -82
  18. cognite/neat/rules/models/information/_rules_input.py +266 -0
  19. cognite/neat/rules/models/information/_serializer.py +85 -0
  20. cognite/neat/rules/models/information/_validation.py +164 -0
  21. cognite/neat/utils/cdf.py +35 -0
  22. cognite/neat/workflows/steps/lib/current/rules_exporter.py +30 -7
  23. cognite/neat/workflows/steps/lib/current/rules_importer.py +21 -2
  24. {cognite_neat-0.77.3.dist-info → cognite_neat-0.77.4.dist-info}/METADATA +1 -1
  25. {cognite_neat-0.77.3.dist-info → cognite_neat-0.77.4.dist-info}/RECORD +28 -25
  26. {cognite_neat-0.77.3.dist-info → cognite_neat-0.77.4.dist-info}/LICENSE +0 -0
  27. {cognite_neat-0.77.3.dist-info → cognite_neat-0.77.4.dist-info}/WHEEL +0 -0
  28. {cognite_neat-0.77.3.dist-info → cognite_neat-0.77.4.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,164 @@
1
+ import itertools
2
+ from typing import cast
3
+
4
+ from cognite.neat.rules import issues
5
+ from cognite.neat.rules.issues import IssueList
6
+ from cognite.neat.rules.models._base import DataModelType, SchemaCompleteness
7
+ from cognite.neat.rules.models.entities import ClassEntity, EntityTypes, UnknownEntity
8
+ from cognite.neat.utils.utils import get_inheritance_path
9
+
10
+ from ._rules import InformationRules
11
+
12
+
13
+ class InformationPostValidation:
14
+ """This class does all the validation of the Information rules that have dependencies
15
+ between components."""
16
+
17
+ def __init__(self, rules: InformationRules):
18
+ self.rules = rules
19
+ self.metadata = rules.metadata
20
+ self.properties = rules.properties
21
+ self.classes = rules.classes
22
+ self.issue_list = IssueList()
23
+
24
+ def validate(self) -> IssueList:
25
+ if self.metadata.schema_ == SchemaCompleteness.partial:
26
+ return self.issue_list
27
+
28
+ if self.metadata.data_model_type == DataModelType.solution and not self.rules.reference:
29
+ raise ValueError("Reference data model is missing")
30
+
31
+ if self.metadata.schema_ == SchemaCompleteness.extended and not self.rules.last:
32
+ raise ValueError("Last version is missing")
33
+
34
+ self._dangling_classes()
35
+ self._referenced_parent_classes_exist()
36
+ self._referenced_classes_exist()
37
+ self._referenced_value_types_exist()
38
+
39
+ return self.issue_list
40
+
41
+ def _dangling_classes(self) -> None:
42
+ # needs to be complete for this validation to pass
43
+ defined_classes = {class_.class_ for class_ in self.classes}
44
+ referred_classes = {property_.class_ for property_ in self.properties}
45
+ class_parent_pairs = self._class_parent_pairs()
46
+ dangling_classes = set()
47
+
48
+ if classes_without_properties := defined_classes.difference(referred_classes):
49
+ for class_ in classes_without_properties:
50
+ # USE CASE: class has no direct properties and no parents
51
+ if class_ not in class_parent_pairs:
52
+ dangling_classes.add(class_)
53
+ # USE CASE: class has no direct properties and no parents with properties
54
+ elif class_ not in class_parent_pairs and not any(
55
+ parent in referred_classes for parent in get_inheritance_path(class_, class_parent_pairs)
56
+ ):
57
+ dangling_classes.add(class_)
58
+
59
+ if dangling_classes:
60
+ self.issue_list.append(
61
+ issues.spreadsheet.ClassNoPropertiesNoParentError([class_.versioned_id for class_ in dangling_classes])
62
+ )
63
+
64
+ def _referenced_parent_classes_exist(self) -> None:
65
+ # needs to be complete for this validation to pass
66
+ class_parent_pairs = self._class_parent_pairs()
67
+ classes = set(class_parent_pairs.keys())
68
+ parents = set(itertools.chain.from_iterable(class_parent_pairs.values()))
69
+
70
+ if undefined_parents := parents.difference(classes):
71
+ self.issue_list.append(
72
+ issues.spreadsheet.ParentClassesNotDefinedError([missing.versioned_id for missing in undefined_parents])
73
+ )
74
+
75
+ def _referenced_classes_exist(self) -> None:
76
+ # needs to be complete for this validation to pass
77
+ defined_classes = {class_.class_ for class_ in self.classes}
78
+ referred_classes = {property_.class_ for property_ in self.properties}
79
+
80
+ # USE CASE: models are complete
81
+ if self.metadata.schema_ == SchemaCompleteness.complete and (
82
+ missing_classes := referred_classes.difference(defined_classes)
83
+ ):
84
+ self.issue_list.append(
85
+ issues.spreadsheet.PropertiesDefinedForUndefinedClassesError(
86
+ [missing.versioned_id for missing in missing_classes]
87
+ )
88
+ )
89
+
90
+ # USE CASE: models are extended (user + last = complete)
91
+ if self.metadata.schema_ == SchemaCompleteness.extended:
92
+ defined_classes |= {class_.class_ for class_ in cast(InformationRules, self.rules.last).classes}
93
+ if missing_classes := referred_classes.difference(defined_classes):
94
+ self.issue_list.append(
95
+ issues.spreadsheet.PropertiesDefinedForUndefinedClassesError(
96
+ [missing.versioned_id for missing in missing_classes]
97
+ )
98
+ )
99
+
100
+ def _referenced_value_types_exist(self) -> None:
101
+ # adding UnknownEntity to the set of defined classes to handle the case where a property references an unknown
102
+ defined_classes = {class_.class_ for class_ in self.classes} | {UnknownEntity()}
103
+ referred_object_types = {
104
+ property_.value_type
105
+ for property_ in self.rules.properties
106
+ if property_.type_ == EntityTypes.object_property
107
+ }
108
+
109
+ # USE CASE: models are complete
110
+ if self.metadata.schema_ == SchemaCompleteness.complete and (
111
+ missing_value_types := referred_object_types.difference(defined_classes)
112
+ ):
113
+ self.issue_list.append(
114
+ issues.spreadsheet.ValueTypeNotDefinedError(
115
+ [cast(ClassEntity, missing).versioned_id for missing in missing_value_types]
116
+ )
117
+ )
118
+
119
+ # USE CASE: models are extended (user + last = complete)
120
+ if self.metadata.schema_ == SchemaCompleteness.extended:
121
+ defined_classes |= {class_.class_ for class_ in cast(InformationRules, self.rules.last).classes}
122
+ if missing_value_types := referred_object_types.difference(defined_classes):
123
+ self.issue_list.append(
124
+ issues.spreadsheet.ValueTypeNotDefinedError(
125
+ [cast(ClassEntity, missing).versioned_id for missing in missing_value_types]
126
+ )
127
+ )
128
+
129
+ def _class_parent_pairs(self) -> dict[ClassEntity, list[ClassEntity]]:
130
+ class_subclass_pairs: dict[ClassEntity, list[ClassEntity]] = {}
131
+
132
+ classes = self.rules.model_copy(deep=True).classes.data
133
+
134
+ # USE CASE: Solution model being extended (user + last + reference = complete)
135
+ if (
136
+ self.metadata.schema_ == SchemaCompleteness.extended
137
+ and self.metadata.data_model_type == DataModelType.solution
138
+ ):
139
+ classes += (
140
+ cast(InformationRules, self.rules.last).model_copy(deep=True).classes.data
141
+ + cast(InformationRules, self.rules.reference).model_copy(deep=True).classes.data
142
+ )
143
+
144
+ # USE CASE: Solution model being created from scratch (user + reference = complete)
145
+ elif (
146
+ self.metadata.schema_ == SchemaCompleteness.complete
147
+ and self.metadata.data_model_type == DataModelType.solution
148
+ ):
149
+ classes += cast(InformationRules, self.rules.reference).model_copy(deep=True).classes.data
150
+
151
+ # USE CASE: Enterprise model being extended (user + last = complete)
152
+ elif (
153
+ self.metadata.schema_ == SchemaCompleteness.extended
154
+ and self.metadata.data_model_type == DataModelType.enterprise
155
+ ):
156
+ classes += cast(InformationRules, self.rules.last).model_copy(deep=True).classes.data
157
+
158
+ for class_ in classes:
159
+ class_subclass_pairs[class_.class_] = []
160
+ if class_.parent is None:
161
+ continue
162
+ class_subclass_pairs[class_.class_].extend([parent.as_class_entity() for parent in class_.parent])
163
+
164
+ return class_subclass_pairs
cognite/neat/utils/cdf.py CHANGED
@@ -1,3 +1,5 @@
1
+ from cognite.client import CogniteClient
2
+ from cognite.client.data_classes import filters
1
3
  from pydantic import BaseModel, field_validator
2
4
 
3
5
 
@@ -22,3 +24,36 @@ class InteractiveCogniteClient(CogniteClientConfig):
22
24
  class ServiceCogniteClient(CogniteClientConfig):
23
25
  token_url: str = "https://login.microsoftonline.com/common/oauth2/token"
24
26
  client_secret: str = "secret"
27
+
28
+
29
+ def clean_space(client: CogniteClient, space: str) -> None:
30
+ """Deletes all data in a space.
31
+
32
+ This means all nodes, edges, views, containers, and data models located in the given space.
33
+
34
+ Args:
35
+ client: Connected CogniteClient
36
+ space: The space to delete.
37
+
38
+ """
39
+ edges = client.data_modeling.instances.list("edge", limit=-1, filter=filters.Equals(["edge", "space"], space))
40
+ if edges:
41
+ instances = client.data_modeling.instances.delete(edges=edges.as_ids())
42
+ print(f"Deleted {len(instances.edges)} edges")
43
+ nodes = client.data_modeling.instances.list("node", limit=-1, filter=filters.Equals(["node", "space"], space))
44
+ if nodes:
45
+ instances = client.data_modeling.instances.delete(nodes=nodes.as_ids())
46
+ print(f"Deleted {len(instances.nodes)} nodes")
47
+ views = client.data_modeling.views.list(limit=-1, space=space)
48
+ if views:
49
+ deleted_views = client.data_modeling.views.delete(views.as_ids())
50
+ print(f"Deleted {len(deleted_views)} views")
51
+ containers = client.data_modeling.containers.list(limit=-1, space=space)
52
+ if containers:
53
+ deleted_containers = client.data_modeling.containers.delete(containers.as_ids())
54
+ print(f"Deleted {len(deleted_containers)} containers")
55
+ if data_models := client.data_modeling.data_models.list(limit=-1, space=space):
56
+ deleted_data_models = client.data_modeling.data_models.delete(data_models.as_ids())
57
+ print(f"Deleted {len(deleted_data_models)} data models")
58
+ deleted_space = client.data_modeling.spaces.delete(space)
59
+ print(f"Deleted space {deleted_space}")
@@ -269,10 +269,19 @@ class RulesToExcel(Step):
269
269
  options=["input", *RoleTypes.__members__.keys()],
270
270
  ),
271
271
  Configurable(
272
- name="Is Reference",
273
- value="False",
274
- label="Export rules as reference rules. If provided, the rules will be exported as reference rules. ",
275
- options=["True", "False"],
272
+ name="Dump Format",
273
+ value="user",
274
+ label="How to dump the rules to the Excel file.\n"
275
+ "'user' - just as is.\n'reference' - enterprise model used as basis for a solution model\n"
276
+ "'last' - used when updating a data model.",
277
+ options=list(exporters.ExcelExporter.dump_options),
278
+ ),
279
+ Configurable(
280
+ name="New Data Model ID",
281
+ value="",
282
+ label="If you chose Dump Format 'reference', the provided ID will be use in the new medata sheet. "
283
+ "Expected format 'sp_space:my_external_id'.",
284
+ options=list(exporters.ExcelExporter.dump_options),
276
285
  ),
277
286
  Configurable(
278
287
  name="File path",
@@ -285,15 +294,29 @@ class RulesToExcel(Step):
285
294
  if self.configs is None or self.data_store_path is None:
286
295
  raise StepNotInitialized(type(self).__name__)
287
296
 
288
- is_reference = self.configs.get("Is Reference") == "True"
297
+ dump_format = self.configs.get("Dump Format", "user")
289
298
  styling = cast(exporters.ExcelExporter.Style, self.configs.get("Styling", "default"))
290
299
  role = self.configs.get("Output role format")
291
300
  output_role = None
292
301
  if role != "input" and role is not None:
293
302
  output_role = RoleTypes[role]
294
303
 
295
- dump_as = "reference" if is_reference else "user"
296
- excel_exporter = exporters.ExcelExporter(styling=styling, output_role=output_role, dump_as=dump_as) # type: ignore[arg-type]
304
+ new_model_str = self.configs.get("New Data Model ID")
305
+ new_model_id: tuple[str, str] | None = None
306
+ if new_model_str and ":" in new_model_str:
307
+ new_model_id = tuple(new_model_str.split(":", 1)) # type: ignore[assignment]
308
+ elif new_model_str:
309
+ return FlowMessage(
310
+ error_text="New Data Model ID must be in the format 'sp_space:my_external_id'!",
311
+ step_execution_status=StepExecutionStatus.ABORT_AND_FAIL,
312
+ )
313
+
314
+ excel_exporter = exporters.ExcelExporter(
315
+ styling=styling,
316
+ output_role=output_role,
317
+ dump_as=dump_format, # type: ignore[arg-type]
318
+ new_model_id=new_model_id,
319
+ )
297
320
 
298
321
  rule_instance: Rules
299
322
  if rules.domain:
@@ -3,6 +3,7 @@ from pathlib import Path
3
3
  from typing import ClassVar
4
4
 
5
5
  from cognite.client import CogniteClient
6
+ from cognite.client.data_classes.data_modeling import DataModelId
6
7
 
7
8
  from cognite.neat.rules import importers
8
9
  from cognite.neat.rules.issues.formatters import FORMATTER_BY_NAME
@@ -184,6 +185,13 @@ class DMSToRules(Step):
184
185
  type="string",
185
186
  required=True,
186
187
  ),
188
+ Configurable(
189
+ name="Reference data model id",
190
+ value=None,
191
+ label="The ID of the Reference Data Model to import. Written at 'my_space:my_data_model(version=1)'. "
192
+ "This is typically an enterprise data model when you want to import a solution model",
193
+ type="string",
194
+ ),
187
195
  Configurable(
188
196
  name="Report formatter",
189
197
  value=next(iter(FORMATTER_BY_NAME.keys())),
@@ -214,8 +222,19 @@ class DMSToRules(Step):
214
222
  f"or 'my_space:my_data_model', failed to parse space from {datamodel_id_str}"
215
223
  )
216
224
  return FlowMessage(error_text=error_text, step_execution_status=StepExecutionStatus.ABORT_AND_FAIL)
217
-
218
- dms_importer = importers.DMSImporter.from_data_model_id(cdf_client, datamodel_entity.as_id())
225
+ ref_datamodel_str = self.configs.get("Reference data model id")
226
+ ref_model_id: DataModelId | None = None
227
+ if ref_datamodel_str is not None:
228
+ ref_model = DataModelEntity.load(ref_datamodel_str)
229
+ if isinstance(ref_model, DMSUnknownEntity):
230
+ error_text = (
231
+ f"Reference data model id should be in the format 'my_space:my_data_model(version=1)' "
232
+ f"or 'my_space:my_data_model', failed to parse space from {ref_datamodel_str}"
233
+ )
234
+ return FlowMessage(error_text=error_text, step_execution_status=StepExecutionStatus.ABORT_AND_FAIL)
235
+ ref_model_id = ref_model.as_id()
236
+
237
+ dms_importer = importers.DMSImporter.from_data_model_id(cdf_client, datamodel_entity.as_id(), ref_model_id)
219
238
 
220
239
  # if role is None, it will be inferred from the rules file
221
240
  role = self.configs.get("Role")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cognite-neat
3
- Version: 0.77.3
3
+ Version: 0.77.4
4
4
  Summary: Knowledge graph transformation
5
5
  Home-page: https://cognite-neat.readthedocs-hosted.com/
6
6
  License: Apache-2.0
@@ -1,5 +1,5 @@
1
1
  cognite/neat/__init__.py,sha256=v-rRiDOgZ3sQSMQKq0vgUQZvpeOkoHFXissAx6Ktg84,61
2
- cognite/neat/_version.py,sha256=NPJS42_jfINt0XsTzh6J8mMo-DNeRf0PVi2gr3NvRzw,23
2
+ cognite/neat/_version.py,sha256=UI_UQyLNbZGZ2bCbRSUVSxQLP1GDhHBmVI29h7BNFAE,23
3
3
  cognite/neat/app/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  cognite/neat/app/api/asgi/metrics.py,sha256=nxFy7L5cChTI0a-zkCiJ59Aq8yLuIJp5c9Dg0wRXtV0,152
5
5
  cognite/neat/app/api/configuration.py,sha256=2U5M6M252swvQPQyooA1EBzFUZNtcTmuSaywfJDgckM,4232
@@ -158,7 +158,7 @@ cognite/neat/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
158
158
  cognite/neat/rules/_shared.py,sha256=5dc2dfwqjNB_Us27x7oRNkEoEETT0gQChoiIU8mcvyQ,170
159
159
  cognite/neat/rules/analysis/__init__.py,sha256=J2yL0QWSvXOWLbaYPyA0HXHh3aqOWmkwobScdgVQpw8,115
160
160
  cognite/neat/rules/analysis/_base.py,sha256=PmN5NLgGsovsHtsnvUzc_zuarWl-Xwk1azWcYKKuWdA,669
161
- cognite/neat/rules/analysis/_information_rules.py,sha256=vEODgoCKlqYy6A-A3oe_IBWJs5J12Vrc5XCjPCoV8zU,19584
161
+ cognite/neat/rules/analysis/_information_rules.py,sha256=F-LBLYyEz6B3J3v1KQ_2G79LzgMXPmcSIw6S8SMGaxs,19179
162
162
  cognite/neat/rules/examples/__init__.py,sha256=nxIwueAcHgZhkYriGxnDLQmIyiT8PByPHbScjYKDKe0,374
163
163
  cognite/neat/rules/examples/wind-energy.owl,sha256=NuomCA9FuuLF0JlSuG3OKqD4VBcHgSjDKFLV17G1zV8,65934
164
164
  cognite/neat/rules/exceptions.py,sha256=YLnsbXXJdDSr_szQoioEtOdqDV8PR7RdQjpMP2SWeCs,123868
@@ -166,24 +166,24 @@ cognite/neat/rules/exporters/__init__.py,sha256=Gn3CjkVKHJF9Po1ZPH4wAJ-sRW9up7b2
166
166
  cognite/neat/rules/exporters/_base.py,sha256=m63iw8xjlZbZAxGL8mn7pjGf1pW3rVv8C20_RSiu4t0,1511
167
167
  cognite/neat/rules/exporters/_models.py,sha256=vRd0P_YsrZ1eaAGGHfdTeFunaqHdaa0ZtnWiVZBR1nc,1976
168
168
  cognite/neat/rules/exporters/_rules2dms.py,sha256=US2IO4YTJSF_CDzau1dTpXyeHntJWVSPkMCQoUoKeC0,13688
169
- cognite/neat/rules/exporters/_rules2excel.py,sha256=XuPCMzX6RweFCyt8A264NzM5iRVZtcwZrzYXy2LRLns,14172
169
+ cognite/neat/rules/exporters/_rules2excel.py,sha256=GvvjZB2Ayue08s5b6JPB1xGltp-MA7QmNk9rk1a54LE,14244
170
170
  cognite/neat/rules/exporters/_rules2ontology.py,sha256=NWS3cn2927LQqW_PdQ-92OLIlmIKGNk7xh5yOMAyj94,20120
171
171
  cognite/neat/rules/exporters/_rules2yaml.py,sha256=sOSdnTJ5mXuyAJECdNnNsX6oLvgETptkpgPUQbK0n2w,3026
172
172
  cognite/neat/rules/exporters/_validation.py,sha256=OlKIyf4nhSDehJwFHDQ8Zdf6HpNfW7dSe2s67eywHu4,4078
173
173
  cognite/neat/rules/importers/__init__.py,sha256=zqNbGpvdVhYkLjWx1i9dJ3FXzYGtuQyTydUYsj-BndQ,408
174
174
  cognite/neat/rules/importers/_base.py,sha256=GUiJrYwJ25thI71iS9hCeP_iSZ0Vv8ou3z6MfD07FAk,4274
175
- cognite/neat/rules/importers/_dms2rules.py,sha256=R6NCzo42AEQKgHJ5pYJvccCjlKiFX5BuOrIysvTlCto,18546
175
+ cognite/neat/rules/importers/_dms2rules.py,sha256=5yJGYkM7lAMu-QfO0_r59WE4RGtMu2smMqLm16ohgLQ,18994
176
176
  cognite/neat/rules/importers/_dtdl2rules/__init__.py,sha256=CNR-sUihs2mnR1bPMKs3j3L4ds3vFTsrl6YycExZTfU,68
177
177
  cognite/neat/rules/importers/_dtdl2rules/_unit_lookup.py,sha256=wW4saKva61Q_i17guY0dc4OseJDQfqHy_QZBtm0OD6g,12134
178
178
  cognite/neat/rules/importers/_dtdl2rules/dtdl_converter.py,sha256=ysmWUxZ0npwrTB0uiH5jA0v37sfCwowGaYk17IyxPUU,12663
179
- cognite/neat/rules/importers/_dtdl2rules/dtdl_importer.py,sha256=gud3vUzUpl4PtikzfSLRzjppX1h5fu0HhX3HUOLV4ls,6717
179
+ cognite/neat/rules/importers/_dtdl2rules/dtdl_importer.py,sha256=QDyGt5YBaxzF4v_oCFSgKRSpwVdVruDU3-VW0DEiHbY,6718
180
180
  cognite/neat/rules/importers/_dtdl2rules/spec.py,sha256=tim_MfN1J0F3Oeqk3BMgIA82d_MZvhRuRMsLK3B4PYc,11897
181
181
  cognite/neat/rules/importers/_owl2rules/__init__.py,sha256=tdGcrgtozdQyST-pTlxIa4cLBNTLvtk1nNYR4vOdFSw,63
182
182
  cognite/neat/rules/importers/_owl2rules/_owl2classes.py,sha256=LInFeBq-NbBIuMEAwgWch2a4DbBUt4_OMqPkwehW-sw,7591
183
183
  cognite/neat/rules/importers/_owl2rules/_owl2metadata.py,sha256=NdPN0dBB0NYkAcfC0yrYdIrGfdPbl5gfeGnSV3EtUPM,7786
184
184
  cognite/neat/rules/importers/_owl2rules/_owl2properties.py,sha256=BLptGmH-Aa5gZu0hDIxSZTrn9GmB2FicWgRYoETLSnQ,7437
185
185
  cognite/neat/rules/importers/_owl2rules/_owl2rules.py,sha256=H2Vv56hXGFnq_b0obWGWr5ErDFcoWpT8G2uy89100cU,6925
186
- cognite/neat/rules/importers/_spreadsheet2rules.py,sha256=dKTue97yZlPQagegfdyOWthDQ6X07hfz18KLXZlUPtA,11882
186
+ cognite/neat/rules/importers/_spreadsheet2rules.py,sha256=nKSJyZGoTho0bqQ_5_1XB9Z1C-MwovRgkVrC-AhOuzs,12438
187
187
  cognite/neat/rules/importers/_yaml2rules.py,sha256=F0uksSz1A3po5OlRM2152_w5j8D9oYTLB9NFTkSMlWI,4275
188
188
  cognite/neat/rules/issues/__init__.py,sha256=Ms6jgCxCezc5IgTOwCFtXQPtoVFfOvdcXj84_rs917I,563
189
189
  cognite/neat/rules/issues/base.py,sha256=i2aTC-wq3UVW2bj_7wKeuhYxCpMD06Bd9-m00bWcTBs,6438
@@ -191,32 +191,35 @@ cognite/neat/rules/issues/dms.py,sha256=CKztcpNu9E_ygbAmiODOhaYKPX6o9eaXeiod7Ak-
191
191
  cognite/neat/rules/issues/fileread.py,sha256=ao199mtvhPSW0IA8ZQZ0RzuLIIipYtL0jp6fLqxb4_c,5748
192
192
  cognite/neat/rules/issues/formatters.py,sha256=_ag2bJ9hncOj8pAGJvTTEPs9kTtxbD7vkqvS9Zcnizc,3385
193
193
  cognite/neat/rules/issues/importing.py,sha256=l0VKmOWN-qyvOMukNAVJZrN2WGD2YcGXeCKbxV-G_vA,12726
194
- cognite/neat/rules/issues/spreadsheet.py,sha256=-jMcamtvDIACKiIHtDNafjiMgovVN-VthyqE1FaSy-0,13936
194
+ cognite/neat/rules/issues/spreadsheet.py,sha256=1NZQ3a_zCtErAoMKzEt5UMJsukaysoOVmW7WUF6JK1s,15825
195
195
  cognite/neat/rules/issues/spreadsheet_file.py,sha256=YCp0Pk_TsiqYuOPdWpjUpre-zvi2c5_MvrC_dxw10YY,4964
196
196
  cognite/neat/rules/models/__init__.py,sha256=aqhQUidHYgOk5_iqdi6s72s2g8qyMRFXShYzh-ctNpw,782
197
- cognite/neat/rules/models/_base.py,sha256=bFH_HSftl960ROroUMy5jjXdIir6lm3tHK2qJmc-UG8,10876
197
+ cognite/neat/rules/models/_base.py,sha256=D9MQElY9baxmf-BJpuLYl3R3h_wIOdrBTufMThRx_Jo,11126
198
198
  cognite/neat/rules/models/_rdfpath.py,sha256=RoHnfWufjnDtwJh7UUzWKoJz8luvX7Gb5SDQORfkQTE,11030
199
199
  cognite/neat/rules/models/_types/__init__.py,sha256=l1tGxzE7ezNHIL72AoEvNHN2IFuitxOLxiHJG__s6t4,305
200
200
  cognite/neat/rules/models/_types/_base.py,sha256=2GhLUE1ukV8X8SGL_JDxpbWGZyAvOnSqAE6JmDh5wbI,929
201
201
  cognite/neat/rules/models/_types/_field.py,sha256=74WfCSVbTubpK4n4VsysQqCch6VI8IcPqnHQpvNbFZ8,3197
202
202
  cognite/neat/rules/models/data_types.py,sha256=lanwkhwG8iHKfjYfia4v2SBTJrMeXOsqaVkVEP2QMXs,6078
203
203
  cognite/neat/rules/models/dms/__init__.py,sha256=Wzyqzz2ZIjpUbDg04CMuuIAw-f2A02DayNeqO9R-2Hw,491
204
- cognite/neat/rules/models/dms/_converter.py,sha256=aOZI9zPEEcJSXhbN0uS3JLpWT68pweastKEyFpCLWWs,5863
205
- cognite/neat/rules/models/dms/_exporter.py,sha256=WTokr7gyjrpxW212kZpFfvd7zw09RRVPjAsxe_aizFo,18903
206
- cognite/neat/rules/models/dms/_rules.py,sha256=ZLdJLdAJGX1l5t1hChEic9TOHdculbWRhiLbUluZRRQ,15568
207
- cognite/neat/rules/models/dms/_rules_input.py,sha256=2ZGE3nsQyJ7RgdR5o9Wf8XbpSD57ZPbhvMz6H92aJ9g,13633
208
- cognite/neat/rules/models/dms/_schema.py,sha256=P0StFJppq5JV2OHws1yUbDh9gvKRfJCHMDV0-ZeW1ts,43743
209
- cognite/neat/rules/models/dms/_serializer.py,sha256=Zulj__rnaVNtrbGJPkn4dYMfMXWYyRmtNPR2Yb5zYW0,6668
210
- cognite/neat/rules/models/dms/_validation.py,sha256=-7bpj1vQybB7P7nqvSc1XjKJhbpIRCXBzm3pdx6pqPQ,14589
204
+ cognite/neat/rules/models/dms/_converter.py,sha256=QaJT0z0Yo4gkG9tHPZkU8idF8PK7c-tDahbyIT-WJQU,5959
205
+ cognite/neat/rules/models/dms/_exporter.py,sha256=u1E53704ly1cH6-tM3EKT7Vksq1JFlrbTfQI33qR1wc,18984
206
+ cognite/neat/rules/models/dms/_rules.py,sha256=WyaUsIWM0a-SytRZ-5n2f_AFXwyV_brzzHqmq7O_n0I,15690
207
+ cognite/neat/rules/models/dms/_rules_input.py,sha256=apDDTQll9UAyYL5gS2vDxHsujWrGBilTp7lK2kzJWO8,13467
208
+ cognite/neat/rules/models/dms/_schema.py,sha256=A4z8CINmLQgWzHoScxejRPMRo40ngKlyp1gOdPto8yU,43808
209
+ cognite/neat/rules/models/dms/_serializer.py,sha256=JeaTIOERpYY1Demihqg0OHJ1EvBrPMBIF1EPjeOgGDA,6669
210
+ cognite/neat/rules/models/dms/_validation.py,sha256=k2UcLlo_WU6iO-p_wjHToiLExVc22KGLP3lBuW8I_EA,12963
211
211
  cognite/neat/rules/models/domain.py,sha256=13OhG-XavE5ipU2ICaYaUhz60volkuVfbJrsp0PhaUU,2993
212
212
  cognite/neat/rules/models/entities.py,sha256=iBG84Jr1qQ7PvkMJUJzJ1oWApeONb1IACixdJSztUhk,16395
213
- cognite/neat/rules/models/information/__init__.py,sha256=KvbYxVk38qReGbGTrU_Y3P3Gz6Bfghk5lHSKs8DlTOI,195
213
+ cognite/neat/rules/models/information/__init__.py,sha256=HR6g8xgyU53U7Ck8pPdbT70817Q4NC1r1pCRq5SA8iw,291
214
214
  cognite/neat/rules/models/information/_converter.py,sha256=TxVYzR41Rhejf7ep73oqMRNFPOdxAbamoEWnvsnXbng,8040
215
- cognite/neat/rules/models/information/_rules.py,sha256=YE7X8MsPQv-AVtl4vYtQW99moT45sYk2dI2DDS1YRO0,15546
215
+ cognite/neat/rules/models/information/_rules.py,sha256=JuP0RAmTju5WwDJJAoTI-gogRRBBa8eCf-SE2k8FGlQ,13365
216
+ cognite/neat/rules/models/information/_rules_input.py,sha256=IZp_Wnrac0nVaHKth1YttWQOs-kULGKLMtngNQFY40A,10147
217
+ cognite/neat/rules/models/information/_serializer.py,sha256=M4vOr0tgrD-n_pir-VDHwclgAjbBOu2HKsxt_PTGO7g,3989
218
+ cognite/neat/rules/models/information/_validation.py,sha256=Is2GzL2lZU3A5zPu3NjvlXfmIU2_Y10C5Nxi5Denz4g,7528
216
219
  cognite/neat/rules/models/wrapped_entities.py,sha256=ThhjnNNrpgz0HeORIQ8Q894trxP73P7T_TuZj6qH2CU,7157
217
220
  cognite/neat/utils/__init__.py,sha256=l5Nyqhqo25bcQXCOb_lk01cr-UXsG8cczz_y_I0u6bg,68
218
221
  cognite/neat/utils/auxiliary.py,sha256=E2-YtddzScvN7l7j0kNYIMlfqIUT9NWMqLpcJYPK4rY,309
219
- cognite/neat/utils/cdf.py,sha256=dTg8wnm2916yhWT_2Jg9_PlauHCbmnuNgmpqrGU8eO0,711
222
+ cognite/neat/utils/cdf.py,sha256=piRx-6GRz4cCfBZD5rU0OM6ixQ3cj5TMzI0yCYUveR8,2422
220
223
  cognite/neat/utils/cdf_classes.py,sha256=NEmz5UprBlqfqZnqJkRk5xjSpzazwHbhcWsMH_GNxP8,5831
221
224
  cognite/neat/utils/cdf_loaders/__init__.py,sha256=s2aPR5XLo6WZ0ybstAJlcGFYkA7CyHW1XO-NYpL0V6o,483
222
225
  cognite/neat/utils/cdf_loaders/_base.py,sha256=j85HINIx4poGD-0dN3JPHTqjOS1XhCxv7G9s1gC1GBo,2057
@@ -254,8 +257,8 @@ cognite/neat/workflows/steps/lib/current/__init__.py,sha256=c22IznGdCSNCpXCi_yon
254
257
  cognite/neat/workflows/steps/lib/current/graph_extractor.py,sha256=vW9UpJScx5dFVCSairpOdWRdBdLpkCt2kNh6litbF0o,5161
255
258
  cognite/neat/workflows/steps/lib/current/graph_loader.py,sha256=HfGg1HRZhbV58TFu89FTjKeUxGsbCYLeFJIQFDN_pQM,2341
256
259
  cognite/neat/workflows/steps/lib/current/graph_store.py,sha256=r7VTxdaz8jJQU7FJbnRDMxvEYbSAZFNMABhPyfNwiFk,6295
257
- cognite/neat/workflows/steps/lib/current/rules_exporter.py,sha256=wUQAZXWBCqWXe0241QSREtnNTii_tSmOkeiSPwNQRjk,22898
258
- cognite/neat/workflows/steps/lib/current/rules_importer.py,sha256=yDq06cvxLvEpSnTXTjwhxDie_MzHa3wO1A4cbKnrH6c,10338
260
+ cognite/neat/workflows/steps/lib/current/rules_exporter.py,sha256=BWscuNvTu_u6QQSxkVz4X4A1wAHW2Kfku8lhgrIK51M,23886
261
+ cognite/neat/workflows/steps/lib/current/rules_importer.py,sha256=BmbLsly6ZRhMJ48RAoVXVK7H3JTKRtR40SD9-qcQdi4,11459
259
262
  cognite/neat/workflows/steps/lib/current/rules_validator.py,sha256=LwF9lXlnuPOxDSsOMMTHBi2BHc5rk08IF5zahS9yQuw,4844
260
263
  cognite/neat/workflows/steps/lib/io/__init__.py,sha256=k7IPbIq3ey19oRc5sA_15F99-O6dxzqbm1LihGRRo5A,32
261
264
  cognite/neat/workflows/steps/lib/io/io_steps.py,sha256=QAGypoi1vP32BRiIgBZ0B4qsbFMcwhzpRiVUUnWysLA,16874
@@ -272,8 +275,8 @@ cognite/neat/workflows/steps_registry.py,sha256=fkTX14ZA7_gkUYfWIlx7A1XbCidvqR23
272
275
  cognite/neat/workflows/tasks.py,sha256=dqlJwKAb0jlkl7abbY8RRz3m7MT4SK8-7cntMWkOYjw,788
273
276
  cognite/neat/workflows/triggers.py,sha256=_BLNplzoz0iic367u1mhHMHiUrCwP-SLK6_CZzfODX0,7071
274
277
  cognite/neat/workflows/utils.py,sha256=gKdy3RLG7ctRhbCRwaDIWpL9Mi98zm56-d4jfHDqP1E,453
275
- cognite_neat-0.77.3.dist-info/LICENSE,sha256=W8VmvFia4WHa3Gqxq1Ygrq85McUNqIGDVgtdvzT-XqA,11351
276
- cognite_neat-0.77.3.dist-info/METADATA,sha256=tUDauNAgbTO_dsbRSkfgvJrVwmOs13HWyjWVidwBW4A,9316
277
- cognite_neat-0.77.3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
278
- cognite_neat-0.77.3.dist-info/entry_points.txt,sha256=61FPqiWb25vbqB0KI7znG8nsg_ibLHBvTjYnkPvNFso,50
279
- cognite_neat-0.77.3.dist-info/RECORD,,
278
+ cognite_neat-0.77.4.dist-info/LICENSE,sha256=W8VmvFia4WHa3Gqxq1Ygrq85McUNqIGDVgtdvzT-XqA,11351
279
+ cognite_neat-0.77.4.dist-info/METADATA,sha256=WCnAyTXFO9SjdNMcEdoyjwic7YAm8nsAg0kTXDfjsyU,9316
280
+ cognite_neat-0.77.4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
281
+ cognite_neat-0.77.4.dist-info/entry_points.txt,sha256=61FPqiWb25vbqB0KI7znG8nsg_ibLHBvTjYnkPvNFso,50
282
+ cognite_neat-0.77.4.dist-info/RECORD,,