cognite-toolkit 0.7.46__py3-none-any.whl → 0.7.48__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/apps/_migrate_app.py +6 -6
- cognite_toolkit/_cdf_tk/client/_toolkit_client.py +6 -4
- cognite_toolkit/_cdf_tk/client/api/agents.py +107 -0
- cognite_toolkit/_cdf_tk/client/api/annotations.py +129 -0
- cognite_toolkit/_cdf_tk/client/api/containers.py +132 -0
- cognite_toolkit/_cdf_tk/client/api/data_models.py +137 -0
- cognite_toolkit/_cdf_tk/client/api/function_schedules.py +115 -0
- cognite_toolkit/_cdf_tk/client/api/functions.py +113 -0
- cognite_toolkit/_cdf_tk/client/api/graphql_data_models.py +167 -0
- cognite_toolkit/_cdf_tk/client/api/groups.py +121 -0
- cognite_toolkit/_cdf_tk/client/api/instances.py +139 -0
- cognite_toolkit/_cdf_tk/client/api/location_filters.py +177 -0
- cognite_toolkit/_cdf_tk/client/api/raw.py +2 -2
- cognite_toolkit/_cdf_tk/client/api/relationships.py +133 -0
- cognite_toolkit/_cdf_tk/client/api/robotics.py +19 -0
- cognite_toolkit/_cdf_tk/client/api/robotics_capabilities.py +127 -0
- cognite_toolkit/_cdf_tk/client/api/robotics_data_postprocessing.py +138 -0
- cognite_toolkit/_cdf_tk/client/api/robotics_frames.py +122 -0
- cognite_toolkit/_cdf_tk/client/api/robotics_locations.py +127 -0
- cognite_toolkit/_cdf_tk/client/api/robotics_maps.py +122 -0
- cognite_toolkit/_cdf_tk/client/api/robotics_robots.py +122 -0
- cognite_toolkit/_cdf_tk/client/api/search_config.py +101 -0
- cognite_toolkit/_cdf_tk/client/api/spaces.py +117 -0
- cognite_toolkit/_cdf_tk/client/api/streams.py +63 -55
- cognite_toolkit/_cdf_tk/client/api/three_d.py +293 -277
- cognite_toolkit/_cdf_tk/client/api/views.py +139 -0
- cognite_toolkit/_cdf_tk/client/cdf_client/api.py +42 -7
- cognite_toolkit/_cdf_tk/client/cdf_client/responses.py +11 -0
- cognite_toolkit/_cdf_tk/client/http_client/_client.py +5 -2
- cognite_toolkit/_cdf_tk/client/http_client/_data_classes.py +10 -0
- cognite_toolkit/_cdf_tk/client/http_client/_data_classes2.py +4 -3
- cognite_toolkit/_cdf_tk/client/request_classes/filters.py +75 -0
- cognite_toolkit/_cdf_tk/client/request_classes/graphql.py +28 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/agent.py +8 -2
- cognite_toolkit/_cdf_tk/client/resource_classes/apm_config.py +128 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/cognite_file.py +53 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/__init__.py +4 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_instance.py +22 -11
- cognite_toolkit/_cdf_tk/client/resource_classes/function_schedule.py +8 -4
- cognite_toolkit/_cdf_tk/client/resource_classes/group/group.py +9 -5
- cognite_toolkit/_cdf_tk/client/resource_classes/identifiers.py +7 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/location_filter.py +9 -2
- cognite_toolkit/_cdf_tk/client/resource_classes/relationship.py +9 -3
- cognite_toolkit/_cdf_tk/client/resource_classes/resource_view_mapping.py +38 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_map.py +6 -1
- cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_robot.py +10 -5
- cognite_toolkit/_cdf_tk/client/resource_classes/streams.py +1 -20
- cognite_toolkit/_cdf_tk/client/resource_classes/three_d.py +30 -9
- cognite_toolkit/_cdf_tk/client/testing.py +2 -2
- cognite_toolkit/_cdf_tk/commands/_migrate/data_mapper.py +5 -5
- cognite_toolkit/_cdf_tk/commands/_migrate/migration_io.py +11 -7
- cognite_toolkit/_cdf_tk/commands/build_v2/_module_parser.py +138 -0
- cognite_toolkit/_cdf_tk/commands/build_v2/_modules_parser.py +163 -0
- cognite_toolkit/_cdf_tk/commands/build_v2/build_cmd.py +83 -96
- cognite_toolkit/_cdf_tk/commands/build_v2/{build_input.py → build_parameters.py} +8 -22
- cognite_toolkit/_cdf_tk/commands/build_v2/data_classes/_modules.py +27 -0
- cognite_toolkit/_cdf_tk/commands/build_v2/data_classes/_resource.py +22 -0
- cognite_toolkit/_cdf_tk/cruds/__init__.py +11 -5
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/streams.py +14 -30
- cognite_toolkit/_cdf_tk/data_classes/__init__.py +3 -0
- cognite_toolkit/_cdf_tk/data_classes/_issues.py +36 -0
- cognite_toolkit/_cdf_tk/data_classes/_module_directories.py +2 -1
- cognite_toolkit/_cdf_tk/storageio/_base.py +2 -0
- cognite_toolkit/_cdf_tk/storageio/logger.py +163 -0
- cognite_toolkit/_cdf_tk/utils/__init__.py +8 -1
- cognite_toolkit/_cdf_tk/utils/interactive_select.py +3 -1
- cognite_toolkit/_cdf_tk/utils/modules.py +7 -0
- 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.7.46.dist-info → cognite_toolkit-0.7.48.dist-info}/METADATA +1 -1
- {cognite_toolkit-0.7.46.dist-info → cognite_toolkit-0.7.48.dist-info}/RECORD +76 -46
- cognite_toolkit/_cdf_tk/commands/build_v2/build_issues.py +0 -27
- /cognite_toolkit/_cdf_tk/client/resource_classes/{search_config_resource.py → search_config.py} +0 -0
- {cognite_toolkit-0.7.46.dist-info → cognite_toolkit-0.7.48.dist-info}/WHEEL +0 -0
- {cognite_toolkit-0.7.46.dist-info → cognite_toolkit-0.7.48.dist-info}/entry_points.txt +0 -0
|
@@ -46,6 +46,8 @@ from ._instance import (
|
|
|
46
46
|
EdgeRequest,
|
|
47
47
|
EdgeResponse,
|
|
48
48
|
InstanceDefinition,
|
|
49
|
+
InstanceRequest,
|
|
50
|
+
InstanceResponse,
|
|
49
51
|
InstanceResponseDefinition,
|
|
50
52
|
InstanceSource,
|
|
51
53
|
NodeRequest,
|
|
@@ -120,6 +122,8 @@ __all__ = [
|
|
|
120
122
|
"IndexAdapter",
|
|
121
123
|
"IndexDefinition",
|
|
122
124
|
"InstanceDefinition",
|
|
125
|
+
"InstanceRequest",
|
|
126
|
+
"InstanceResponse",
|
|
123
127
|
"InstanceResponseDefinition",
|
|
124
128
|
"InstanceSource",
|
|
125
129
|
"Int32Property",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from abc import ABC
|
|
2
|
-
from typing import Any, Generic, Literal
|
|
2
|
+
from typing import Annotated, Any, Generic, Literal, TypeAlias
|
|
3
3
|
|
|
4
|
-
from pydantic import JsonValue, field_serializer, field_validator
|
|
4
|
+
from pydantic import Field, JsonValue, field_serializer, field_validator
|
|
5
5
|
|
|
6
6
|
from cognite_toolkit._cdf_tk.client.resource_classes.base import (
|
|
7
7
|
BaseModelObject,
|
|
@@ -9,8 +9,9 @@ from cognite_toolkit._cdf_tk.client.resource_classes.base import (
|
|
|
9
9
|
ResponseResource,
|
|
10
10
|
T_RequestResource,
|
|
11
11
|
)
|
|
12
|
+
from cognite_toolkit._cdf_tk.client.resource_classes.instance_api import TypedEdgeIdentifier, TypedNodeIdentifier
|
|
12
13
|
|
|
13
|
-
from ._references import ContainerReference,
|
|
14
|
+
from ._references import ContainerReference, NodeReference, ViewReference
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
class InstanceDefinition(BaseModelObject, ABC):
|
|
@@ -87,8 +88,8 @@ class NodeRequest(InstanceRequestDefinition):
|
|
|
87
88
|
instance_type: Literal["node"] = "node"
|
|
88
89
|
type: NodeReference | None = None
|
|
89
90
|
|
|
90
|
-
def as_id(self) ->
|
|
91
|
-
return
|
|
91
|
+
def as_id(self) -> TypedNodeIdentifier:
|
|
92
|
+
return TypedNodeIdentifier(space=self.space, external_id=self.external_id)
|
|
92
93
|
|
|
93
94
|
|
|
94
95
|
class EdgeRequest(InstanceRequestDefinition):
|
|
@@ -99,8 +100,8 @@ class EdgeRequest(InstanceRequestDefinition):
|
|
|
99
100
|
start_node: NodeReference
|
|
100
101
|
end_node: NodeReference
|
|
101
102
|
|
|
102
|
-
def as_id(self) ->
|
|
103
|
-
return
|
|
103
|
+
def as_id(self) -> TypedEdgeIdentifier:
|
|
104
|
+
return TypedEdgeIdentifier(space=self.space, external_id=self.external_id)
|
|
104
105
|
|
|
105
106
|
|
|
106
107
|
class NodeResponse(InstanceResponseDefinition[NodeRequest]):
|
|
@@ -109,8 +110,8 @@ class NodeResponse(InstanceResponseDefinition[NodeRequest]):
|
|
|
109
110
|
instance_type: Literal["node"] = "node"
|
|
110
111
|
type: NodeReference | None = None
|
|
111
112
|
|
|
112
|
-
def as_id(self) ->
|
|
113
|
-
return
|
|
113
|
+
def as_id(self) -> TypedNodeIdentifier:
|
|
114
|
+
return TypedNodeIdentifier(space=self.space, external_id=self.external_id)
|
|
114
115
|
|
|
115
116
|
def as_request_resource(self) -> NodeRequest:
|
|
116
117
|
dumped = self.dump()
|
|
@@ -130,8 +131,8 @@ class EdgeResponse(InstanceResponseDefinition[EdgeRequest]):
|
|
|
130
131
|
start_node: NodeReference
|
|
131
132
|
end_node: NodeReference
|
|
132
133
|
|
|
133
|
-
def as_id(self) ->
|
|
134
|
-
return
|
|
134
|
+
def as_id(self) -> TypedEdgeIdentifier:
|
|
135
|
+
return TypedEdgeIdentifier(space=self.space, external_id=self.external_id)
|
|
135
136
|
|
|
136
137
|
def as_request_resource(self) -> EdgeRequest:
|
|
137
138
|
dumped = self.dump()
|
|
@@ -141,3 +142,13 @@ class EdgeResponse(InstanceResponseDefinition[EdgeRequest]):
|
|
|
141
142
|
]
|
|
142
143
|
dumped["existingVersion"] = dumped.pop("version", None)
|
|
143
144
|
return EdgeRequest.model_validate(dumped, extra="ignore")
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
InstanceRequest: TypeAlias = Annotated[
|
|
148
|
+
NodeRequest | EdgeRequest,
|
|
149
|
+
Field(discriminator="instance_type"),
|
|
150
|
+
]
|
|
151
|
+
InstanceResponse: TypeAlias = Annotated[
|
|
152
|
+
NodeResponse | EdgeResponse,
|
|
153
|
+
Field(discriminator="instance_type"),
|
|
154
|
+
]
|
|
@@ -6,6 +6,7 @@ from cognite_toolkit._cdf_tk.client.resource_classes.base import (
|
|
|
6
6
|
RequestResource,
|
|
7
7
|
ResponseResource,
|
|
8
8
|
)
|
|
9
|
+
from cognite_toolkit._cdf_tk.client.resource_classes.identifiers import InternalId
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
class FunctionScheduleId(Identifier):
|
|
@@ -37,14 +38,17 @@ class FunctionSchedule(BaseModelObject):
|
|
|
37
38
|
class FunctionScheduleRequest(FunctionSchedule, RequestResource):
|
|
38
39
|
"""Request resource for creating/updating function schedules."""
|
|
39
40
|
|
|
41
|
+
# The 'id' field is not part of the request when creating a new resource,
|
|
42
|
+
# but is needed when deleting an existing resource.
|
|
43
|
+
id: int | None = Field(default=None, exclude=True)
|
|
40
44
|
function_id: int
|
|
41
45
|
function_external_id: str | None = Field(None, exclude=True)
|
|
42
46
|
nonce: str
|
|
43
47
|
|
|
44
|
-
def as_id(self) ->
|
|
45
|
-
if self.
|
|
46
|
-
raise ValueError("
|
|
47
|
-
return
|
|
48
|
+
def as_id(self) -> InternalId:
|
|
49
|
+
if self.id is None:
|
|
50
|
+
raise ValueError("Cannot convert FunctionScheduleRequest to InternalId when id is None")
|
|
51
|
+
return InternalId(id=self.id)
|
|
48
52
|
|
|
49
53
|
|
|
50
54
|
class FunctionScheduleResponse(FunctionSchedule, ResponseResource[FunctionScheduleRequest]):
|
|
@@ -6,12 +6,14 @@ https://api-docs.cognite.com/20230101/tag/Groups/operation/createGroups
|
|
|
6
6
|
|
|
7
7
|
from typing import Literal
|
|
8
8
|
|
|
9
|
+
from pydantic import Field
|
|
10
|
+
|
|
9
11
|
from cognite_toolkit._cdf_tk.client.resource_classes.base import (
|
|
10
12
|
BaseModelObject,
|
|
11
13
|
RequestResource,
|
|
12
14
|
ResponseResource,
|
|
13
15
|
)
|
|
14
|
-
from cognite_toolkit._cdf_tk.client.resource_classes.identifiers import
|
|
16
|
+
from cognite_toolkit._cdf_tk.client.resource_classes.identifiers import InternalId
|
|
15
17
|
|
|
16
18
|
from .capability import GroupCapability
|
|
17
19
|
|
|
@@ -38,14 +40,16 @@ class Group(BaseModelObject):
|
|
|
38
40
|
source_id: str | None = None
|
|
39
41
|
members: list[str] | Literal["allUserAccounts"] | None = None
|
|
40
42
|
|
|
41
|
-
def as_id(self) -> NameId:
|
|
42
|
-
return NameId(name=self.name)
|
|
43
|
-
|
|
44
43
|
|
|
45
44
|
class GroupRequest(Group, RequestResource):
|
|
46
45
|
"""Group request resource for creating/updating groups."""
|
|
47
46
|
|
|
48
|
-
|
|
47
|
+
id: int | None = Field(default=None, exclude=True)
|
|
48
|
+
|
|
49
|
+
def as_id(self) -> InternalId:
|
|
50
|
+
if self.id is None:
|
|
51
|
+
raise ValueError("Cannot convert GroupRequest to InternalId when id is None")
|
|
52
|
+
return InternalId(id=self.id)
|
|
49
53
|
|
|
50
54
|
|
|
51
55
|
class GroupResponse(Group, ResponseResource[GroupRequest]):
|
|
@@ -50,3 +50,10 @@ class WorkflowVersionId(Identifier):
|
|
|
50
50
|
|
|
51
51
|
def __str__(self) -> str:
|
|
52
52
|
return f"workflowExternalId='{self.workflow_external_id}', version='{self.version}'"
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class DataSetId(Identifier):
|
|
56
|
+
data_set_id: int
|
|
57
|
+
|
|
58
|
+
def __str__(self) -> str:
|
|
59
|
+
return f"dataSetId={self.data_set_id}"
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
from typing import Literal
|
|
2
2
|
|
|
3
|
+
from pydantic import Field
|
|
4
|
+
|
|
3
5
|
from cognite_toolkit._cdf_tk.client.resource_classes.base import BaseModelObject, RequestResource, ResponseResource
|
|
4
6
|
|
|
5
7
|
from .data_modeling import DataModelReference
|
|
@@ -61,8 +63,13 @@ class LocationFilter(BaseModelObject):
|
|
|
61
63
|
class LocationFilterRequest(LocationFilter, RequestResource):
|
|
62
64
|
"""Request resource for creating/updating location filters."""
|
|
63
65
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
# This is not part of the request payload, but we need it to identify existing resources for updates.
|
|
67
|
+
id: int | None = Field(default=None, exclude=True)
|
|
68
|
+
|
|
69
|
+
def as_id(self) -> InternalId:
|
|
70
|
+
if self.id is None:
|
|
71
|
+
raise ValueError("Cannot get ID for LocationFilterRequest without 'id' set.")
|
|
72
|
+
return InternalId(id=self.id)
|
|
66
73
|
|
|
67
74
|
|
|
68
75
|
class LocationFilterResponse(LocationFilter, ResponseResource[LocationFilterRequest]):
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
from typing import Literal
|
|
1
|
+
from typing import ClassVar, Literal
|
|
2
2
|
|
|
3
|
-
from cognite_toolkit._cdf_tk.client.resource_classes.base import
|
|
3
|
+
from cognite_toolkit._cdf_tk.client.resource_classes.base import (
|
|
4
|
+
BaseModelObject,
|
|
5
|
+
RequestUpdateable,
|
|
6
|
+
ResponseResource,
|
|
7
|
+
)
|
|
4
8
|
|
|
5
9
|
from .identifiers import ExternalId
|
|
6
10
|
|
|
@@ -26,9 +30,11 @@ class Relationship(BaseModelObject):
|
|
|
26
30
|
labels: list[LabelRef] | None = None
|
|
27
31
|
|
|
28
32
|
|
|
29
|
-
class RelationshipRequest(Relationship,
|
|
33
|
+
class RelationshipRequest(Relationship, RequestUpdateable):
|
|
30
34
|
"""Request resource for creating/updating relationships."""
|
|
31
35
|
|
|
36
|
+
container_fields: ClassVar[frozenset[str]] = frozenset({"labels"})
|
|
37
|
+
|
|
32
38
|
def as_id(self) -> ExternalId:
|
|
33
39
|
return ExternalId(external_id=self.external_id)
|
|
34
40
|
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from typing import ClassVar, Literal
|
|
2
|
+
|
|
3
|
+
from cognite_toolkit._cdf_tk.client.resource_classes.base import (
|
|
4
|
+
BaseModelObject,
|
|
5
|
+
RequestResource,
|
|
6
|
+
ResponseResource,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
from .data_modeling import ViewReference
|
|
10
|
+
from .identifiers import ExternalId
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ResourceViewMapping(BaseModelObject):
|
|
14
|
+
space: ClassVar[str] = "cognite_migration"
|
|
15
|
+
view_ref: ClassVar[ViewReference] = ViewReference(
|
|
16
|
+
space="cognite_migration", external_id="ResourceViewMapping", version="v1"
|
|
17
|
+
)
|
|
18
|
+
instance_type: Literal["node"] = "node"
|
|
19
|
+
external_id: str
|
|
20
|
+
resource_type: str
|
|
21
|
+
view_id: ViewReference
|
|
22
|
+
property_mapping: dict[str, str]
|
|
23
|
+
|
|
24
|
+
def as_id(self) -> ExternalId:
|
|
25
|
+
return ExternalId(external_id=self.external_id)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ResourceViewMappingRequest(ResourceViewMapping, RequestResource):
|
|
29
|
+
existing_version: int | None = None
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class ResourceViewMappingResponse(ResourceViewMapping, ResponseResource[ResourceViewMappingRequest]):
|
|
33
|
+
version: int
|
|
34
|
+
created_time: int
|
|
35
|
+
last_updated_time: int
|
|
36
|
+
|
|
37
|
+
def as_request_resource(self) -> ResourceViewMappingRequest:
|
|
38
|
+
return ResourceViewMappingRequest.model_validate(self.dump(), extra="ignore")
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import ClassVar
|
|
1
|
+
from typing import ClassVar, Literal
|
|
2
2
|
|
|
3
3
|
from pydantic import JsonValue
|
|
4
4
|
|
|
@@ -49,6 +49,11 @@ class RobotMapRequest(RobotMap, RequestUpdateable):
|
|
|
49
49
|
{"description", "data", "frame_external_id", "location_external_id", "scale"}
|
|
50
50
|
)
|
|
51
51
|
|
|
52
|
+
def as_update(self, mode: Literal["patch", "replace"]) -> dict[str, JsonValue]:
|
|
53
|
+
update = super().as_update(mode)
|
|
54
|
+
update["update"].pop("mapType", None)
|
|
55
|
+
return update
|
|
56
|
+
|
|
52
57
|
|
|
53
58
|
class RobotMapResponse(RobotMap, ResponseResource[RobotMapRequest]):
|
|
54
59
|
"""Response resource for a RobotMap."""
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
from typing import ClassVar
|
|
1
|
+
from typing import Any, ClassVar, Literal
|
|
2
2
|
|
|
3
3
|
from cognite_toolkit._cdf_tk.client.resource_classes.base import (
|
|
4
4
|
BaseModelObject,
|
|
5
5
|
RequestUpdateable,
|
|
6
6
|
ResponseResource,
|
|
7
7
|
)
|
|
8
|
-
from cognite_toolkit._cdf_tk.client.resource_classes.identifiers import
|
|
8
|
+
from cognite_toolkit._cdf_tk.client.resource_classes.identifiers import DataSetId
|
|
9
9
|
|
|
10
10
|
from ._common import RobotType
|
|
11
11
|
|
|
@@ -32,15 +32,20 @@ class Robot(BaseModelObject):
|
|
|
32
32
|
metadata: dict[str, str] | None = None
|
|
33
33
|
location_external_id: str | None = None
|
|
34
34
|
|
|
35
|
-
def as_id(self) ->
|
|
36
|
-
return
|
|
35
|
+
def as_id(self) -> DataSetId:
|
|
36
|
+
return DataSetId(data_set_id=self.data_set_id)
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
class RobotRequest(Robot, RequestUpdateable):
|
|
40
40
|
"""Request resource for creating or updating a Robot."""
|
|
41
41
|
|
|
42
42
|
container_fields: ClassVar[frozenset[str]] = frozenset({"metadata"})
|
|
43
|
-
non_nullable_fields: ClassVar[frozenset[str]] = frozenset({"location_external_id"})
|
|
43
|
+
non_nullable_fields: ClassVar[frozenset[str]] = frozenset({"location_external_id", "description"})
|
|
44
|
+
|
|
45
|
+
def as_update(self, mode: Literal["patch", "replace"]) -> dict[str, Any]:
|
|
46
|
+
update = super().as_update(mode)
|
|
47
|
+
update["update"].pop("capabilities", None)
|
|
48
|
+
return update
|
|
44
49
|
|
|
45
50
|
|
|
46
51
|
class RobotResponse(Robot, ResponseResource[RobotRequest]):
|
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
from typing import Literal
|
|
2
2
|
|
|
3
3
|
from cognite_toolkit._cdf_tk.constants import StreamTemplateName
|
|
4
|
-
from cognite_toolkit._cdf_tk.protocols import (
|
|
5
|
-
ResourceRequestListProtocol,
|
|
6
|
-
ResourceResponseListProtocol,
|
|
7
|
-
)
|
|
8
4
|
|
|
9
|
-
from .base import BaseModelObject,
|
|
5
|
+
from .base import BaseModelObject, RequestResource, ResponseResource
|
|
10
6
|
from .identifiers import ExternalId
|
|
11
7
|
|
|
12
8
|
|
|
@@ -23,12 +19,6 @@ class StreamRequest(Stream, RequestResource):
|
|
|
23
19
|
return ExternalId(external_id=self.external_id)
|
|
24
20
|
|
|
25
21
|
|
|
26
|
-
class StreamRequestList(BaseResourceList[StreamRequest], ResourceRequestListProtocol):
|
|
27
|
-
"""List of Stream request resources."""
|
|
28
|
-
|
|
29
|
-
_RESOURCE = StreamRequest
|
|
30
|
-
|
|
31
|
-
|
|
32
22
|
class LifecycleObject(BaseModelObject):
|
|
33
23
|
"""Lifecycle object."""
|
|
34
24
|
|
|
@@ -81,12 +71,3 @@ class StreamResponse(Stream, ResponseResource[StreamRequest]):
|
|
|
81
71
|
"settings": {"template": {"name": self.created_from_template}},
|
|
82
72
|
}
|
|
83
73
|
)
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
class StreamResponseList(BaseResourceList[StreamResponse], ResourceResponseListProtocol):
|
|
87
|
-
"""List of Stream response resources."""
|
|
88
|
-
|
|
89
|
-
_RESOURCE = StreamResponse
|
|
90
|
-
|
|
91
|
-
def as_write(self) -> StreamRequestList:
|
|
92
|
-
return StreamRequestList([item.as_write() for item in self.data])
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import sys
|
|
2
|
-
from typing import Literal
|
|
2
|
+
from typing import ClassVar, Literal
|
|
3
3
|
|
|
4
4
|
from pydantic import Field
|
|
5
5
|
|
|
6
|
-
from .base import BaseModelObject, Identifier, RequestResource, ResponseResource
|
|
7
|
-
from .identifiers import
|
|
6
|
+
from .base import BaseModelObject, Identifier, RequestResource, RequestUpdateable, ResponseResource
|
|
7
|
+
from .identifiers import InternalId
|
|
8
8
|
from .instance_api import NodeReference
|
|
9
9
|
|
|
10
10
|
if sys.version_info >= (3, 11):
|
|
@@ -23,12 +23,18 @@ class RevisionStatus(BaseModelObject):
|
|
|
23
23
|
|
|
24
24
|
class ThreeDModelRequest(RequestResource):
|
|
25
25
|
name: str
|
|
26
|
+
# This field is part of the path request and not the body schema.
|
|
27
|
+
# but is needed for identifier conversion.
|
|
28
|
+
id: int | None = Field(None, exclude=True)
|
|
26
29
|
|
|
27
|
-
def as_id(self) ->
|
|
28
|
-
|
|
30
|
+
def as_id(self) -> InternalId:
|
|
31
|
+
if self.id is None:
|
|
32
|
+
raise ValueError("Cannot convert to InternalId when id is None.")
|
|
33
|
+
return InternalId(id=self.id)
|
|
29
34
|
|
|
30
35
|
|
|
31
|
-
class ThreeDModelClassicRequest(ThreeDModelRequest):
|
|
36
|
+
class ThreeDModelClassicRequest(ThreeDModelRequest, RequestUpdateable):
|
|
37
|
+
container_fields: ClassVar[frozenset[str]] = frozenset({"metadata"})
|
|
32
38
|
data_set_id: int | None = None
|
|
33
39
|
metadata: dict[str, str] | None = None
|
|
34
40
|
|
|
@@ -91,17 +97,32 @@ class AssetMappingClassicRequest(RequestResource, Identifier):
|
|
|
91
97
|
return f"{self.model_id}_{self.revision_id}_{self.node_id}_{asset_part}"
|
|
92
98
|
|
|
93
99
|
|
|
94
|
-
class
|
|
100
|
+
class AssetMappingClassicResponse(ResponseResource[AssetMappingClassicRequest]):
|
|
95
101
|
node_id: int
|
|
96
102
|
asset_id: int | None = None
|
|
97
103
|
asset_instance_id: NodeReference | None = None
|
|
98
104
|
tree_index: int | None = None
|
|
99
105
|
subtree_size: int | None = None
|
|
100
106
|
# These fields are part of the path request and response, but they are included here for convenience.
|
|
101
|
-
model_id: int = Field(exclude=True)
|
|
102
|
-
revision_id: int = Field(exclude=True)
|
|
107
|
+
model_id: int = Field(-1, exclude=True)
|
|
108
|
+
revision_id: int = Field(-1, exclude=True)
|
|
103
109
|
|
|
104
110
|
def as_request_resource(self) -> AssetMappingClassicRequest:
|
|
105
111
|
return AssetMappingClassicRequest.model_validate(
|
|
106
112
|
{**self.dump(), "modelId": self.model_id, "revisionId": self.revision_id}
|
|
107
113
|
)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class AssetMappingDMResponse(ResponseResource[AssetMappingDMRequest]):
|
|
117
|
+
node_id: int
|
|
118
|
+
asset_instance_id: NodeReference
|
|
119
|
+
tree_index: int | None = None
|
|
120
|
+
subtree_size: int | None = None
|
|
121
|
+
# These fields are part of the path request and response, but they are included here for convenience.
|
|
122
|
+
model_id: int = Field(-1, exclude=True)
|
|
123
|
+
revision_id: int = Field(-1, exclude=True)
|
|
124
|
+
|
|
125
|
+
def as_request_resource(self) -> AssetMappingDMRequest:
|
|
126
|
+
return AssetMappingDMRequest.model_validate(
|
|
127
|
+
{**self.dump(), "modelId": self.model_id, "revisionId": self.revision_id}
|
|
128
|
+
)
|
|
@@ -65,7 +65,7 @@ from .api.search import SearchAPI
|
|
|
65
65
|
from .api.security_categories import SecurityCategoriesAPI
|
|
66
66
|
from .api.sequences import SequencesAPI
|
|
67
67
|
from .api.streams import StreamsAPI
|
|
68
|
-
from .api.three_d import ThreeDAPI,
|
|
68
|
+
from .api.three_d import ThreeDAPI, ThreeDClassicModelsAPI
|
|
69
69
|
from .api.timeseries import TimeSeriesAPI
|
|
70
70
|
from .api.token import TokenAPI
|
|
71
71
|
from .api.transformations import TransformationsAPI
|
|
@@ -151,7 +151,7 @@ class ToolkitClientMock(CogniteClientMock):
|
|
|
151
151
|
|
|
152
152
|
self.tool = MagicMock(spec=ToolAPI)
|
|
153
153
|
self.tool.three_d = MagicMock(spec=ThreeDAPI)
|
|
154
|
-
self.tool.three_d.
|
|
154
|
+
self.tool.three_d.models_classic = MagicMock(spec_set=ThreeDClassicModelsAPI)
|
|
155
155
|
self.tool.assets = MagicMock(spec_set=AssetsAPI)
|
|
156
156
|
self.tool.timeseries = MagicMock(spec_set=TimeSeriesAPI)
|
|
157
157
|
self.tool.filemetadata = MagicMock(spec_set=FileMetadataAPI)
|
|
@@ -30,8 +30,8 @@ from cognite_toolkit._cdf_tk.client.resource_classes.legacy.canvas import (
|
|
|
30
30
|
from cognite_toolkit._cdf_tk.client.resource_classes.legacy.charts import Chart, ChartWrite
|
|
31
31
|
from cognite_toolkit._cdf_tk.client.resource_classes.legacy.migration import ResourceViewMappingApply
|
|
32
32
|
from cognite_toolkit._cdf_tk.client.resource_classes.three_d import (
|
|
33
|
+
AssetMappingClassicResponse,
|
|
33
34
|
AssetMappingDMRequest,
|
|
34
|
-
AssetMappingResponse,
|
|
35
35
|
RevisionStatus,
|
|
36
36
|
ThreeDModelResponse,
|
|
37
37
|
)
|
|
@@ -477,12 +477,12 @@ class ThreeDMapper(DataMapper[ThreeDSelector, ThreeDModelResponse, ThreeDMigrati
|
|
|
477
477
|
return None
|
|
478
478
|
|
|
479
479
|
|
|
480
|
-
class ThreeDAssetMapper(DataMapper[ThreeDSelector,
|
|
480
|
+
class ThreeDAssetMapper(DataMapper[ThreeDSelector, AssetMappingClassicResponse, AssetMappingDMRequest]):
|
|
481
481
|
def __init__(self, client: ToolkitClient) -> None:
|
|
482
482
|
self.client = client
|
|
483
483
|
|
|
484
484
|
def map(
|
|
485
|
-
self, source: Sequence[
|
|
485
|
+
self, source: Sequence[AssetMappingClassicResponse]
|
|
486
486
|
) -> Sequence[tuple[AssetMappingDMRequest | None, MigrationIssue]]:
|
|
487
487
|
output: list[tuple[AssetMappingDMRequest | None, MigrationIssue]] = []
|
|
488
488
|
self._populate_cache(source)
|
|
@@ -491,7 +491,7 @@ class ThreeDAssetMapper(DataMapper[ThreeDSelector, AssetMappingResponse, AssetMa
|
|
|
491
491
|
output.append((mapped_item, issue))
|
|
492
492
|
return output
|
|
493
493
|
|
|
494
|
-
def _populate_cache(self, source: Sequence[
|
|
494
|
+
def _populate_cache(self, source: Sequence[AssetMappingClassicResponse]) -> None:
|
|
495
495
|
asset_ids: set[int] = set()
|
|
496
496
|
for mapping in source:
|
|
497
497
|
if mapping.asset_id is not None:
|
|
@@ -499,7 +499,7 @@ class ThreeDAssetMapper(DataMapper[ThreeDSelector, AssetMappingResponse, AssetMa
|
|
|
499
499
|
self.client.migration.lookup.assets(list(asset_ids))
|
|
500
500
|
|
|
501
501
|
def _map_single_item(
|
|
502
|
-
self, item:
|
|
502
|
+
self, item: AssetMappingClassicResponse
|
|
503
503
|
) -> tuple[AssetMappingDMRequest | None, ThreeDModelMigrationIssue]:
|
|
504
504
|
issue = ThreeDModelMigrationIssue(model_name=f"AssetMapping_{item.model_id}", model_id=item.model_id)
|
|
505
505
|
asset_instance_id = item.asset_instance_id
|
|
@@ -16,8 +16,8 @@ from cognite_toolkit._cdf_tk.client.http_client import (
|
|
|
16
16
|
)
|
|
17
17
|
from cognite_toolkit._cdf_tk.client.resource_classes.legacy.pending_instances_ids import PendingInstanceId
|
|
18
18
|
from cognite_toolkit._cdf_tk.client.resource_classes.three_d import (
|
|
19
|
+
AssetMappingClassicResponse,
|
|
19
20
|
AssetMappingDMRequest,
|
|
20
|
-
AssetMappingResponse,
|
|
21
21
|
ThreeDModelResponse,
|
|
22
22
|
)
|
|
23
23
|
from cognite_toolkit._cdf_tk.commands._migrate.data_classes import ThreeDMigrationRequest
|
|
@@ -415,7 +415,7 @@ class ThreeDMigrationIO(UploadableStorageIO[ThreeDSelector, ThreeDModelResponse,
|
|
|
415
415
|
total = 0
|
|
416
416
|
while True:
|
|
417
417
|
request_limit = min(self.DOWNLOAD_LIMIT, limit - total) if limit is not None else self.DOWNLOAD_LIMIT
|
|
418
|
-
response = self.client.tool.three_d.
|
|
418
|
+
response = self.client.tool.three_d.models_classic.paginate(
|
|
419
419
|
published=published, include_revision_info=True, limit=request_limit, cursor=cursor
|
|
420
420
|
)
|
|
421
421
|
items = [item for item in response.items if self._is_selected(item, included_models)]
|
|
@@ -477,7 +477,9 @@ class ThreeDMigrationIO(UploadableStorageIO[ThreeDSelector, ThreeDModelResponse,
|
|
|
477
477
|
return results
|
|
478
478
|
|
|
479
479
|
|
|
480
|
-
class ThreeDAssetMappingMigrationIO(
|
|
480
|
+
class ThreeDAssetMappingMigrationIO(
|
|
481
|
+
UploadableStorageIO[ThreeDSelector, AssetMappingClassicResponse, AssetMappingDMRequest]
|
|
482
|
+
):
|
|
481
483
|
KIND = "3DMigrationAssetMapping"
|
|
482
484
|
SUPPORTED_DOWNLOAD_FORMATS = frozenset({".ndjson"})
|
|
483
485
|
SUPPORTED_COMPRESSIONS = frozenset({".gz"})
|
|
@@ -493,10 +495,12 @@ class ThreeDAssetMappingMigrationIO(UploadableStorageIO[ThreeDSelector, AssetMap
|
|
|
493
495
|
# We can only migrate asset mappings for 3D models that are already migrated to data modeling.
|
|
494
496
|
self._3D_io = ThreeDMigrationIO(client, data_model_type="data modeling")
|
|
495
497
|
|
|
496
|
-
def as_id(self, item:
|
|
498
|
+
def as_id(self, item: AssetMappingClassicResponse) -> str:
|
|
497
499
|
return f"AssetMapping_{item.model_id!s}_{item.revision_id!s}_{item.asset_id!s}"
|
|
498
500
|
|
|
499
|
-
def stream_data(
|
|
501
|
+
def stream_data(
|
|
502
|
+
self, selector: ThreeDSelector, limit: int | None = None
|
|
503
|
+
) -> Iterable[Page[AssetMappingClassicResponse]]:
|
|
500
504
|
total = 0
|
|
501
505
|
for three_d_page in self._3D_io.stream_data(selector, None):
|
|
502
506
|
for model in three_d_page.items:
|
|
@@ -510,7 +514,7 @@ class ThreeDAssetMappingMigrationIO(UploadableStorageIO[ThreeDSelector, AssetMap
|
|
|
510
514
|
)
|
|
511
515
|
if limit is not None and total >= limit:
|
|
512
516
|
return
|
|
513
|
-
response = self.client.tool.three_d.
|
|
517
|
+
response = self.client.tool.three_d.asset_mappings_classic.paginate(
|
|
514
518
|
model_id=model.id,
|
|
515
519
|
revision_id=model.last_revision_info.revision_id,
|
|
516
520
|
cursor=cursor,
|
|
@@ -562,6 +566,6 @@ class ThreeDAssetMappingMigrationIO(UploadableStorageIO[ThreeDSelector, AssetMap
|
|
|
562
566
|
raise NotImplementedError("Deserializing 3D Asset Mappings from JSON is not supported.")
|
|
563
567
|
|
|
564
568
|
def data_to_json_chunk(
|
|
565
|
-
self, data_chunk: Sequence[
|
|
569
|
+
self, data_chunk: Sequence[AssetMappingClassicResponse], selector: ThreeDSelector | None = None
|
|
566
570
|
) -> list[dict[str, JsonVal]]:
|
|
567
571
|
raise NotImplementedError("Serializing 3D Asset Mappings to JSON is not supported.")
|