cognite-neat 0.82.3__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.
- cognite/neat/_shared.py +35 -0
- cognite/neat/_version.py +1 -1
- cognite/neat/legacy/rules/examples/power-grid-containers.yaml +8 -0
- cognite/neat/legacy/rules/examples/power-grid-model.yaml +8 -0
- cognite/neat/rules/exporters/_base.py +7 -2
- cognite/neat/rules/exporters/_rules2dms.py +100 -92
- cognite/neat/rules/models/dms/_schema.py +1 -0
- cognite/neat/utils/cdf_loaders/_base.py +1 -9
- cognite/neat/utils/cdf_loaders/_data_modeling.py +2 -1
- cognite/neat/utils/upload.py +70 -30
- cognite/neat/workflows/migration/steps.py +3 -5
- cognite/neat/workflows/steps/lib/current/rules_exporter.py +5 -5
- {cognite_neat-0.82.3.dist-info → cognite_neat-0.84.0.dist-info}/METADATA +11 -11
- {cognite_neat-0.82.3.dist-info → cognite_neat-0.84.0.dist-info}/RECORD +17 -16
- {cognite_neat-0.82.3.dist-info → cognite_neat-0.84.0.dist-info}/LICENSE +0 -0
- {cognite_neat-0.82.3.dist-info → cognite_neat-0.84.0.dist-info}/WHEEL +0 -0
- {cognite_neat-0.82.3.dist-info → cognite_neat-0.84.0.dist-info}/entry_points.txt +0 -0
cognite/neat/_shared.py
ADDED
|
@@ -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.
|
|
1
|
+
__version__ = "0.84.0"
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
properties:
|
|
4
4
|
name:
|
|
5
5
|
autoIncrement: false
|
|
6
|
+
immutable: false
|
|
6
7
|
defaultValue: null
|
|
7
8
|
description: 'The name that identifies Greographical
|
|
8
9
|
|
|
@@ -20,6 +21,7 @@
|
|
|
20
21
|
properties:
|
|
21
22
|
aliasName:
|
|
22
23
|
autoIncrement: false
|
|
24
|
+
immutable: false
|
|
23
25
|
defaultValue: null
|
|
24
26
|
description: 'The alternative name that identifies Substation
|
|
25
27
|
|
|
@@ -32,6 +34,7 @@
|
|
|
32
34
|
type: text
|
|
33
35
|
name:
|
|
34
36
|
autoIncrement: false
|
|
37
|
+
immutable: false
|
|
35
38
|
defaultValue: null
|
|
36
39
|
description: 'The name that identifies Terminal
|
|
37
40
|
|
|
@@ -44,6 +47,7 @@
|
|
|
44
47
|
type: text
|
|
45
48
|
substation:
|
|
46
49
|
autoIncrement: false
|
|
50
|
+
immutable: false
|
|
47
51
|
defaultValue: null
|
|
48
52
|
description: 'Substation to which terminal belongs to
|
|
49
53
|
|
|
@@ -61,6 +65,7 @@
|
|
|
61
65
|
properties:
|
|
62
66
|
name:
|
|
63
67
|
autoIncrement: false
|
|
68
|
+
immutable: false
|
|
64
69
|
defaultValue: null
|
|
65
70
|
description: 'The name that identifies SubGreographical
|
|
66
71
|
|
|
@@ -73,6 +78,7 @@
|
|
|
73
78
|
type: text
|
|
74
79
|
region:
|
|
75
80
|
autoIncrement: false
|
|
81
|
+
immutable: false
|
|
76
82
|
defaultValue: null
|
|
77
83
|
description: 'Region to which subgeographical region belongs to
|
|
78
84
|
|
|
@@ -90,6 +96,7 @@
|
|
|
90
96
|
properties:
|
|
91
97
|
name:
|
|
92
98
|
autoIncrement: false
|
|
99
|
+
immutable: false
|
|
93
100
|
defaultValue: null
|
|
94
101
|
description: 'The name that identifies Substation
|
|
95
102
|
|
|
@@ -102,6 +109,7 @@
|
|
|
102
109
|
type: text
|
|
103
110
|
subGeographicalRegion:
|
|
104
111
|
autoIncrement: false
|
|
112
|
+
immutable: false
|
|
105
113
|
defaultValue: null
|
|
106
114
|
description: 'The subgeographical region containing the substation
|
|
107
115
|
|
|
@@ -23,6 +23,7 @@ views:
|
|
|
23
23
|
type: text
|
|
24
24
|
nullable: false
|
|
25
25
|
autoIncrement: false
|
|
26
|
+
immutable: false
|
|
26
27
|
source: null
|
|
27
28
|
defaultValue: null
|
|
28
29
|
name: name
|
|
@@ -67,6 +68,7 @@ views:
|
|
|
67
68
|
type: text
|
|
68
69
|
nullable: false
|
|
69
70
|
autoIncrement: false
|
|
71
|
+
immutable: false
|
|
70
72
|
source: null
|
|
71
73
|
defaultValue: null
|
|
72
74
|
name: name
|
|
@@ -88,6 +90,7 @@ views:
|
|
|
88
90
|
version: "1"
|
|
89
91
|
nullable: true
|
|
90
92
|
autoIncrement: false
|
|
93
|
+
immutable: false
|
|
91
94
|
defaultValue: null
|
|
92
95
|
name: region
|
|
93
96
|
description: "Region to which subgeographical region belongs to
|
|
@@ -119,6 +122,7 @@ views:
|
|
|
119
122
|
type: text
|
|
120
123
|
nullable: false
|
|
121
124
|
autoIncrement: false
|
|
125
|
+
immutable: false
|
|
122
126
|
source: null
|
|
123
127
|
defaultValue: null
|
|
124
128
|
name: name
|
|
@@ -140,6 +144,7 @@ views:
|
|
|
140
144
|
version: bbe4295878a47f
|
|
141
145
|
nullable: true
|
|
142
146
|
autoIncrement: false
|
|
147
|
+
immutable: false
|
|
143
148
|
defaultValue: null
|
|
144
149
|
name: subGeographicalRegion
|
|
145
150
|
description: "The subgeographical region containing the substation
|
|
@@ -166,6 +171,7 @@ views:
|
|
|
166
171
|
type: text
|
|
167
172
|
nullable: false
|
|
168
173
|
autoIncrement: false
|
|
174
|
+
immutable: false
|
|
169
175
|
source: null
|
|
170
176
|
defaultValue: null
|
|
171
177
|
name: name
|
|
@@ -183,6 +189,7 @@ views:
|
|
|
183
189
|
type: text
|
|
184
190
|
nullable: true
|
|
185
191
|
autoIncrement: false
|
|
192
|
+
immutable: false
|
|
186
193
|
source: null
|
|
187
194
|
defaultValue: null
|
|
188
195
|
name: aliasName
|
|
@@ -204,6 +211,7 @@ views:
|
|
|
204
211
|
version: "1"
|
|
205
212
|
nullable: true
|
|
206
213
|
autoIncrement: false
|
|
214
|
+
immutable: false
|
|
207
215
|
defaultValue: null
|
|
208
216
|
name: substation
|
|
209
217
|
description: "Substation to which terminal belongs to
|
|
@@ -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
|
|
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
|
|
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
|
|
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[
|
|
127
|
-
|
|
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
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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(
|
|
140
|
+
and not loader.in_space(item_id, self.include_space)
|
|
144
141
|
):
|
|
145
142
|
continue
|
|
146
143
|
|
|
147
|
-
|
|
148
|
-
|
|
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
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
|
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
|
|
173
|
-
|
|
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
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
|
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
|
|
242
|
-
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
|
|
250
|
-
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
|
-
|
|
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=
|
|
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
|
|
248
|
+
if loader is ViewLoader and (created or changed):
|
|
266
249
|
redeploy_data_model = True
|
|
267
250
|
|
|
268
|
-
def
|
|
269
|
-
self,
|
|
270
|
-
) -> tuple[
|
|
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
|
|
293
|
+
return to_export
|
|
286
294
|
|
|
287
|
-
def _validate(self, loader: ResourceLoader, items:
|
|
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)
|
|
@@ -746,6 +746,7 @@ class DMSSchema:
|
|
|
746
746
|
type=container_prop.type,
|
|
747
747
|
nullable=container_prop.nullable,
|
|
748
748
|
auto_increment=container_prop.auto_increment,
|
|
749
|
+
immutable=container_prop.immutable,
|
|
749
750
|
# Likely bug in SDK.
|
|
750
751
|
default_value=container_prop.default_value, # type: ignore[arg-type]
|
|
751
752
|
)
|
|
@@ -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 .
|
|
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
|
-
|
|
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")
|
cognite/neat/utils/upload.py
CHANGED
|
@@ -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,
|
|
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,
|
|
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
|
|
30
|
-
created:
|
|
31
|
-
deleted:
|
|
32
|
-
changed:
|
|
33
|
-
unchanged:
|
|
34
|
-
skipped:
|
|
35
|
-
failed_created:
|
|
36
|
-
failed_changed:
|
|
37
|
-
failed_deleted:
|
|
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
|
|
41
|
-
return self.
|
|
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
|
|
45
|
-
return self.
|
|
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
|
|
48
|
-
|
|
55
|
+
def dump(self, aggregate: bool = True) -> dict[str, Any]:
|
|
56
|
+
output = super().dump(aggregate)
|
|
49
57
|
if self.created:
|
|
50
|
-
|
|
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
|
-
|
|
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
|
-
|
|
57
|
-
if self.
|
|
58
|
-
|
|
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
|
-
|
|
68
|
+
output["failed_created"] = len(self.failed_created) if aggregate else list(self.failed_created)
|
|
61
69
|
if self.failed_changed:
|
|
62
|
-
|
|
70
|
+
output["failed_changed"] = len(self.failed_changed) if aggregate else list(self.failed_changed)
|
|
63
71
|
if self.failed_deleted:
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from pathlib import Path
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
import yaml
|
|
4
4
|
|
|
5
5
|
# Migration mapping
|
|
6
6
|
|
|
@@ -62,9 +62,7 @@ step_rename_mapping = {
|
|
|
62
62
|
|
|
63
63
|
def rename_workflow_steps(workflow_path: Path, dry_run: bool) -> str:
|
|
64
64
|
# Load the YAML file
|
|
65
|
-
|
|
66
|
-
with workflow_path.open() as file:
|
|
67
|
-
data = yaml.load(file)
|
|
65
|
+
data = yaml.safe_load(workflow_path.read_text())
|
|
68
66
|
# Replace old step names with new ones
|
|
69
67
|
for step in data["steps"]:
|
|
70
68
|
if step["method"] in step_rename_mapping:
|
|
@@ -73,7 +71,7 @@ def rename_workflow_steps(workflow_path: Path, dry_run: bool) -> str:
|
|
|
73
71
|
|
|
74
72
|
# Save the updated YAML file
|
|
75
73
|
with workflow_path.open("w") as file:
|
|
76
|
-
yaml.
|
|
74
|
+
yaml.safe_dump(data, file)
|
|
77
75
|
return "ok"
|
|
78
76
|
|
|
79
77
|
|
|
@@ -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
|
|
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.
|
|
220
|
-
report_lines.append(result
|
|
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.
|
|
559
|
-
report_lines.append(result
|
|
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.
|
|
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
|
|
@@ -17,15 +17,16 @@ Provides-Extra: docs
|
|
|
17
17
|
Provides-Extra: google
|
|
18
18
|
Provides-Extra: graphql
|
|
19
19
|
Provides-Extra: oxi
|
|
20
|
+
Provides-Extra: service
|
|
20
21
|
Requires-Dist: PyYAML
|
|
21
22
|
Requires-Dist: backports.strenum (>=1.2,<2.0) ; python_version < "3.11"
|
|
22
|
-
Requires-Dist: cognite-sdk (>=7.
|
|
23
|
+
Requires-Dist: cognite-sdk (>=7.52.0,<8.0.0)
|
|
23
24
|
Requires-Dist: deepdiff
|
|
24
25
|
Requires-Dist: exceptiongroup (>=1.1.3,<2.0.0) ; python_version < "3.11"
|
|
25
|
-
Requires-Dist: fastapi (>=0,<1)
|
|
26
|
-
Requires-Dist: google-api-python-client ; extra == "google"
|
|
27
|
-
Requires-Dist: google-auth-oauthlib ; extra == "google"
|
|
28
|
-
Requires-Dist: gspread ; extra == "google"
|
|
26
|
+
Requires-Dist: fastapi (>=0,<1) ; extra == "service" or extra == "all"
|
|
27
|
+
Requires-Dist: google-api-python-client ; extra == "google"
|
|
28
|
+
Requires-Dist: google-auth-oauthlib ; extra == "google"
|
|
29
|
+
Requires-Dist: gspread ; extra == "google"
|
|
29
30
|
Requires-Dist: jinja2 (>=3.1.2,<4.0.0) ; extra == "graphql" or extra == "all"
|
|
30
31
|
Requires-Dist: mkdocs ; extra == "docs"
|
|
31
32
|
Requires-Dist: mkdocs-autorefs (>=0.5.0,<0.6.0) ; extra == "docs"
|
|
@@ -39,18 +40,17 @@ Requires-Dist: mkdocstrings[python] ; extra == "docs"
|
|
|
39
40
|
Requires-Dist: openpyxl
|
|
40
41
|
Requires-Dist: oxrdflib[oxigraph] (>=0.3.3,<0.4.0) ; extra == "oxi" or extra == "all"
|
|
41
42
|
Requires-Dist: pandas
|
|
42
|
-
Requires-Dist: prometheus-client (>=0
|
|
43
|
+
Requires-Dist: prometheus-client (>=0,<1) ; extra == "service" or extra == "all"
|
|
43
44
|
Requires-Dist: pydantic (>=2,<3)
|
|
44
45
|
Requires-Dist: pymdown-extensions ; extra == "docs"
|
|
45
|
-
Requires-Dist: pyoxigraph (==0.3.19)
|
|
46
|
-
Requires-Dist: python-multipart (>=0,<1)
|
|
46
|
+
Requires-Dist: pyoxigraph (==0.3.19) ; extra == "oxi" or extra == "all"
|
|
47
47
|
Requires-Dist: rdflib
|
|
48
48
|
Requires-Dist: requests
|
|
49
|
-
Requires-Dist: schedule (>=1,<2)
|
|
49
|
+
Requires-Dist: schedule (>=1,<2) ; extra == "service" or extra == "all"
|
|
50
50
|
Requires-Dist: tomli (>=2.0.1,<3.0.0) ; python_version < "3.11"
|
|
51
51
|
Requires-Dist: typing_extensions (>=4.8,<5.0) ; python_version < "3.11"
|
|
52
52
|
Requires-Dist: urllib3 (>=2,<3)
|
|
53
|
-
Requires-Dist: uvicorn[standard] (>=0,<1)
|
|
53
|
+
Requires-Dist: uvicorn[standard] (>=0,<1) ; extra == "service" or extra == "all"
|
|
54
54
|
Project-URL: Documentation, https://cognite-neat.readthedocs-hosted.com/
|
|
55
55
|
Project-URL: Repository, https://github.com/cognitedata/neat
|
|
56
56
|
Description-Content-Type: text/markdown
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
cognite/neat/__init__.py,sha256=v-rRiDOgZ3sQSMQKq0vgUQZvpeOkoHFXissAx6Ktg84,61
|
|
2
|
-
cognite/neat/
|
|
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
|
|
@@ -125,9 +126,9 @@ cognite/neat/legacy/rules/analysis.py,sha256=-PWaFqzvMlUA6nrZissMvoQm8xwFqniIDAp
|
|
|
125
126
|
cognite/neat/legacy/rules/examples/Rules-Nordic44-to-TNT.xlsx,sha256=pT2skrX3uWZtw-HIfIipVuPVr3bgb8zOAIqkguVjhCI,58987
|
|
126
127
|
cognite/neat/legacy/rules/examples/Rules-Nordic44-to-graphql.xlsx,sha256=eo6K177Xrz0CKyUFsbsGF8qZJsJI1Qf1JrzozdbmkeU,80226
|
|
127
128
|
cognite/neat/legacy/rules/examples/__init__.py,sha256=rLVPMLdcxpiW6LzfIgJodDKXfpdoYbD4Q60nmK_wAqU,858
|
|
128
|
-
cognite/neat/legacy/rules/examples/power-grid-containers.yaml,sha256=
|
|
129
|
+
cognite/neat/legacy/rules/examples/power-grid-containers.yaml,sha256=dgAQ5KYT9_FHwsxPapvm00K4XJtKMbGmTs4-KnfpjDg,2782
|
|
129
130
|
cognite/neat/legacy/rules/examples/power-grid-example.xlsx,sha256=gUklgEhawhJ-EquwZpNp7dFvrLGAOzbKIGh8hTObxMg,77055
|
|
130
|
-
cognite/neat/legacy/rules/examples/power-grid-model.yaml,sha256=
|
|
131
|
+
cognite/neat/legacy/rules/examples/power-grid-model.yaml,sha256=UBtwOBUkdSfkuNOOJhnOdpdPHx3Agx_BZHPMjMmTEU0,5767
|
|
131
132
|
cognite/neat/legacy/rules/examples/rules-template.xlsx,sha256=buyxUbY5N5H52LgKST-D2FVvpjEMW4jC2chAHToknNI,75865
|
|
132
133
|
cognite/neat/legacy/rules/examples/sheet2cdf-transformation-rules.xlsx,sha256=_a93q8Yu7nv7Bq3I__RHD7pcdbfrv7urlp_AdgP2o3o,52433
|
|
133
134
|
cognite/neat/legacy/rules/examples/skos-rules.xlsx,sha256=XjdBpbfUrJnniTCCQLOBW-8OmJyGpIT1Ig-DHQG3x04,26008
|
|
@@ -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=
|
|
191
|
-
cognite/neat/rules/exporters/_rules2dms.py,sha256=
|
|
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
|
|
@@ -236,7 +237,7 @@ cognite/neat/rules/models/dms/_converter.py,sha256=QaJT0z0Yo4gkG9tHPZkU8idF8PK7c
|
|
|
236
237
|
cognite/neat/rules/models/dms/_exporter.py,sha256=DRL5ahcBEdBltHLA2rzLyUfqG5SZkqINkqmYGDkQVg0,24785
|
|
237
238
|
cognite/neat/rules/models/dms/_rules.py,sha256=XTIEWG49VjNs_bICGlgMd6uk4hseY1H6UVe2KMfHAWQ,16152
|
|
238
239
|
cognite/neat/rules/models/dms/_rules_input.py,sha256=apDDTQll9UAyYL5gS2vDxHsujWrGBilTp7lK2kzJWO8,13467
|
|
239
|
-
cognite/neat/rules/models/dms/_schema.py,sha256=
|
|
240
|
+
cognite/neat/rules/models/dms/_schema.py,sha256=balykJXJy93HJzBZN-KBYrRJJvGsaEtQeX7-z0tbX7w,49566
|
|
240
241
|
cognite/neat/rules/models/dms/_serializer.py,sha256=iqp2zyyf8jEcU-R3PERuN8nu248xIqyxiWj4owAn92g,6406
|
|
241
242
|
cognite/neat/rules/models/dms/_validation.py,sha256=5mk9L99FSwC8Ok7weEjnFJ_OZnmqMWUc6XFMTfkqfDw,14549
|
|
242
243
|
cognite/neat/rules/models/domain.py,sha256=wZ-DeIPFnacbNlxSrRuLzUpnhHdTpzNc22z0sDfisi4,2880
|
|
@@ -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=
|
|
257
|
-
cognite/neat/utils/cdf_loaders/_data_modeling.py,sha256
|
|
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=
|
|
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
|
|
@@ -279,7 +280,7 @@ cognite/neat/workflows/examples/Visualize_Data_Model_Using_Mock_Graph/workflow.y
|
|
|
279
280
|
cognite/neat/workflows/examples/Visualize_Semantic_Data_Model/workflow.yaml,sha256=yWVL-NHghKtiNV2kpEX674MJwWqhOUn3j2ZOJiJbprE,2579
|
|
280
281
|
cognite/neat/workflows/manager.py,sha256=CtxnabAmZq4APd5XA6FTBlytP3WmlbKNGjNoR04uAQ4,14102
|
|
281
282
|
cognite/neat/workflows/migration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
282
|
-
cognite/neat/workflows/migration/steps.py,sha256=
|
|
283
|
+
cognite/neat/workflows/migration/steps.py,sha256=YjwSDrf6W8pvKzh0vnkyA2QXJDGoYrzJ6VHNCy2oPtc,3945
|
|
283
284
|
cognite/neat/workflows/migration/wf_manifests.py,sha256=TIJ9q_sbZ1LVJfUYVk8VRYcxrRHlwyktHRag0OJcVrE,1556
|
|
284
285
|
cognite/neat/workflows/model.py,sha256=LQY7abYnz3CUEIlIEqoj0Eo6Q8yQukTQ0S_sPststCA,6570
|
|
285
286
|
cognite/neat/workflows/steps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -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=
|
|
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.
|
|
311
|
-
cognite_neat-0.
|
|
312
|
-
cognite_neat-0.
|
|
313
|
-
cognite_neat-0.
|
|
314
|
-
cognite_neat-0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|