cognite-neat 0.83.0__py3-none-any.whl → 0.84.0__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.
@@ -0,0 +1,35 @@
1
+ from abc import abstractmethod
2
+ from collections.abc import Hashable, Sequence
3
+ from dataclasses import dataclass
4
+ from typing import Any, TypeVar
5
+
6
+ import pandas as pd
7
+
8
+ T_ID = TypeVar("T_ID", bound=Hashable)
9
+
10
+
11
+ @dataclass
12
+ class NeatObject:
13
+ """A neat object can be dumped to a dictionary."""
14
+
15
+ @abstractmethod
16
+ def dump(self, aggregate: bool = True) -> dict[str, Any]:
17
+ """Return a dictionary representation of the object."""
18
+ raise NotImplementedError()
19
+
20
+
21
+ T_NeatObject = TypeVar("T_NeatObject", bound=NeatObject)
22
+
23
+
24
+ class NeatList(list, Sequence[T_NeatObject]):
25
+ """A list of neat objects."""
26
+
27
+ def dump(self) -> list[dict[str, Any]]:
28
+ """Return a list of dictionary representations of the objects."""
29
+ return [obj.dump() for obj in self]
30
+
31
+ def to_pandas(self) -> pd.DataFrame:
32
+ return pd.DataFrame(self.dump())
33
+
34
+ def _repr_html_(self) -> str:
35
+ return self.to_pandas()._repr_html_() # type: ignore[operator]
cognite/neat/_version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.83.0"
1
+ __version__ = "0.84.0"
@@ -7,7 +7,7 @@ from cognite.client import CogniteClient
7
7
 
8
8
  from cognite.neat.rules._shared import Rules
9
9
  from cognite.neat.rules.models import DMSRules, InformationRules, RoleTypes
10
- from cognite.neat.utils.upload import UploadDiffsCount
10
+ from cognite.neat.utils.upload import UploadResult, UploadResultList
11
11
 
12
12
  T_Export = TypeVar("T_Export")
13
13
 
@@ -37,5 +37,10 @@ class BaseExporter(ABC, Generic[T_Export]):
37
37
 
38
38
  class CDFExporter(BaseExporter[T_Export]):
39
39
  @abstractmethod
40
- def export_to_cdf(self, rules: Rules, client: CogniteClient, dry_run: bool = False) -> Iterable[UploadDiffsCount]:
40
+ def export_to_cdf_iterable(
41
+ self, rules: Rules, client: CogniteClient, dry_run: bool = False
42
+ ) -> Iterable[UploadResult]:
41
43
  raise NotImplementedError
44
+
45
+ def export_to_cdf(self, rules: Rules, client: CogniteClient, dry_run: bool = False) -> UploadResultList:
46
+ return UploadResultList(self.export_to_cdf_iterable(rules, client, dry_run))
@@ -1,5 +1,5 @@
1
1
  import warnings
2
- from collections.abc import Collection, Iterable
2
+ from collections.abc import Collection, Hashable, Iterable, Sequence
3
3
  from pathlib import Path
4
4
  from typing import Literal, TypeAlias, cast
5
5
 
@@ -31,7 +31,7 @@ from cognite.neat.utils.cdf_loaders import (
31
31
  TransformationLoader,
32
32
  ViewLoader,
33
33
  )
34
- from cognite.neat.utils.upload import UploadDiffsCount
34
+ from cognite.neat.utils.upload import UploadResult
35
35
 
36
36
  from ._base import CDFExporter
37
37
 
@@ -123,109 +123,84 @@ class DMSExporter(CDFExporter[DMSSchema]):
123
123
  raise ValueError(f"{type(rules).__name__} cannot be exported to DMS")
124
124
  return dms_rules.as_schema(include_pipeline=self.export_pipeline, instance_space=self.instance_space)
125
125
 
126
- def delete_from_cdf(self, rules: Rules, client: CogniteClient, dry_run: bool = False) -> Iterable[UploadDiffsCount]:
127
- schema, to_export = self._prepare_schema_and_exporters(rules, client)
126
+ def delete_from_cdf(self, rules: Rules, client: CogniteClient, dry_run: bool = False) -> Iterable[UploadResult]:
127
+ to_export = self._prepare_exporters(rules, client)
128
128
 
129
129
  # we need to reverse order in which we are picking up the items to delete
130
130
  # as they are sorted in the order of creation and we need to delete them in reverse order
131
- for all_items, loader in reversed(to_export):
132
- all_item_ids = loader.get_ids(all_items)
133
- item_ids = [item_id for item_id in all_item_ids]
134
- cdf_items = loader.retrieve(item_ids)
135
- cdf_item_by_id = {loader.get_id(item): item for item in cdf_items}
136
- items = [item for item in all_items if loader.get_id(item) in item_ids]
137
- to_delete = []
138
-
139
- for item in items:
131
+ for items, loader in reversed(to_export):
132
+ item_ids = loader.get_ids(items)
133
+ existing_items = loader.retrieve(item_ids)
134
+ existing_ids = loader.get_ids(existing_items)
135
+ to_delete: list[Hashable] = []
136
+ for item_id in item_ids:
140
137
  if (
141
138
  isinstance(loader, DataModelingLoader)
142
139
  and self.include_space is not None
143
- and not loader.in_space(item, self.include_space)
140
+ and not loader.in_space(item_id, self.include_space)
144
141
  ):
145
142
  continue
146
143
 
147
- cdf_item = cdf_item_by_id.get(loader.get_id(item))
148
- if cdf_item:
149
- to_delete.append(cdf_item)
150
-
151
- deleted = len(to_delete)
152
- failed_deleted = 0
144
+ if item_id in existing_ids:
145
+ to_delete.append(item_id)
153
146
 
147
+ deleted: set[Hashable] = set()
148
+ failed_deleted: set[Hashable] = set()
154
149
  error_messages: list[str] = []
155
- if not dry_run:
156
- if to_delete:
157
- try:
158
- loader.delete(to_delete)
159
- except CogniteAPIError as e:
160
- failed_deleted = len(e.failed) + len(e.unknown)
161
- deleted -= failed_deleted
162
- error_messages.append(f"Failed delete: {e.message}")
150
+ if dry_run:
151
+ deleted.update(to_delete)
152
+ elif to_delete:
153
+ try:
154
+ loader.delete(to_delete)
155
+ except CogniteAPIError as e:
156
+ failed_deleted.update(loader.get_id(item) for item in e.failed + e.unknown)
157
+ deleted.update(loader.get_id(item) for item in e.successful)
158
+ error_messages.append(f"Failed delete: {e.message}")
159
+ else:
160
+ deleted.update(to_delete)
163
161
 
164
- yield UploadDiffsCount(
162
+ yield UploadResult(
165
163
  name=loader.resource_name,
166
164
  deleted=deleted,
167
- skipped=0,
168
165
  failed_deleted=failed_deleted,
169
166
  error_messages=error_messages,
170
167
  )
171
168
 
172
- def export_to_cdf(self, rules: Rules, client: CogniteClient, dry_run: bool = False) -> Iterable[UploadDiffsCount]:
173
- schema, to_export = self._prepare_schema_and_exporters(rules, client)
169
+ def export_to_cdf_iterable(
170
+ self, rules: Rules, client: CogniteClient, dry_run: bool = False
171
+ ) -> Iterable[UploadResult]:
172
+ to_export = self._prepare_exporters(rules, client)
174
173
 
175
- # The conversion from DMS to GraphQL does not seem to be triggered even if the views
176
- # are changed. This is a workaround to force the conversion.
177
174
  redeploy_data_model = False
175
+ for items, loader in to_export:
176
+ # The conversion from DMS to GraphQL does not seem to be triggered even if the views
177
+ # are changed. This is a workaround to force the conversion.
178
+ is_redeploying = loader is DataModelingLoader and redeploy_data_model
178
179
 
179
- for all_items, loader in to_export:
180
- issue_list = IssueList()
181
- all_item_ids = loader.get_ids(all_items)
182
- item_ids = [item_id for item_id in all_item_ids]
183
- cdf_items = loader.retrieve(item_ids)
184
- cdf_item_by_id = {loader.get_id(item): item for item in cdf_items}
185
- items = [item for item in all_items if loader.get_id(item) in item_ids]
186
- to_create, to_update, unchanged, to_delete = [], [], [], []
187
- is_redeploying = loader.resource_name == "data_models" and redeploy_data_model
188
- for item in items:
189
- if (
190
- isinstance(loader, DataModelingLoader)
191
- and self.include_space is not None
192
- and not loader.in_space(item, self.include_space)
193
- ):
194
- continue
195
-
196
- cdf_item = cdf_item_by_id.get(loader.get_id(item))
197
- if cdf_item is None:
198
- to_create.append(item)
199
- elif is_redeploying:
200
- to_update.append(item)
201
- to_delete.append(cdf_item)
202
- elif loader.are_equal(item, cdf_item):
203
- unchanged.append(item)
204
- else:
205
- to_update.append(item)
206
-
207
- created = len(to_create)
208
- failed_created = 0
209
- skipped = 0
210
-
211
- if self.existing_handling in ["update", "force"]:
212
- changed = len(to_update)
213
- failed_changed = 0
214
- elif self.existing_handling == "skip":
215
- changed = 0
216
- failed_changed = 0
217
- skipped += len(to_update)
218
- elif self.existing_handling == "fail":
219
- failed_changed = len(to_update)
220
- changed = 0
221
- else:
222
- raise ValueError(f"Unsupported existing_handling {self.existing_handling}")
180
+ to_create, to_delete, to_update, unchanged = self._categorize_items_for_upload(
181
+ loader, items, is_redeploying
182
+ )
223
183
 
184
+ issue_list = IssueList()
224
185
  warning_list = self._validate(loader, items)
225
186
  issue_list.extend(warning_list)
226
187
 
188
+ created: set[Hashable] = set()
189
+ skipped: set[Hashable] = set()
190
+ changed: set[Hashable] = set()
191
+ failed_created: set[Hashable] = set()
192
+ failed_changed: set[Hashable] = set()
227
193
  error_messages: list[str] = []
228
- if not dry_run:
194
+ if dry_run:
195
+ if self.existing_handling in ["update", "force"]:
196
+ changed.update(loader.get_id(item) for item in to_update)
197
+ elif self.existing_handling == "skip":
198
+ skipped.update(loader.get_id(item) for item in to_update)
199
+ elif self.existing_handling == "fail":
200
+ failed_changed.update(loader.get_id(item) for item in to_update)
201
+ else:
202
+ raise ValueError(f"Unsupported existing_handling {self.existing_handling}")
203
+ else:
229
204
  if to_delete:
230
205
  try:
231
206
  loader.delete(to_delete)
@@ -238,23 +213,31 @@ class DMSExporter(CDFExporter[DMSSchema]):
238
213
  try:
239
214
  loader.create(to_create)
240
215
  except CogniteAPIError as e:
241
- failed_created = len(e.failed) + len(e.unknown)
242
- created -= failed_created
216
+ failed_created.update(loader.get_id(item) for item in e.failed + e.unknown)
217
+ created.update(loader.get_id(item) for item in e.successful)
243
218
  error_messages.append(e.message)
219
+ else:
220
+ created.update(loader.get_id(item) for item in to_create)
244
221
 
245
222
  if self.existing_handling in ["update", "force"]:
246
223
  try:
247
224
  loader.update(to_update)
248
225
  except CogniteAPIError as e:
249
- failed_changed = len(e.failed) + len(e.unknown)
250
- changed -= failed_changed
226
+ failed_changed.update(loader.get_id(item) for item in e.failed + e.unknown)
227
+ changed.update(loader.get_id(item) for item in e.successful)
251
228
  error_messages.append(e.message)
252
-
253
- yield UploadDiffsCount(
229
+ else:
230
+ changed.update(loader.get_id(item) for item in to_update)
231
+ elif self.existing_handling == "skip":
232
+ skipped.update(loader.get_id(item) for item in to_update)
233
+ elif self.existing_handling == "fail":
234
+ failed_changed.update(loader.get_id(item) for item in to_update)
235
+
236
+ yield UploadResult(
254
237
  name=loader.resource_name,
255
238
  created=created,
256
239
  changed=changed,
257
- unchanged=len(unchanged),
240
+ unchanged={loader.get_id(item) for item in unchanged},
258
241
  skipped=skipped,
259
242
  failed_created=failed_created,
260
243
  failed_changed=failed_changed,
@@ -262,12 +245,37 @@ class DMSExporter(CDFExporter[DMSSchema]):
262
245
  issues=issue_list,
263
246
  )
264
247
 
265
- if loader.resource_name == "views" and (created or changed) and not redeploy_data_model:
248
+ if loader is ViewLoader and (created or changed):
266
249
  redeploy_data_model = True
267
250
 
268
- def _prepare_schema_and_exporters(
269
- self, rules, client
270
- ) -> tuple[DMSSchema, list[tuple[CogniteResourceList, ResourceLoader]]]:
251
+ def _categorize_items_for_upload(
252
+ self, loader: ResourceLoader, items: Sequence[CogniteResource], is_redeploying
253
+ ) -> tuple[list[CogniteResource], list[CogniteResource], list[CogniteResource], list[CogniteResource]]:
254
+ item_ids = loader.get_ids(items)
255
+ cdf_items = loader.retrieve(item_ids)
256
+ cdf_item_by_id = {loader.get_id(item): item for item in cdf_items}
257
+ to_create, to_update, unchanged, to_delete = [], [], [], []
258
+ for item in items:
259
+ if (
260
+ isinstance(loader, DataModelingLoader)
261
+ and self.include_space is not None
262
+ and not loader.in_space(item, self.include_space)
263
+ ):
264
+ continue
265
+
266
+ cdf_item = cdf_item_by_id.get(loader.get_id(item))
267
+ if cdf_item is None:
268
+ to_create.append(item)
269
+ elif is_redeploying:
270
+ to_update.append(item)
271
+ to_delete.append(cdf_item)
272
+ elif loader.are_equal(item, cdf_item):
273
+ unchanged.append(item)
274
+ else:
275
+ to_update.append(item)
276
+ return to_create, to_delete, to_update, unchanged
277
+
278
+ def _prepare_exporters(self, rules, client) -> list[tuple[CogniteResourceList, ResourceLoader]]:
271
279
  schema = self.export(rules)
272
280
  to_export: list[tuple[CogniteResourceList, ResourceLoader]] = []
273
281
  if self.export_components.intersection({"all", "spaces"}):
@@ -282,9 +290,9 @@ class DMSExporter(CDFExporter[DMSSchema]):
282
290
  to_export.append((schema.databases, RawDatabaseLoader(client)))
283
291
  to_export.append((schema.raw_tables, RawTableLoader(client)))
284
292
  to_export.append((schema.transformations, TransformationLoader(client)))
285
- return schema, to_export
293
+ return to_export
286
294
 
287
- def _validate(self, loader: ResourceLoader, items: list[CogniteResource]) -> IssueList:
295
+ def _validate(self, loader: ResourceLoader, items: CogniteResourceList) -> IssueList:
288
296
  issue_list = IssueList()
289
297
  if isinstance(loader, DataModelLoader):
290
298
  models = cast(list[DataModelApply], items)
@@ -9,18 +9,10 @@ from cognite.client.data_classes._base import (
9
9
  T_WriteClass,
10
10
  WriteableCogniteResourceList,
11
11
  )
12
- from cognite.client.data_classes.data_modeling import (
13
- DataModelingId,
14
- )
15
- from cognite.client.data_classes.data_modeling.ids import (
16
- InstanceId,
17
- VersionedDataModelingId,
18
- )
19
12
  from cognite.client.utils.useful_types import SequenceNotStr
20
13
 
21
- from .data_classes import RawTableID
14
+ from cognite.neat._shared import T_ID
22
15
 
23
- T_ID = TypeVar("T_ID", bound=str | int | DataModelingId | InstanceId | VersionedDataModelingId | RawTableID)
24
16
  T_WritableCogniteResourceList = TypeVar("T_WritableCogniteResourceList", bound=WriteableCogniteResourceList)
25
17
 
26
18
 
@@ -41,7 +41,8 @@ from ._base import T_ID, ResourceLoader, T_WritableCogniteResourceList
41
41
  class DataModelingLoader(
42
42
  ResourceLoader[T_ID, T_WriteClass, T_WritableCogniteResource, T_CogniteResourceList, T_WritableCogniteResourceList]
43
43
  ):
44
- def in_space(self, item: T_WriteClass | T_WritableCogniteResource, space: set[str]) -> bool:
44
+ @classmethod
45
+ def in_space(cls, item: T_WriteClass | T_WritableCogniteResource | T_ID, space: set[str]) -> bool:
45
46
  if hasattr(item, "space"):
46
47
  return item.space in space
47
48
  raise ValueError(f"Item {item} does not have a space attribute")
@@ -1,69 +1,89 @@
1
1
  from abc import ABC
2
2
  from dataclasses import dataclass, field
3
3
  from functools import total_ordering
4
+ from typing import Any, Generic
4
5
 
6
+ from cognite.neat._shared import T_ID, NeatList, NeatObject
5
7
  from cognite.neat.issues import NeatIssueList
6
8
 
7
9
 
8
10
  @total_ordering
9
11
  @dataclass
10
- class UploadResultCore(ABC):
12
+ class UploadResultCore(NeatObject, ABC):
11
13
  name: str
12
14
  error_messages: list[str] = field(default_factory=list)
13
15
  issues: NeatIssueList = field(default_factory=NeatIssueList)
14
16
 
15
17
  def __lt__(self, other: object) -> bool:
16
- if isinstance(other, UploadDiffsCount):
18
+ if isinstance(other, UploadResultCore):
17
19
  return self.name < other.name
18
20
  else:
19
21
  return NotImplemented
20
22
 
21
23
  def __eq__(self, other: object) -> bool:
22
- if isinstance(other, UploadDiffsCount):
24
+ if isinstance(other, UploadResultCore):
23
25
  return self.name == other.name
24
26
  else:
25
27
  return NotImplemented
26
28
 
29
+ def dump(self, aggregate: bool = True) -> dict[str, Any]:
30
+ return {"name": self.name}
31
+
32
+
33
+ class UploadResultList(NeatList[UploadResultCore]): ...
34
+
27
35
 
28
36
  @dataclass
29
- class UploadDiffsCount(UploadResultCore):
30
- created: int = 0
31
- deleted: int = 0
32
- changed: int = 0
33
- unchanged: int = 0
34
- skipped: int = 0
35
- failed_created: int = 0
36
- failed_changed: int = 0
37
- failed_deleted: int = 0
37
+ class UploadResult(UploadResultCore, Generic[T_ID]):
38
+ created: set[T_ID] = field(default_factory=set)
39
+ deleted: set[T_ID] = field(default_factory=set)
40
+ changed: set[T_ID] = field(default_factory=set)
41
+ unchanged: set[T_ID] = field(default_factory=set)
42
+ skipped: set[T_ID] = field(default_factory=set)
43
+ failed_created: set[T_ID] = field(default_factory=set)
44
+ failed_changed: set[T_ID] = field(default_factory=set)
45
+ failed_deleted: set[T_ID] = field(default_factory=set)
38
46
 
39
47
  @property
40
- def total(self) -> int:
41
- return self.created + self.deleted + self.changed + self.unchanged
48
+ def failed(self) -> int:
49
+ return len(self.failed_created) + len(self.failed_changed) + len(self.failed_deleted)
42
50
 
43
51
  @property
44
- def failed(self) -> int:
45
- return self.failed_created + self.failed_changed + self.failed_deleted
52
+ def total(self) -> int:
53
+ return len(self.created) + len(self.deleted) + len(self.changed) + len(self.unchanged) + len(self.skipped)
46
54
 
47
- def as_report_str(self) -> str:
48
- line = []
55
+ def dump(self, aggregate: bool = True) -> dict[str, Any]:
56
+ output = super().dump(aggregate)
49
57
  if self.created:
50
- line.append(f"created {self.created}")
58
+ output["created"] = len(self.created) if aggregate else list(self.created)
59
+ if self.deleted:
60
+ output["deleted"] = len(self.deleted) if aggregate else list(self.deleted)
51
61
  if self.changed:
52
- line.append(f"updated {self.changed}")
53
- if self.skipped:
54
- line.append(f"skipped {self.skipped}")
62
+ output["changed"] = len(self.changed) if aggregate else list(self.changed)
55
63
  if self.unchanged:
56
- line.append(f"unchanged {self.unchanged}")
57
- if self.deleted:
58
- line.append(f"deleted {self.deleted}")
64
+ output["unchanged"] = len(self.unchanged) if aggregate else list(self.unchanged)
65
+ if self.skipped:
66
+ output["skipped"] = len(self.skipped) if aggregate else list(self.skipped)
59
67
  if self.failed_created:
60
- line.append(f"failed to create {self.failed_created}")
68
+ output["failed_created"] = len(self.failed_created) if aggregate else list(self.failed_created)
61
69
  if self.failed_changed:
62
- line.append(f"failed to update {self.failed_changed}")
70
+ output["failed_changed"] = len(self.failed_changed) if aggregate else list(self.failed_changed)
63
71
  if self.failed_deleted:
64
- line.append(f"failed to delete {self.failed_deleted}")
65
-
66
- return f"{self.name.title()}: {', '.join(line)}"
72
+ output["failed_deleted"] = len(self.failed_deleted) if aggregate else list(self.failed_deleted)
73
+ if self.error_messages:
74
+ output["error_messages"] = len(self.error_messages) if aggregate else self.error_messages
75
+ if self.issues:
76
+ output["issues"] = len(self.issues) if aggregate else [issue.dump() for issue in self.issues]
77
+ return output
78
+
79
+ def __str__(self) -> str:
80
+ dumped = self.dump(aggregate=True)
81
+ lines: list[str] = []
82
+ for key, value in dumped.items():
83
+ if key in ["name", "error_messages", "issues"]:
84
+ continue
85
+ lines.append(f"{key}: {value}")
86
+ return f"{self.name.title()}: {', '.join(lines)}"
67
87
 
68
88
 
69
89
  @dataclass
@@ -71,6 +91,14 @@ class UploadResultIDs(UploadResultCore):
71
91
  success: list[str] = field(default_factory=list)
72
92
  failed: list[str] = field(default_factory=list)
73
93
 
94
+ def dump(self, aggregate: bool = True) -> dict[str, Any]:
95
+ output = super().dump(aggregate)
96
+ if self.success:
97
+ output["success"] = len(self.success) if aggregate else self.success
98
+ if self.failed:
99
+ output["failed"] = len(self.failed) if aggregate else self.failed
100
+ return output
101
+
74
102
 
75
103
  @dataclass
76
104
  class UploadDiffsID(UploadResultCore):
@@ -84,3 +112,15 @@ class UploadDiffsID(UploadResultCore):
84
112
  result.success = self.created + self.changed + self.unchanged
85
113
  result.failed = self.failed
86
114
  return result
115
+
116
+ def dump(self, aggregate: bool = True) -> dict[str, Any]:
117
+ output = super().dump(aggregate)
118
+ if self.created:
119
+ output["created"] = len(self.created) if aggregate else self.created
120
+ if self.changed:
121
+ output["changed"] = len(self.changed) if aggregate else self.changed
122
+ if self.unchanged:
123
+ output["unchanged"] = len(self.unchanged) if aggregate else self.unchanged
124
+ if self.failed:
125
+ output["failed"] = len(self.failed) if aggregate else self.failed
126
+ return output
@@ -95,7 +95,7 @@ class DeleteDataModelFromCDF(Step):
95
95
  report_lines = ["# Data Model Deletion from CDF\n\n"]
96
96
  errors = []
97
97
  for result in dms_exporter.delete_from_cdf(rules=input_rules, client=cdf_client, dry_run=dry_run):
98
- report_lines.append(result.as_report_str())
98
+ report_lines.append(str(result))
99
99
  errors.extend(result.error_messages)
100
100
 
101
101
  report_lines.append("\n\n# ERRORS\n\n")
@@ -216,8 +216,8 @@ class RulesToDMS(Step):
216
216
 
217
217
  report_lines = ["# DMS Schema Export to CDF\n\n"]
218
218
  errors = []
219
- for result in dms_exporter.export_to_cdf(rules=input_rules, client=cdf_client, dry_run=dry_run):
220
- report_lines.append(result.as_report_str())
219
+ for result in dms_exporter.export_to_cdf_iterable(rules=input_rules, client=cdf_client, dry_run=dry_run):
220
+ report_lines.append(str(result))
221
221
  errors.extend(result.error_messages)
222
222
 
223
223
  report_lines.append("\n\n# ERRORS\n\n")
@@ -555,8 +555,8 @@ class RulesToCDFTransformations(Step):
555
555
 
556
556
  report_lines = ["# DMS Schema Export to CDF\n\n"]
557
557
  errors = []
558
- for result in dms_exporter.export_to_cdf(rules=input_rules, client=cdf_client, dry_run=dry_run):
559
- report_lines.append(result.as_report_str())
558
+ for result in dms_exporter.export_to_cdf_iterable(rules=input_rules, client=cdf_client, dry_run=dry_run):
559
+ report_lines.append(str(result))
560
560
  errors.extend(result.error_messages)
561
561
 
562
562
  report_lines.append("\n\n# ERRORS\n\n")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cognite-neat
3
- Version: 0.83.0
3
+ Version: 0.84.0
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,6 @@
1
1
  cognite/neat/__init__.py,sha256=v-rRiDOgZ3sQSMQKq0vgUQZvpeOkoHFXissAx6Ktg84,61
2
- cognite/neat/_version.py,sha256=FwfsRG64Uncan1BBCrMrXMKjMO1MhfWoBbdMOZk1GnU,23
2
+ cognite/neat/_shared.py,sha256=afQiTM0SvIKqeBRTvpfwwIvZL7QMQevt4F7lqRagAFg,968
3
+ cognite/neat/_version.py,sha256=KIiYae8LGfAm2z2vAqeoEPgeYngLtYMZnQCGOUKk3Nk,23
3
4
  cognite/neat/app/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
5
  cognite/neat/app/api/asgi/metrics.py,sha256=nxFy7L5cChTI0a-zkCiJ59Aq8yLuIJp5c9Dg0wRXtV0,152
5
6
  cognite/neat/app/api/configuration.py,sha256=2U5M6M252swvQPQyooA1EBzFUZNtcTmuSaywfJDgckM,4232
@@ -187,8 +188,8 @@ cognite/neat/rules/examples/__init__.py,sha256=nxIwueAcHgZhkYriGxnDLQmIyiT8PByPH
187
188
  cognite/neat/rules/examples/wind-energy.owl,sha256=NuomCA9FuuLF0JlSuG3OKqD4VBcHgSjDKFLV17G1zV8,65934
188
189
  cognite/neat/rules/exceptions.py,sha256=YLnsbXXJdDSr_szQoioEtOdqDV8PR7RdQjpMP2SWeCs,123868
189
190
  cognite/neat/rules/exporters/__init__.py,sha256=Gn3CjkVKHJF9Po1ZPH4wAJ-sRW9up7b2CpXm-eReV3Q,413
190
- cognite/neat/rules/exporters/_base.py,sha256=3eLIzZ3ddVVQGV7qQn-hKV0U_lPMBQzC4AblTKYzaEA,1535
191
- cognite/neat/rules/exporters/_rules2dms.py,sha256=e9veycUKfZ5NFDC_ar08hNd-LWrZAva_bRFa9VfI8AA,13725
191
+ cognite/neat/rules/exporters/_base.py,sha256=TkdpmliKjKVDITBAE4ySq_Zc8edFDQzHkbvHll4ODkg,1763
192
+ cognite/neat/rules/exporters/_rules2dms.py,sha256=xnmq4FbMAvYVtJzDM-wwTRwVq_t3XWf8ffmhpE27BSk,14547
192
193
  cognite/neat/rules/exporters/_rules2excel.py,sha256=HvUdXYHxfLMijYWdTnfqCsw3Izf8S-XDSve-2ZbqF8Y,14248
193
194
  cognite/neat/rules/exporters/_rules2ontology.py,sha256=Od53uLdcC2Q7UiF5PA2P0gw3O14eTD3MeJ1-trd64ZM,20388
194
195
  cognite/neat/rules/exporters/_rules2yaml.py,sha256=GA8eUYRxUfIU6IMvlyGO5JidkOD5eUKSbH3qAiFiaCg,3026
@@ -253,14 +254,14 @@ cognite/neat/utils/auxiliary.py,sha256=E2-YtddzScvN7l7j0kNYIMlfqIUT9NWMqLpcJYPK4
253
254
  cognite/neat/utils/cdf.py,sha256=piRx-6GRz4cCfBZD5rU0OM6ixQ3cj5TMzI0yCYUveR8,2422
254
255
  cognite/neat/utils/cdf_classes.py,sha256=NEmz5UprBlqfqZnqJkRk5xjSpzazwHbhcWsMH_GNxP8,5831
255
256
  cognite/neat/utils/cdf_loaders/__init__.py,sha256=s2aPR5XLo6WZ0ybstAJlcGFYkA7CyHW1XO-NYpL0V6o,483
256
- cognite/neat/utils/cdf_loaders/_base.py,sha256=j85HINIx4poGD-0dN3JPHTqjOS1XhCxv7G9s1gC1GBo,2057
257
- cognite/neat/utils/cdf_loaders/_data_modeling.py,sha256=RoIj2cL_j3vP6e4BlCExZU8d96p3dLitU9nsIIyesLc,11336
257
+ cognite/neat/utils/cdf_loaders/_base.py,sha256=ryNC_AMXIESWXuTVJ-02L-HSVSpD6V49XdLTRYeFg70,1764
258
+ cognite/neat/utils/cdf_loaders/_data_modeling.py,sha256=-owgamlYnB4-hnvsvWiGPFcnvkKs0EzrrWmIKhnvBpI,11359
258
259
  cognite/neat/utils/cdf_loaders/_ingestion.py,sha256=_2G8BObvpZ-vTHaCMAW_-ckHBLY96Hbg27uKAvpCaWk,6303
259
260
  cognite/neat/utils/cdf_loaders/data_classes.py,sha256=0apspfwVlFltYOZfmk_PNknS3Z3SCxVr3kkvXH0bfPA,3844
260
261
  cognite/neat/utils/exceptions.py,sha256=-w4cAcvcoWLf-_ZwAl7QV_NysfqtQzIOd1Ti-mpxJgM,981
261
262
  cognite/neat/utils/spreadsheet.py,sha256=LI0c7dlW0zXHkHw0NvB-gg6Df6cDcE3FbiaHBYLXdzQ,2714
262
263
  cognite/neat/utils/text.py,sha256=4bg1_Q0lg7KsoxaDOvXrVyeY78BJN8i-27BlyDzUCls,3082
263
- cognite/neat/utils/upload.py,sha256=XaAKqyMhz6qXbUrttGNIXZxFRPJvrnbMpDRF8GEiK2g,2707
264
+ cognite/neat/utils/upload.py,sha256=opAB8oDtpgcrugcjbUg0tjGqtFUnAS7zixtLiRYZ3TA,5084
264
265
  cognite/neat/utils/utils.py,sha256=1LEwR8gpHw_6pvEeLkW_cDU_lUun4qSsw_Rr3JsKwgA,14172
265
266
  cognite/neat/utils/xml.py,sha256=ppLT3lQKVp8wOP-m8-tFY8uB2P4R76l7R_-kUtsABng,992
266
267
  cognite/neat/workflows/__init__.py,sha256=oiKub_U9f5cA0I1nKl5dFkR4BD8_6Be9eMzQ_50PwP0,396
@@ -289,7 +290,7 @@ cognite/neat/workflows/steps/lib/current/__init__.py,sha256=c22IznGdCSNCpXCi_yon
289
290
  cognite/neat/workflows/steps/lib/current/graph_extractor.py,sha256=vW9UpJScx5dFVCSairpOdWRdBdLpkCt2kNh6litbF0o,5161
290
291
  cognite/neat/workflows/steps/lib/current/graph_loader.py,sha256=HfGg1HRZhbV58TFu89FTjKeUxGsbCYLeFJIQFDN_pQM,2341
291
292
  cognite/neat/workflows/steps/lib/current/graph_store.py,sha256=r7VTxdaz8jJQU7FJbnRDMxvEYbSAZFNMABhPyfNwiFk,6295
292
- cognite/neat/workflows/steps/lib/current/rules_exporter.py,sha256=iFwzDWgUDBSPajaNAcXvu9pVw-jX66upvwyMXyTq7SE,23822
293
+ cognite/neat/workflows/steps/lib/current/rules_exporter.py,sha256=1SKBYDnyDr975oMr9aOQVHExHjPQ0-whDDBNpTQ4K1A,23807
293
294
  cognite/neat/workflows/steps/lib/current/rules_importer.py,sha256=23dxamGHSbJoG7qUqL4KiGznSmDTVHw1EfqhLCeAwDM,14695
294
295
  cognite/neat/workflows/steps/lib/current/rules_validator.py,sha256=LwF9lXlnuPOxDSsOMMTHBi2BHc5rk08IF5zahS9yQuw,4844
295
296
  cognite/neat/workflows/steps/lib/io/__init__.py,sha256=k7IPbIq3ey19oRc5sA_15F99-O6dxzqbm1LihGRRo5A,32
@@ -307,8 +308,8 @@ cognite/neat/workflows/steps_registry.py,sha256=fkTX14ZA7_gkUYfWIlx7A1XbCidvqR23
307
308
  cognite/neat/workflows/tasks.py,sha256=dqlJwKAb0jlkl7abbY8RRz3m7MT4SK8-7cntMWkOYjw,788
308
309
  cognite/neat/workflows/triggers.py,sha256=_BLNplzoz0iic367u1mhHMHiUrCwP-SLK6_CZzfODX0,7071
309
310
  cognite/neat/workflows/utils.py,sha256=gKdy3RLG7ctRhbCRwaDIWpL9Mi98zm56-d4jfHDqP1E,453
310
- cognite_neat-0.83.0.dist-info/LICENSE,sha256=W8VmvFia4WHa3Gqxq1Ygrq85McUNqIGDVgtdvzT-XqA,11351
311
- cognite_neat-0.83.0.dist-info/METADATA,sha256=ghwKVMP-mGJe6-Akz2QknoGas7foq5rsCPA8qVzg200,9400
312
- cognite_neat-0.83.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
313
- cognite_neat-0.83.0.dist-info/entry_points.txt,sha256=61FPqiWb25vbqB0KI7znG8nsg_ibLHBvTjYnkPvNFso,50
314
- cognite_neat-0.83.0.dist-info/RECORD,,
311
+ cognite_neat-0.84.0.dist-info/LICENSE,sha256=W8VmvFia4WHa3Gqxq1Ygrq85McUNqIGDVgtdvzT-XqA,11351
312
+ cognite_neat-0.84.0.dist-info/METADATA,sha256=zZPlQ6y1y-rn-rkHusErmEcs7iMxe--hFR_DBM8wYao,9400
313
+ cognite_neat-0.84.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
314
+ cognite_neat-0.84.0.dist-info/entry_points.txt,sha256=61FPqiWb25vbqB0KI7znG8nsg_ibLHBvTjYnkPvNFso,50
315
+ cognite_neat-0.84.0.dist-info/RECORD,,