cognite-toolkit 0.6.103__py3-none-any.whl → 0.6.104__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_toolkit/_cdf_tk/client/testing.py +13 -1
- cognite_toolkit/_cdf_tk/commands/_migrate/command.py +3 -2
- cognite_toolkit/_cdf_tk/commands/_migrate/conversion.py +116 -56
- cognite_toolkit/_cdf_tk/commands/_migrate/data_mapper.py +34 -32
- cognite_toolkit/_cdf_tk/commands/_upload.py +2 -2
- cognite_toolkit/_cdf_tk/storageio/_applications.py +38 -1
- cognite_toolkit/_cdf_tk/storageio/_base.py +12 -3
- cognite_toolkit/_cdf_tk/utils/http_client/_data_classes.py +1 -1
- cognite_toolkit/_repo_files/GitHub/.github/workflows/deploy.yaml +1 -1
- cognite_toolkit/_repo_files/GitHub/.github/workflows/dry-run.yaml +1 -1
- cognite_toolkit/_resources/cdf.toml +1 -1
- cognite_toolkit/_version.py +1 -1
- {cognite_toolkit-0.6.103.dist-info → cognite_toolkit-0.6.104.dist-info}/METADATA +1 -1
- {cognite_toolkit-0.6.103.dist-info → cognite_toolkit-0.6.104.dist-info}/RECORD +17 -17
- {cognite_toolkit-0.6.103.dist-info → cognite_toolkit-0.6.104.dist-info}/WHEEL +0 -0
- {cognite_toolkit-0.6.103.dist-info → cognite_toolkit-0.6.104.dist-info}/entry_points.txt +0 -0
- {cognite_toolkit-0.6.103.dist-info → cognite_toolkit-0.6.104.dist-info}/licenses/LICENSE +0 -0
|
@@ -35,7 +35,14 @@ from .api.lookup import (
|
|
|
35
35
|
SecurityCategoriesLookUpAPI,
|
|
36
36
|
TimeSeriesLookUpAPI,
|
|
37
37
|
)
|
|
38
|
-
from .api.migration import
|
|
38
|
+
from .api.migration import (
|
|
39
|
+
CreatedSourceSystemAPI,
|
|
40
|
+
InstanceSourceAPI,
|
|
41
|
+
LookupAPI,
|
|
42
|
+
MigrationAPI,
|
|
43
|
+
MigrationLookupAPI,
|
|
44
|
+
ResourceViewMappingAPI,
|
|
45
|
+
)
|
|
39
46
|
from .api.project import ProjectAPI
|
|
40
47
|
from .api.robotics import RoboticsAPI
|
|
41
48
|
from .api.robotics.capabilities import CapabilitiesAPI
|
|
@@ -96,6 +103,11 @@ class ToolkitClientMock(CogniteClientMock):
|
|
|
96
103
|
self.lookup.functions = MagicMock(spec_set=FunctionLookUpAPI)
|
|
97
104
|
self.migration = MagicMock(spec=MigrationAPI)
|
|
98
105
|
self.migration.instance_source = MagicMock(spec_set=InstanceSourceAPI)
|
|
106
|
+
self.migration.lookup = MagicMock(spec=MigrationLookupAPI)
|
|
107
|
+
self.migration.lookup.assets = MagicMock(spec_set=LookupAPI)
|
|
108
|
+
self.migration.lookup.events = MagicMock(spec_set=LookupAPI)
|
|
109
|
+
self.migration.lookup.files = MagicMock(spec_set=LookupAPI)
|
|
110
|
+
self.migration.lookup.time_series = MagicMock(spec_set=LookupAPI)
|
|
99
111
|
self.migration.resource_view_mapping = MagicMock(spec_set=ResourceViewMappingAPI)
|
|
100
112
|
self.migration.created_source_system = MagicMock(spec_set=CreatedSourceSystemAPI)
|
|
101
113
|
self.raw = MagicMock(spec=ExtendedRawAPI)
|
|
@@ -157,10 +157,11 @@ class MigrationCommand(ToolkitCommand):
|
|
|
157
157
|
log_file: NDJsonWriter,
|
|
158
158
|
) -> Callable[[Sequence[T_CogniteResource]], Sequence[UploadItem[T_WriteCogniteResource]]]:
|
|
159
159
|
def track_mapping(source: Sequence[T_CogniteResource]) -> list[UploadItem[T_WriteCogniteResource]]:
|
|
160
|
+
mapped = mapper.map(source)
|
|
160
161
|
issues: list[Chunk] = []
|
|
161
162
|
targets: list[UploadItem[T_WriteCogniteResource]] = []
|
|
162
|
-
|
|
163
|
-
|
|
163
|
+
|
|
164
|
+
for (target, issue), item in zip(mapped, source):
|
|
164
165
|
id_ = data.as_id(item)
|
|
165
166
|
result: Status = "failed" if target is None else "success"
|
|
166
167
|
tracker.set_progress(id_, step=self.Steps.CONVERT, status=result)
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
from collections.abc import Mapping, Set
|
|
2
|
-
from
|
|
3
|
-
from typing import Any, ClassVar
|
|
1
|
+
from collections.abc import Iterable, Mapping, Set
|
|
2
|
+
from typing import Any, ClassVar, cast
|
|
4
3
|
|
|
5
4
|
from cognite.client.data_classes import Annotation, Asset, Event, FileMetadata, TimeSeries
|
|
6
5
|
from cognite.client.data_classes.data_modeling import (
|
|
@@ -15,6 +14,7 @@ from cognite.client.data_classes.data_modeling.instances import EdgeApply, NodeO
|
|
|
15
14
|
from cognite.client.data_classes.data_modeling.views import ViewProperty
|
|
16
15
|
from cognite.client.utils._identifier import InstanceId
|
|
17
16
|
|
|
17
|
+
from cognite_toolkit._cdf_tk.client import ToolkitClient
|
|
18
18
|
from cognite_toolkit._cdf_tk.client.data_classes.migration import AssetCentricId, ResourceViewMapping
|
|
19
19
|
from cognite_toolkit._cdf_tk.utils.collection import flatten_dict_json_path
|
|
20
20
|
from cognite_toolkit._cdf_tk.utils.dtype_conversion import (
|
|
@@ -30,61 +30,134 @@ from .data_model import INSTANCE_SOURCE_VIEW_ID
|
|
|
30
30
|
from .issues import ConversionIssue, FailedConversion, InvalidPropertyDataType
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
@dataclass
|
|
34
33
|
class DirectRelationCache:
|
|
35
34
|
"""Cache for direct relation references to look up target of direct relations.
|
|
36
35
|
|
|
37
|
-
This is used when creating direct relations from asset-centric resources to
|
|
38
|
-
|
|
39
|
-
Attributes:
|
|
40
|
-
asset: Mapping[int, DirectRelationReference]
|
|
41
|
-
A mapping from asset IDs to their corresponding DirectRelationReference in the data model.
|
|
42
|
-
source: Mapping[str, DirectRelationReference]
|
|
43
|
-
A mapping from source strings to their corresponding DirectRelationReference in the data model.
|
|
44
|
-
|
|
45
|
-
Methods:
|
|
46
|
-
get(resource_type: AssetCentric, property_id: str) -> Mapping[str | int, DirectRelationReference]:
|
|
47
|
-
Get the appropriate mapping based on the resource type and property ID.
|
|
48
|
-
|
|
49
|
-
Note:
|
|
50
|
-
The ASSET_REFERENCE_PROPERTIES and SOURCE_REFERENCE_PROPERTIES class variables define which properties
|
|
51
|
-
in asset-centric resources reference assets and sources, respectively.
|
|
52
|
-
|
|
36
|
+
This is used when creating direct relations from asset-centric resources to assets, files, and source systems.
|
|
53
37
|
"""
|
|
54
38
|
|
|
55
|
-
|
|
39
|
+
class TableName:
|
|
40
|
+
ASSET_ID = "assetId"
|
|
41
|
+
SOURCE_NAME = "source"
|
|
42
|
+
FILE_ID = "fileId"
|
|
43
|
+
ASSET_EXTERNAL_ID = "assetExternalId"
|
|
44
|
+
FILE_EXTERNAL_ID = "fileExternalId"
|
|
45
|
+
|
|
46
|
+
ASSET_ID_PROPERTIES: ClassVar[Set[tuple[str, str]]] = {
|
|
56
47
|
("timeseries", "assetId"),
|
|
57
48
|
("file", "assetIds"),
|
|
58
49
|
("event", "assetIds"),
|
|
59
50
|
("sequence", "assetId"),
|
|
60
|
-
("asset", "parentId"),
|
|
61
51
|
("annotation", "data.assetRef.id"),
|
|
52
|
+
("asset", "parentId"),
|
|
62
53
|
}
|
|
63
|
-
|
|
54
|
+
SOURCE_NAME_PROPERTIES: ClassVar[Set[tuple[str, str]]] = {
|
|
64
55
|
("asset", "source"),
|
|
65
56
|
("event", "source"),
|
|
66
57
|
("file", "source"),
|
|
67
58
|
}
|
|
68
|
-
|
|
59
|
+
FILE_ID_PROPERTIES: ClassVar[Set[tuple[str, str]]] = {
|
|
69
60
|
("annotation", "data.fileRef.id"),
|
|
70
61
|
("annotation", "annotatedResourceId"),
|
|
71
62
|
}
|
|
63
|
+
ASSET_EXTERNAL_ID_PROPERTIES: ClassVar[Set[tuple[str, str]]] = {("annotation", "data.assetRef.externalId")}
|
|
64
|
+
FILE_EXTERNAL_ID_PROPERTIES: ClassVar[Set[tuple[str, str]]] = {("annotation", "data.fileRef.externalId")}
|
|
65
|
+
|
|
66
|
+
def __init__(self, client: ToolkitClient) -> None:
|
|
67
|
+
self._client = client
|
|
68
|
+
self._cache_map: dict[
|
|
69
|
+
tuple[str, str] | str, dict[str, DirectRelationReference] | dict[int, DirectRelationReference]
|
|
70
|
+
] = {}
|
|
71
|
+
# Constructing the cache map to be accessed by both table name and property id
|
|
72
|
+
for table_name, properties in [
|
|
73
|
+
(self.TableName.ASSET_ID, self.ASSET_ID_PROPERTIES),
|
|
74
|
+
(self.TableName.SOURCE_NAME, self.SOURCE_NAME_PROPERTIES),
|
|
75
|
+
(self.TableName.FILE_ID, self.FILE_ID_PROPERTIES),
|
|
76
|
+
(self.TableName.ASSET_EXTERNAL_ID, self.ASSET_EXTERNAL_ID_PROPERTIES),
|
|
77
|
+
(self.TableName.FILE_EXTERNAL_ID, self.FILE_EXTERNAL_ID_PROPERTIES),
|
|
78
|
+
]:
|
|
79
|
+
cache: dict[str, DirectRelationReference] | dict[int, DirectRelationReference] = {}
|
|
80
|
+
self._cache_map[table_name] = cache
|
|
81
|
+
for key in properties:
|
|
82
|
+
self._cache_map[key] = cache
|
|
83
|
+
|
|
84
|
+
def update(self, resources: Iterable[AssetCentricResourceExtended]) -> None:
|
|
85
|
+
"""Update the cache with direct relation references for the given asset-centric resources.
|
|
86
|
+
|
|
87
|
+
This is used to bulk update the cache for a chunk of resources before converting them to data model instances.
|
|
88
|
+
"""
|
|
89
|
+
asset_ids: set[int] = set()
|
|
90
|
+
source_ids: set[str] = set()
|
|
91
|
+
file_ids: set[int] = set()
|
|
92
|
+
asset_external_ids: set[str] = set()
|
|
93
|
+
file_external_ids: set[str] = set()
|
|
94
|
+
for resource in resources:
|
|
95
|
+
if isinstance(resource, Annotation):
|
|
96
|
+
if resource.annotated_resource_type == "file" and resource.annotated_resource_id:
|
|
97
|
+
file_ids.add(resource.annotated_resource_id)
|
|
98
|
+
if "assetRef" in resource.data:
|
|
99
|
+
asset_ref = resource.data["assetRef"]
|
|
100
|
+
if isinstance(asset_id := asset_ref.get("id"), int):
|
|
101
|
+
asset_ids.add(asset_id)
|
|
102
|
+
if isinstance(asset_external_id := asset_ref.get("externalId"), str):
|
|
103
|
+
asset_external_ids.add(asset_external_id)
|
|
104
|
+
if "fileRef" in resource.data:
|
|
105
|
+
file_ref = resource.data["fileRef"]
|
|
106
|
+
if isinstance(file_id := file_ref.get("id"), int):
|
|
107
|
+
file_ids.add(file_id)
|
|
108
|
+
if isinstance(file_external_id := file_ref.get("externalId"), str):
|
|
109
|
+
file_external_ids.add(file_external_id)
|
|
110
|
+
elif isinstance(resource, Asset):
|
|
111
|
+
if resource.source:
|
|
112
|
+
source_ids.add(resource.source)
|
|
113
|
+
if resource.parent_id is not None:
|
|
114
|
+
asset_ids.add(resource.parent_id)
|
|
115
|
+
elif isinstance(resource, FileMetadata):
|
|
116
|
+
if resource.source:
|
|
117
|
+
source_ids.add(resource.source)
|
|
118
|
+
if resource.asset_ids:
|
|
119
|
+
asset_ids.update(resource.asset_ids)
|
|
120
|
+
elif isinstance(resource, Event):
|
|
121
|
+
if resource.source:
|
|
122
|
+
source_ids.add(resource.source)
|
|
123
|
+
if resource.asset_ids:
|
|
124
|
+
asset_ids.update(resource.asset_ids)
|
|
125
|
+
elif isinstance(resource, TimeSeries):
|
|
126
|
+
if resource.asset_id is not None:
|
|
127
|
+
asset_ids.add(resource.asset_id)
|
|
128
|
+
if asset_ids:
|
|
129
|
+
self._update_cache(self._client.migration.lookup.assets(id=list(asset_ids)), self.TableName.ASSET_ID)
|
|
130
|
+
if source_ids:
|
|
131
|
+
# SourceSystems are not cached in the client, so we have to handle the caching ourselves.
|
|
132
|
+
cache = cast(dict[str, DirectRelationReference], self._cache_map[self.TableName.SOURCE_NAME])
|
|
133
|
+
missing = set(source_ids) - set(cache.keys())
|
|
134
|
+
if missing:
|
|
135
|
+
source_systems = self._client.migration.created_source_system.retrieve(list(missing))
|
|
136
|
+
for source_system in source_systems:
|
|
137
|
+
cache[source_system.source] = source_system.as_direct_relation_reference()
|
|
138
|
+
if file_ids:
|
|
139
|
+
self._update_cache(self._client.migration.lookup.files(id=list(file_ids)), self.TableName.FILE_ID)
|
|
140
|
+
if asset_external_ids:
|
|
141
|
+
self._update_cache(
|
|
142
|
+
self._client.migration.lookup.assets(external_id=list(asset_external_ids)),
|
|
143
|
+
self.TableName.ASSET_EXTERNAL_ID,
|
|
144
|
+
)
|
|
145
|
+
if file_external_ids:
|
|
146
|
+
self._update_cache(
|
|
147
|
+
self._client.migration.lookup.files(external_id=list(file_external_ids)),
|
|
148
|
+
self.TableName.FILE_EXTERNAL_ID,
|
|
149
|
+
)
|
|
72
150
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
151
|
+
def _update_cache(self, instance_id_by_id: dict[int, NodeId] | dict[str, NodeId], table_name: str) -> None:
|
|
152
|
+
cache = self._cache_map[table_name]
|
|
153
|
+
for identifier, instance_id in instance_id_by_id.items():
|
|
154
|
+
cache[identifier] = DirectRelationReference(space=instance_id.space, external_id=instance_id.external_id) # type: ignore[index]
|
|
76
155
|
|
|
77
|
-
def
|
|
156
|
+
def get_cache(
|
|
78
157
|
self, resource_type: AssetCentricTypeExtended, property_id: str
|
|
79
|
-
) -> Mapping[str | int, DirectRelationReference]:
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
return self.asset # type: ignore[return-value]
|
|
83
|
-
if key in self.SOURCE_REFERENCE_PROPERTIES:
|
|
84
|
-
return self.source # type: ignore[return-value]
|
|
85
|
-
if key in self.FILE_REFERENCE_PROPERTIES:
|
|
86
|
-
return self.file # type: ignore[return-value]
|
|
87
|
-
return {}
|
|
158
|
+
) -> Mapping[str | int, DirectRelationReference] | None:
|
|
159
|
+
"""Get the cache for the given resource type and property ID."""
|
|
160
|
+
return self._cache_map.get((resource_type, property_id)) # type: ignore[return-value]
|
|
88
161
|
|
|
89
162
|
|
|
90
163
|
def asset_centric_to_dm(
|
|
@@ -92,9 +165,7 @@ def asset_centric_to_dm(
|
|
|
92
165
|
instance_id: InstanceId,
|
|
93
166
|
view_source: ResourceViewMapping,
|
|
94
167
|
view_properties: dict[str, ViewProperty],
|
|
95
|
-
|
|
96
|
-
source_instance_id_by_external_id: Mapping[str, DirectRelationReference],
|
|
97
|
-
file_instance_id_by_id: Mapping[int, DirectRelationReference],
|
|
168
|
+
direct_relation_cache: DirectRelationCache,
|
|
98
169
|
) -> tuple[NodeApply | EdgeApply | None, ConversionIssue]:
|
|
99
170
|
"""Convert an asset-centric resource to a data model instance.
|
|
100
171
|
|
|
@@ -103,22 +174,11 @@ def asset_centric_to_dm(
|
|
|
103
174
|
instance_id (NodeId | EdgeApply): The ID of the instance to create or update.
|
|
104
175
|
view_source (ResourceViewMapping): The view source defining how to map the resource to the data model.
|
|
105
176
|
view_properties (dict[str, ViewProperty]): The defined properties referenced in the view source mapping.
|
|
106
|
-
|
|
107
|
-
DirectRelationReference in the data model. This is used to create direct relations for resources that
|
|
108
|
-
reference assets.
|
|
109
|
-
source_instance_id_by_external_id (dict[str, DirectRelationReference]): A mapping from source strings to their
|
|
110
|
-
corresponding DirectRelationReference in the data model. This is used to create direct relations for resources
|
|
111
|
-
that reference sources.
|
|
112
|
-
file_instance_id_by_id (dict[int, DirectRelationReference]): A mapping from file IDs to their corresponding
|
|
113
|
-
DirectRelationReference in the data model. This is used to create direct relations for resources that
|
|
114
|
-
reference files.
|
|
177
|
+
direct_relation_cache (DirectRelationCache): Cache for direct relation references.
|
|
115
178
|
|
|
116
179
|
Returns:
|
|
117
180
|
tuple[NodeApply | EdgeApply, ConversionIssue]: A tuple containing the converted NodeApply and any ConversionIssue encountered.
|
|
118
181
|
"""
|
|
119
|
-
cache = DirectRelationCache(
|
|
120
|
-
asset=asset_instance_id_by_id, source=source_instance_id_by_external_id, file=file_instance_id_by_id
|
|
121
|
-
)
|
|
122
182
|
resource_type = _lookup_resource_type(resource)
|
|
123
183
|
dumped = resource.dump()
|
|
124
184
|
try:
|
|
@@ -138,7 +198,7 @@ def asset_centric_to_dm(
|
|
|
138
198
|
view_source.property_mapping,
|
|
139
199
|
resource_type,
|
|
140
200
|
issue=issue,
|
|
141
|
-
direct_relation_cache=
|
|
201
|
+
direct_relation_cache=direct_relation_cache,
|
|
142
202
|
)
|
|
143
203
|
sources: list[NodeOrEdgeData] = []
|
|
144
204
|
if properties:
|
|
@@ -156,7 +216,7 @@ def asset_centric_to_dm(
|
|
|
156
216
|
instance: NodeApply | EdgeApply
|
|
157
217
|
if isinstance(instance_id, EdgeId):
|
|
158
218
|
edge_properties = create_edge_properties(
|
|
159
|
-
dumped, view_source.property_mapping, resource_type, issue,
|
|
219
|
+
dumped, view_source.property_mapping, resource_type, issue, direct_relation_cache, instance_id.space
|
|
160
220
|
)
|
|
161
221
|
if any(key not in edge_properties for key in ("start_node", "end_node", "type")):
|
|
162
222
|
# Failed conversion of edge properties
|
|
@@ -240,7 +300,7 @@ def create_properties(
|
|
|
240
300
|
dm_prop.nullable,
|
|
241
301
|
destination_container_property=(dm_prop.container, dm_prop.container_property_identifier),
|
|
242
302
|
source_property=(resource_type, prop_json_path),
|
|
243
|
-
direct_relation_lookup=direct_relation_cache.
|
|
303
|
+
direct_relation_lookup=direct_relation_cache.get_cache(resource_type, prop_json_path),
|
|
244
304
|
)
|
|
245
305
|
except (ValueError, TypeError, NotImplementedError) as e:
|
|
246
306
|
issue.failed_conversions.append(
|
|
@@ -288,7 +348,7 @@ def create_edge_properties(
|
|
|
288
348
|
flatten_dump[prop_json_path],
|
|
289
349
|
DirectRelation(),
|
|
290
350
|
False,
|
|
291
|
-
direct_relation_lookup=direct_relation_cache.
|
|
351
|
+
direct_relation_lookup=direct_relation_cache.get_cache(resource_type, prop_json_path),
|
|
292
352
|
)
|
|
293
353
|
except (ValueError, TypeError, NotImplementedError) as e:
|
|
294
354
|
issue.failed_conversions.append(
|
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
from abc import ABC, abstractmethod
|
|
2
|
+
from collections.abc import Sequence
|
|
2
3
|
from typing import Generic
|
|
3
4
|
|
|
4
5
|
from cognite.client.data_classes._base import (
|
|
5
6
|
T_CogniteResource,
|
|
6
7
|
)
|
|
7
|
-
from cognite.client.data_classes.data_modeling import
|
|
8
|
+
from cognite.client.data_classes.data_modeling import (
|
|
9
|
+
EdgeApply,
|
|
10
|
+
InstanceApply,
|
|
11
|
+
NodeApply,
|
|
12
|
+
View,
|
|
13
|
+
ViewId,
|
|
14
|
+
)
|
|
8
15
|
|
|
9
16
|
from cognite_toolkit._cdf_tk.client import ToolkitClient
|
|
10
17
|
from cognite_toolkit._cdf_tk.client.data_classes.migration import ResourceViewMapping
|
|
11
|
-
from cognite_toolkit._cdf_tk.commands._migrate.conversion import asset_centric_to_dm
|
|
18
|
+
from cognite_toolkit._cdf_tk.commands._migrate.conversion import DirectRelationCache, asset_centric_to_dm
|
|
12
19
|
from cognite_toolkit._cdf_tk.commands._migrate.data_classes import AssetCentricMapping
|
|
13
20
|
from cognite_toolkit._cdf_tk.commands._migrate.issues import ConversionIssue, MigrationIssue
|
|
14
21
|
from cognite_toolkit._cdf_tk.commands._migrate.selectors import AssetCentricMigrationSelector
|
|
@@ -16,7 +23,9 @@ from cognite_toolkit._cdf_tk.constants import MISSING_INSTANCE_SPACE
|
|
|
16
23
|
from cognite_toolkit._cdf_tk.exceptions import ToolkitValueError
|
|
17
24
|
from cognite_toolkit._cdf_tk.storageio._base import T_Selector, T_WriteCogniteResource
|
|
18
25
|
from cognite_toolkit._cdf_tk.utils import humanize_collection
|
|
19
|
-
from cognite_toolkit._cdf_tk.utils.useful_types import
|
|
26
|
+
from cognite_toolkit._cdf_tk.utils.useful_types import (
|
|
27
|
+
T_AssetCentricResource,
|
|
28
|
+
)
|
|
20
29
|
|
|
21
30
|
|
|
22
31
|
class DataMapper(Generic[T_Selector, T_CogniteResource, T_WriteCogniteResource], ABC):
|
|
@@ -31,7 +40,9 @@ class DataMapper(Generic[T_Selector, T_CogniteResource, T_WriteCogniteResource],
|
|
|
31
40
|
pass
|
|
32
41
|
|
|
33
42
|
@abstractmethod
|
|
34
|
-
def map(
|
|
43
|
+
def map(
|
|
44
|
+
self, source: Sequence[T_CogniteResource]
|
|
45
|
+
) -> Sequence[tuple[T_WriteCogniteResource | None, MigrationIssue]]:
|
|
35
46
|
"""Map a chunk of source data to the target format.
|
|
36
47
|
|
|
37
48
|
Args:
|
|
@@ -51,10 +62,7 @@ class AssetCentricMapper(
|
|
|
51
62
|
self.client = client
|
|
52
63
|
self._ingestion_view_by_id: dict[ViewId, View] = {}
|
|
53
64
|
self._view_mapping_by_id: dict[str, ResourceViewMapping] = {}
|
|
54
|
-
|
|
55
|
-
# to them from files, events, and time series.
|
|
56
|
-
self._asset_mapping_by_id: dict[int, DirectRelationReference] = {}
|
|
57
|
-
self._source_system_mapping_by_id: dict[str, DirectRelationReference] = {}
|
|
65
|
+
self._direct_relation_cache = DirectRelationCache(client)
|
|
58
66
|
|
|
59
67
|
def prepare(self, source_selector: AssetCentricMigrationSelector) -> None:
|
|
60
68
|
ingestion_view_ids = source_selector.get_ingestion_mappings()
|
|
@@ -74,22 +82,23 @@ class AssetCentricMapper(
|
|
|
74
82
|
raise ToolkitValueError(
|
|
75
83
|
f"The following ingestion views were not found in Data Modeling: {humanize_collection(missing_views)}"
|
|
76
84
|
)
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
self._source_system_mapping_by_id = {
|
|
82
|
-
source_system.source: source_system.as_direct_relation_reference() for source_system in source_systems
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
# We look-up all existing asset mappings to be able to create direct relations to already mapped assets.
|
|
86
|
-
# This is needed in case the migration is run multiple times, or if assets are mapped
|
|
87
|
-
asset_mappings = self.client.migration.instance_source.list(resource_type="asset", limit=-1)
|
|
88
|
-
self._asset_mapping_by_id = {mapping.id_: mapping.as_direct_relation_reference() for mapping in asset_mappings}
|
|
89
|
-
|
|
90
|
-
def map(self, source: AssetCentricMapping[T_AssetCentricResource]) -> tuple[InstanceApply | None, ConversionIssue]:
|
|
85
|
+
|
|
86
|
+
def map(
|
|
87
|
+
self, source: Sequence[AssetCentricMapping[T_AssetCentricResource]]
|
|
88
|
+
) -> Sequence[tuple[InstanceApply | None, ConversionIssue]]:
|
|
91
89
|
"""Map a chunk of asset-centric data to InstanceApplyList format."""
|
|
92
|
-
|
|
90
|
+
# We update the direct relation cache in bulk for all resources in the chunk.
|
|
91
|
+
self._direct_relation_cache.update(item.resource for item in source)
|
|
92
|
+
output: list[tuple[InstanceApply | None, ConversionIssue]] = []
|
|
93
|
+
for item in source:
|
|
94
|
+
instance, conversion_issue = self._map_single_item(item)
|
|
95
|
+
output.append((instance, conversion_issue))
|
|
96
|
+
return output
|
|
97
|
+
|
|
98
|
+
def _map_single_item(
|
|
99
|
+
self, item: AssetCentricMapping[T_AssetCentricResource]
|
|
100
|
+
) -> tuple[NodeApply | EdgeApply | None, ConversionIssue]:
|
|
101
|
+
mapping = item.mapping
|
|
93
102
|
ingestion_view = mapping.get_ingestion_view()
|
|
94
103
|
try:
|
|
95
104
|
view_source = self._view_mapping_by_id[ingestion_view]
|
|
@@ -99,19 +108,12 @@ class AssetCentricMapper(
|
|
|
99
108
|
f"Failed to lookup mapping or view for ingestion view '{ingestion_view}'. Did you forget to call .prepare()?"
|
|
100
109
|
) from e
|
|
101
110
|
instance, conversion_issue = asset_centric_to_dm(
|
|
102
|
-
|
|
111
|
+
item.resource,
|
|
103
112
|
instance_id=mapping.instance_id,
|
|
104
113
|
view_source=view_source,
|
|
105
114
|
view_properties=view_properties,
|
|
106
|
-
|
|
107
|
-
source_instance_id_by_external_id=self._source_system_mapping_by_id,
|
|
108
|
-
file_instance_id_by_id={}, # Todo implement file direct relations
|
|
115
|
+
direct_relation_cache=self._direct_relation_cache,
|
|
109
116
|
)
|
|
110
117
|
if mapping.instance_id.space == MISSING_INSTANCE_SPACE:
|
|
111
118
|
conversion_issue.missing_instance_space = f"Missing instance space for dataset ID {mapping.data_set_id!r}"
|
|
112
|
-
|
|
113
|
-
if mapping.resource_type == "asset":
|
|
114
|
-
self._asset_mapping_by_id[mapping.id] = DirectRelationReference(
|
|
115
|
-
space=mapping.instance_id.space, external_id=mapping.instance_id.external_id
|
|
116
|
-
)
|
|
117
119
|
return instance, conversion_issue
|
|
@@ -82,9 +82,9 @@ class UploadCommand(ToolkitCommand):
|
|
|
82
82
|
│ │ └── table2.Table.yaml
|
|
83
83
|
│ └── ...
|
|
84
84
|
├── datafile1.kind.ndjson # Data file of a specific kind
|
|
85
|
-
├── datafile1.
|
|
85
|
+
├── datafile1.Manifest.yaml # Manifest for datafile1
|
|
86
86
|
├── datafile2.kind2.ndjson # Another data file of the same or different kind
|
|
87
|
-
├── datafile2.
|
|
87
|
+
├── datafile2.Manifest.yaml # Manifest file for datafile2
|
|
88
88
|
└── ...
|
|
89
89
|
"""
|
|
90
90
|
console = Console()
|
|
@@ -9,7 +9,7 @@ from cognite_toolkit._cdf_tk.exceptions import ToolkitNotImplementedError
|
|
|
9
9
|
from cognite_toolkit._cdf_tk.utils.collection import chunker_sequence
|
|
10
10
|
from cognite_toolkit._cdf_tk.utils.useful_types import JsonVal
|
|
11
11
|
|
|
12
|
-
from ._base import Page, UploadableStorageIO
|
|
12
|
+
from ._base import Page, UploadableStorageIO, UploadItem
|
|
13
13
|
from .selectors import AllChartsSelector, CanvasSelector, ChartExternalIdSelector, ChartOwnerSelector, ChartSelector
|
|
14
14
|
|
|
15
15
|
|
|
@@ -20,6 +20,9 @@ class ChartIO(UploadableStorageIO[ChartSelector, Chart, ChartWrite]):
|
|
|
20
20
|
SUPPORTED_READ_FORMATS = frozenset({".ndjson"})
|
|
21
21
|
CHUNK_SIZE = 10
|
|
22
22
|
BASE_SELECTOR = ChartSelector
|
|
23
|
+
UPLOAD_ENDPOINT_TYPE = "app"
|
|
24
|
+
UPLOAD_ENDPOINT_METHOD = "PUT"
|
|
25
|
+
UPLOAD_ENDPOINT = "/storage/charts/charts"
|
|
23
26
|
|
|
24
27
|
def as_id(self, item: Chart) -> str:
|
|
25
28
|
return item.external_id
|
|
@@ -75,7 +78,41 @@ class ChartIO(UploadableStorageIO[ChartSelector, Chart, ChartWrite]):
|
|
|
75
78
|
item["tsExternalId"] = ts_external_id
|
|
76
79
|
return dumped
|
|
77
80
|
|
|
81
|
+
def json_chunk_to_data(self, data_chunk: list[tuple[str, dict[str, JsonVal]]]) -> Sequence[UploadItem[ChartWrite]]:
|
|
82
|
+
self._populate_timeseries_external_id_cache([item_json for _, item_json in data_chunk])
|
|
83
|
+
return super().json_chunk_to_data(data_chunk)
|
|
84
|
+
|
|
78
85
|
def json_to_resource(self, item_json: dict[str, JsonVal]) -> ChartWrite:
|
|
86
|
+
return self._load_resource(item_json)
|
|
87
|
+
|
|
88
|
+
def _populate_timeseries_external_id_cache(self, item_jsons: Sequence[dict[str, JsonVal]]) -> None:
|
|
89
|
+
timeseries_external_ids: set[str] = set()
|
|
90
|
+
for item_json in item_jsons:
|
|
91
|
+
if isinstance(data := item_json.get("data"), dict) and isinstance(
|
|
92
|
+
collection := data.get("timeSeriesCollection"), list
|
|
93
|
+
):
|
|
94
|
+
for item in collection:
|
|
95
|
+
if not isinstance(item, dict):
|
|
96
|
+
continue
|
|
97
|
+
ts_external_id = item.get("tsExternalId")
|
|
98
|
+
if isinstance(ts_external_id, str):
|
|
99
|
+
timeseries_external_ids.add(ts_external_id)
|
|
100
|
+
if timeseries_external_ids:
|
|
101
|
+
self.client.lookup.time_series.id(list(timeseries_external_ids))
|
|
102
|
+
|
|
103
|
+
def _load_resource(self, item_json: dict[str, JsonVal]) -> ChartWrite:
|
|
104
|
+
if isinstance(data := item_json.get("data"), dict) and isinstance(
|
|
105
|
+
collection := data.get("timeSeriesCollection"), list
|
|
106
|
+
):
|
|
107
|
+
for item in collection:
|
|
108
|
+
if not isinstance(item, dict):
|
|
109
|
+
continue
|
|
110
|
+
ts_external_id = item.get("tsExternalId")
|
|
111
|
+
if isinstance(ts_external_id, str) and item.get("tsId") is None:
|
|
112
|
+
# We only look-up the internalID if it is missing
|
|
113
|
+
ts_id = self.client.lookup.time_series.id(ts_external_id)
|
|
114
|
+
if ts_id is not None:
|
|
115
|
+
item["tsId"] = ts_id
|
|
79
116
|
return ChartWrite._load(item_json)
|
|
80
117
|
|
|
81
118
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from abc import ABC, abstractmethod
|
|
2
2
|
from collections.abc import Iterable, Mapping, Sequence, Sized
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import ClassVar, Generic, TypeVar
|
|
4
|
+
from typing import ClassVar, Generic, Literal, TypeVar
|
|
5
5
|
|
|
6
6
|
from cognite.client.data_classes._base import T_CogniteResource
|
|
7
7
|
|
|
@@ -145,6 +145,8 @@ class UploadableStorageIO(
|
|
|
145
145
|
|
|
146
146
|
KIND: ClassVar[str]
|
|
147
147
|
SUPPORTED_READ_FORMATS: ClassVar[frozenset[str]]
|
|
148
|
+
UPLOAD_ENDPOINT_TYPE: Literal["app", "api"] = "api"
|
|
149
|
+
UPLOAD_ENDPOINT_METHOD: Literal["GET", "POST", "PATCH", "DELETE", "PUT"] = "POST"
|
|
148
150
|
UPLOAD_ENDPOINT: ClassVar[str]
|
|
149
151
|
UPLOAD_EXTRA_ARGS: ClassVar[Mapping[str, JsonVal] | None] = None
|
|
150
152
|
|
|
@@ -170,10 +172,17 @@ class UploadableStorageIO(
|
|
|
170
172
|
raise ValueError(f"Data chunk size {len(data_chunk)} exceeds the maximum CHUNK_SIZE of {self.CHUNK_SIZE}.")
|
|
171
173
|
|
|
172
174
|
config = http_client.config
|
|
175
|
+
if self.UPLOAD_ENDPOINT_TYPE == "api":
|
|
176
|
+
url = config.create_api_url(self.UPLOAD_ENDPOINT)
|
|
177
|
+
elif self.UPLOAD_ENDPOINT_TYPE == "app":
|
|
178
|
+
url = config.create_app_url(self.UPLOAD_ENDPOINT)
|
|
179
|
+
else:
|
|
180
|
+
raise ToolkitNotImplementedError(f"Unsupported UPLOAD_ENDPOINT_TYPE {self.UPLOAD_ENDPOINT_TYPE!r}.")
|
|
181
|
+
|
|
173
182
|
return http_client.request_with_retries(
|
|
174
183
|
message=ItemsRequest(
|
|
175
|
-
endpoint_url=
|
|
176
|
-
method=
|
|
184
|
+
endpoint_url=url,
|
|
185
|
+
method=self.UPLOAD_ENDPOINT_METHOD,
|
|
177
186
|
items=list(data_chunk),
|
|
178
187
|
extra_body_fields=dict(self.UPLOAD_EXTRA_ARGS or {}),
|
|
179
188
|
)
|
|
@@ -87,7 +87,7 @@ class RequestMessage(HTTPMessage):
|
|
|
87
87
|
"""Base class for HTTP request messages"""
|
|
88
88
|
|
|
89
89
|
endpoint_url: str
|
|
90
|
-
method: Literal["GET", "POST", "PATCH", "DELETE"]
|
|
90
|
+
method: Literal["GET", "POST", "PATCH", "DELETE", "PUT"]
|
|
91
91
|
connect_attempt: int = 0
|
|
92
92
|
read_attempt: int = 0
|
|
93
93
|
status_attempt: int = 0
|
|
@@ -4,7 +4,7 @@ default_env = "<DEFAULT_ENV_PLACEHOLDER>"
|
|
|
4
4
|
[modules]
|
|
5
5
|
# This is the version of the modules. It should not be changed manually.
|
|
6
6
|
# It will be updated by the 'cdf modules upgrade' command.
|
|
7
|
-
version = "0.6.
|
|
7
|
+
version = "0.6.104"
|
|
8
8
|
|
|
9
9
|
[alpha_flags]
|
|
10
10
|
external-libraries = true
|
cognite_toolkit/_version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.6.
|
|
1
|
+
__version__ = "0.6.104"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cognite_toolkit
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.104
|
|
4
4
|
Summary: Official Cognite Data Fusion tool for project templates and configuration deployment
|
|
5
5
|
Project-URL: Homepage, https://docs.cognite.com/cdf/deploy/cdf_toolkit/
|
|
6
6
|
Project-URL: Changelog, https://github.com/cognitedata/toolkit/releases
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
cognite_toolkit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
2
|
cognite_toolkit/_cdf.py,sha256=0abeQr1Tfk4lkGaoXyrnFC28wDSlR_8UGrh10noGduQ,6085
|
|
3
|
-
cognite_toolkit/_version.py,sha256=
|
|
3
|
+
cognite_toolkit/_version.py,sha256=1DxGUOUNv3aZzpO7zqLfCeyAgR320ErlCl6Oiqlf_rw,24
|
|
4
4
|
cognite_toolkit/_cdf_tk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
cognite_toolkit/_cdf_tk/cdf_toml.py,sha256=VSWV9h44HusWIaKpWgjrOMrc3hDoPTTXBXlp6-NOrIM,9079
|
|
6
6
|
cognite_toolkit/_cdf_tk/constants.py,sha256=Z0nsRXBrqVUgalMa7MZFiwPp26KUfaHqX2h89Daox-M,6936
|
|
@@ -40,7 +40,7 @@ cognite_toolkit/_cdf_tk/client/_constants.py,sha256=COUGcea37mDF2sf6MGqJXWmecTY_
|
|
|
40
40
|
cognite_toolkit/_cdf_tk/client/_toolkit_client.py,sha256=InfVdwtj5WA9hfa2kUr4sdhTCBhE08aDlVg2_QMKP5k,2928
|
|
41
41
|
cognite_toolkit/_cdf_tk/client/api_client.py,sha256=CQdD_gfDqQkz5OYHrTnKvBvEvzHPdHDB1BkZPWRoahg,440
|
|
42
42
|
cognite_toolkit/_cdf_tk/client/config.py,sha256=weMR43z-gqHMn-Jqvfmh_nJ0HbgEdyeCGtISuEf3OuY,4269
|
|
43
|
-
cognite_toolkit/_cdf_tk/client/testing.py,sha256=
|
|
43
|
+
cognite_toolkit/_cdf_tk/client/testing.py,sha256=axKaW6rdzq_TI7DD4ijnLeHC4a74WKWDAxQ3QyZ7Kvg,6720
|
|
44
44
|
cognite_toolkit/_cdf_tk/client/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
45
|
cognite_toolkit/_cdf_tk/client/api/canvas.py,sha256=i2NwyhvmklTPx3e-yd4lvSxyn6JEjSpv8WXa1SxtmV8,8789
|
|
46
46
|
cognite_toolkit/_cdf_tk/client/api/charts.py,sha256=t-VOrRGwpjmYUtUqGObQWYwGb5gOHVp4cHZBm8ZVGn0,4953
|
|
@@ -108,7 +108,7 @@ cognite_toolkit/_cdf_tk/commands/_download.py,sha256=OBKPM_HGGA1i32th1SAgkQM_81C
|
|
|
108
108
|
cognite_toolkit/_cdf_tk/commands/_profile.py,sha256=_4iX3AHAI6eLmRVUlWXCSvVHx1BZW2yDr_i2i9ECg6U,43120
|
|
109
109
|
cognite_toolkit/_cdf_tk/commands/_purge.py,sha256=RadQHsmkPez3fZ5HCP9b82o2_fBx8P_-bTo7prkvWXU,32525
|
|
110
110
|
cognite_toolkit/_cdf_tk/commands/_questionary_style.py,sha256=h-w7fZKkGls3TrzIGBKjsZSGoXJJIYchgD1StfA40r8,806
|
|
111
|
-
cognite_toolkit/_cdf_tk/commands/_upload.py,sha256=
|
|
111
|
+
cognite_toolkit/_cdf_tk/commands/_upload.py,sha256=axrdDIjW59LxByIwq379tfCEkoBSdq8kVx8ORmsOQxo,14422
|
|
112
112
|
cognite_toolkit/_cdf_tk/commands/_utils.py,sha256=UxMJW5QYKts4om5n6x2Tq2ihvfO9gWjhQKeqZNFTlKg,402
|
|
113
113
|
cognite_toolkit/_cdf_tk/commands/_virtual_env.py,sha256=GFAid4hplixmj9_HkcXqU5yCLj-fTXm4cloGD6U2swY,2180
|
|
114
114
|
cognite_toolkit/_cdf_tk/commands/auth.py,sha256=PLjfxfJJKaqux1eB2fycIRlwwSMCbM3qxWDnFX-blJU,31720
|
|
@@ -126,11 +126,11 @@ cognite_toolkit/_cdf_tk/commands/repo.py,sha256=MNy8MWphTklIZHvQOROCweq8_SYxGv6B
|
|
|
126
126
|
cognite_toolkit/_cdf_tk/commands/run.py,sha256=JyX9jLEQej9eRrHVCCNlw4GuF80qETSol3-T5CCofgw,37331
|
|
127
127
|
cognite_toolkit/_cdf_tk/commands/_migrate/__init__.py,sha256=i5ldcTah59K0E4fH5gHTV0GRvtDCEvVses9WQzn9Lno,226
|
|
128
128
|
cognite_toolkit/_cdf_tk/commands/_migrate/canvas.py,sha256=R-z0yfOFcJZj-zRLhN-7z_-SLxqzSmONMgrbzNF9dGs,8843
|
|
129
|
-
cognite_toolkit/_cdf_tk/commands/_migrate/command.py,sha256=
|
|
130
|
-
cognite_toolkit/_cdf_tk/commands/_migrate/conversion.py,sha256=
|
|
129
|
+
cognite_toolkit/_cdf_tk/commands/_migrate/command.py,sha256=jNoqqq81lbdfDTAQ5w2ctaYSUueLhZe0qjUKjCezk6s,14234
|
|
130
|
+
cognite_toolkit/_cdf_tk/commands/_migrate/conversion.py,sha256=_okrcPRaNtM2d8u4Aba1hUYN8CgSTAcDgcugd76aXWA,16775
|
|
131
131
|
cognite_toolkit/_cdf_tk/commands/_migrate/creators.py,sha256=FTu7w3G8KyPY8pagG3KdPpOmpLcjehaAg2auEy6iM7A,9605
|
|
132
132
|
cognite_toolkit/_cdf_tk/commands/_migrate/data_classes.py,sha256=vOdvDPVibAbqLQt8hg7pmdHN1Fd6JUoyOZ-fCzfeEH8,9925
|
|
133
|
-
cognite_toolkit/_cdf_tk/commands/_migrate/data_mapper.py,sha256=
|
|
133
|
+
cognite_toolkit/_cdf_tk/commands/_migrate/data_mapper.py,sha256=5gqVRJGa7rh3c9pwPdipxKfl-zXV4mmU0G_h3ehPe2Q,5339
|
|
134
134
|
cognite_toolkit/_cdf_tk/commands/_migrate/data_model.py,sha256=i1eUsNX6Dueol9STIEwyksBnBsWUk13O8qHIjW964pM,7860
|
|
135
135
|
cognite_toolkit/_cdf_tk/commands/_migrate/default_mappings.py,sha256=KkSq_4R6hQ15ccG-jHy7vVgPwC5IDd5OaXZLvz5mIZs,5547
|
|
136
136
|
cognite_toolkit/_cdf_tk/commands/_migrate/issues.py,sha256=lWSnuS3CfRDbA7i1g12gJ2reJnQcLmZWxHDK19-Wxkk,5772
|
|
@@ -239,9 +239,9 @@ cognite_toolkit/_cdf_tk/resource_classes/robotics/location.py,sha256=dbc9HT-bc2Q
|
|
|
239
239
|
cognite_toolkit/_cdf_tk/resource_classes/robotics/map.py,sha256=j77z7CzCMiMj8r94BdUKCum9EuZRUjaSlUAy9K9DL_Q,942
|
|
240
240
|
cognite_toolkit/_cdf_tk/storageio/__init__.py,sha256=SSMV-W_uqMwS9I0xazBfAyNRqKWlAuLlABropMBEa50,2434
|
|
241
241
|
cognite_toolkit/_cdf_tk/storageio/_annotations.py,sha256=N5z2umaPwBo3OKIyGhNx2geRTBYhAeG3YhCAYm2hyao,4655
|
|
242
|
-
cognite_toolkit/_cdf_tk/storageio/_applications.py,sha256=
|
|
242
|
+
cognite_toolkit/_cdf_tk/storageio/_applications.py,sha256=CdqJueM9ZmXVh8RUme2lAgNasjAM8QTQDAfeJMm2ZYo,7026
|
|
243
243
|
cognite_toolkit/_cdf_tk/storageio/_asset_centric.py,sha256=DbTvIneN8Hw3ByhdH1kXkS7Gw68oXEWtIqlZGZgLMg0,33704
|
|
244
|
-
cognite_toolkit/_cdf_tk/storageio/_base.py,sha256=
|
|
244
|
+
cognite_toolkit/_cdf_tk/storageio/_base.py,sha256=at-5wERENsFRLO1cUOMKW2poVqmkvxSe9JuXpojz4NM,12196
|
|
245
245
|
cognite_toolkit/_cdf_tk/storageio/_data_classes.py,sha256=s3TH04BJ1q7rXndRhEbVMEnoOXjxrGg4n-w9Z5uUL-o,3480
|
|
246
246
|
cognite_toolkit/_cdf_tk/storageio/_datapoints.py,sha256=nV8jaF5YLvMKhDPU3euf554GvSmfNYkzC9ZvEF7kbP8,8660
|
|
247
247
|
cognite_toolkit/_cdf_tk/storageio/_instances.py,sha256=t9fNpHnT6kCk8LDoPj3qZXmHpyDbPF5BZ6pI8ziTyFw,10810
|
|
@@ -291,7 +291,7 @@ cognite_toolkit/_cdf_tk/utils/fileio/_readers.py,sha256=mBf0-8JFwLfyTGJH8nWpbn89
|
|
|
291
291
|
cognite_toolkit/_cdf_tk/utils/fileio/_writers.py,sha256=T9Owx1XQ2bN1voBBLs7hUpTXihCiXgHwEhpIv_XB9xc,17732
|
|
292
292
|
cognite_toolkit/_cdf_tk/utils/http_client/__init__.py,sha256=G8b7Bg4yIet5R4Igh3dS2SntWzE6I0iTGBeNlNsSxkQ,857
|
|
293
293
|
cognite_toolkit/_cdf_tk/utils/http_client/_client.py,sha256=NTRfloXkCiS_rl5Vl1D_hsyTTowMKWDsiIR4oGwTADI,11208
|
|
294
|
-
cognite_toolkit/_cdf_tk/utils/http_client/_data_classes.py,sha256=
|
|
294
|
+
cognite_toolkit/_cdf_tk/utils/http_client/_data_classes.py,sha256=PIlSmv3spObHeoylpSzz2fqUFAjIoE89qzvc0uSOGw0,12975
|
|
295
295
|
cognite_toolkit/_cdf_tk/utils/http_client/_exception.py,sha256=fC9oW6BN0HbUe2AkYABMP7Kj0-9dNYXVFBY5RQztq2c,126
|
|
296
296
|
cognite_toolkit/_cdf_tk/utils/http_client/_tracker.py,sha256=EBBnd-JZ7nc_jYNFJokCHN2UZ9sx0McFLZvlceUYYic,1215
|
|
297
297
|
cognite_toolkit/_repo_files/.env.tmpl,sha256=UmgKZVvIp-OzD8oOcYuwb_6c7vSJsqkLhuFaiVgK7RI,972
|
|
@@ -299,13 +299,13 @@ cognite_toolkit/_repo_files/.gitignore,sha256=ip9kf9tcC5OguF4YF4JFEApnKYw0nG0vPi
|
|
|
299
299
|
cognite_toolkit/_repo_files/AzureDevOps/.devops/README.md,sha256=OLA0D7yCX2tACpzvkA0IfkgQ4_swSd-OlJ1tYcTBpsA,240
|
|
300
300
|
cognite_toolkit/_repo_files/AzureDevOps/.devops/deploy-pipeline.yml,sha256=brULcs8joAeBC_w_aoWjDDUHs3JheLMIR9ajPUK96nc,693
|
|
301
301
|
cognite_toolkit/_repo_files/AzureDevOps/.devops/dry-run-pipeline.yml,sha256=OBFDhFWK1mlT4Dc6mDUE2Es834l8sAlYG50-5RxRtHk,723
|
|
302
|
-
cognite_toolkit/_repo_files/GitHub/.github/workflows/deploy.yaml,sha256=
|
|
303
|
-
cognite_toolkit/_repo_files/GitHub/.github/workflows/dry-run.yaml,sha256=
|
|
304
|
-
cognite_toolkit/_resources/cdf.toml,sha256=
|
|
302
|
+
cognite_toolkit/_repo_files/GitHub/.github/workflows/deploy.yaml,sha256=qEUo28LXoLaLmKW3HxlFAv-kLCe7pJW79ozjNA9-tTQ,668
|
|
303
|
+
cognite_toolkit/_repo_files/GitHub/.github/workflows/dry-run.yaml,sha256=vrp-6DByUjEy_Beovft4LKYkEdh_Sz6hcSNrS1fT1j4,2431
|
|
304
|
+
cognite_toolkit/_resources/cdf.toml,sha256=m5sMGtmA5ileSZWahz8VRHfFSeORhRMaSKJeFZlEbts,488
|
|
305
305
|
cognite_toolkit/demo/__init__.py,sha256=-m1JoUiwRhNCL18eJ6t7fZOL7RPfowhCuqhYFtLgrss,72
|
|
306
306
|
cognite_toolkit/demo/_base.py,sha256=6xKBUQpXZXGQ3fJ5f7nj7oT0s2n7OTAGIa17ZlKHZ5U,8052
|
|
307
|
-
cognite_toolkit-0.6.
|
|
308
|
-
cognite_toolkit-0.6.
|
|
309
|
-
cognite_toolkit-0.6.
|
|
310
|
-
cognite_toolkit-0.6.
|
|
311
|
-
cognite_toolkit-0.6.
|
|
307
|
+
cognite_toolkit-0.6.104.dist-info/METADATA,sha256=76Rem3olFNldH17SpzSmjJLYlDv4z_EJ0kaSuRzM_3U,4502
|
|
308
|
+
cognite_toolkit-0.6.104.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
309
|
+
cognite_toolkit-0.6.104.dist-info/entry_points.txt,sha256=JlR7MH1_UMogC3QOyN4-1l36VbrCX9xUdQoHGkuJ6-4,83
|
|
310
|
+
cognite_toolkit-0.6.104.dist-info/licenses/LICENSE,sha256=CW0DRcx5tL-pCxLEN7ts2S9g2sLRAsWgHVEX4SN9_Mc,752
|
|
311
|
+
cognite_toolkit-0.6.104.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|