cognite-toolkit 0.7.71__py3-none-any.whl → 0.7.73__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/builders/_raw.py +2 -2
- cognite_toolkit/_cdf_tk/client/_toolkit_client.py +0 -2
- cognite_toolkit/_cdf_tk/client/api/raw.py +47 -27
- cognite_toolkit/_cdf_tk/client/api/robotics_capabilities.py +9 -3
- cognite_toolkit/_cdf_tk/client/api/robotics_data_postprocessing.py +12 -3
- cognite_toolkit/_cdf_tk/client/api/robotics_frames.py +10 -3
- cognite_toolkit/_cdf_tk/client/api/robotics_locations.py +10 -3
- cognite_toolkit/_cdf_tk/client/api/robotics_maps.py +10 -3
- cognite_toolkit/_cdf_tk/client/api/robotics_robots.py +10 -3
- cognite_toolkit/_cdf_tk/client/http_client/_client.py +1 -1
- cognite_toolkit/_cdf_tk/client/http_client/_data_classes.py +1 -0
- cognite_toolkit/_cdf_tk/client/http_client/_exception.py +6 -1
- cognite_toolkit/_cdf_tk/client/resource_classes/identifiers.py +26 -1
- cognite_toolkit/_cdf_tk/client/resource_classes/raw.py +70 -16
- cognite_toolkit/_cdf_tk/client/testing.py +23 -19
- cognite_toolkit/_cdf_tk/commands/build_cmd.py +2 -2
- cognite_toolkit/_cdf_tk/cruds/_data_cruds.py +3 -3
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/auth.py +4 -5
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/extraction_pipeline.py +3 -3
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/raw.py +99 -91
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/robotics.py +154 -160
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/transformation.py +3 -3
- 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.71.dist-info → cognite_toolkit-0.7.73.dist-info}/METADATA +1 -1
- {cognite_toolkit-0.7.71.dist-info → cognite_toolkit-0.7.73.dist-info}/RECORD +30 -40
- cognite_toolkit/_cdf_tk/client/api/legacy/robotics/__init__.py +0 -8
- cognite_toolkit/_cdf_tk/client/api/legacy/robotics/api.py +0 -20
- cognite_toolkit/_cdf_tk/client/api/legacy/robotics/capabilities.py +0 -142
- cognite_toolkit/_cdf_tk/client/api/legacy/robotics/data_postprocessing.py +0 -144
- cognite_toolkit/_cdf_tk/client/api/legacy/robotics/frames.py +0 -136
- cognite_toolkit/_cdf_tk/client/api/legacy/robotics/locations.py +0 -136
- cognite_toolkit/_cdf_tk/client/api/legacy/robotics/maps.py +0 -136
- cognite_toolkit/_cdf_tk/client/api/legacy/robotics/robots.py +0 -132
- cognite_toolkit/_cdf_tk/client/api/legacy/robotics/utlis.py +0 -13
- cognite_toolkit/_cdf_tk/client/resource_classes/legacy/robotics.py +0 -970
- {cognite_toolkit-0.7.71.dist-info → cognite_toolkit-0.7.73.dist-info}/WHEEL +0 -0
- {cognite_toolkit-0.7.71.dist-info → cognite_toolkit-0.7.73.dist-info}/entry_points.txt +0 -0
|
@@ -3,7 +3,7 @@ from collections.abc import Callable, Iterable, Sequence
|
|
|
3
3
|
from typing import Any
|
|
4
4
|
|
|
5
5
|
from cognite_toolkit._cdf_tk.builders import Builder
|
|
6
|
-
from cognite_toolkit._cdf_tk.client.resource_classes.
|
|
6
|
+
from cognite_toolkit._cdf_tk.client.resource_classes.identifiers import RawDatabaseId
|
|
7
7
|
from cognite_toolkit._cdf_tk.cruds import RawDatabaseCRUD, RawTableCRUD, ResourceCRUD
|
|
8
8
|
from cognite_toolkit._cdf_tk.data_classes import (
|
|
9
9
|
BuildDestinationFile,
|
|
@@ -40,7 +40,7 @@ class RawBuilder(Builder):
|
|
|
40
40
|
entry_by_loader[RawDatabaseCRUD].append(item)
|
|
41
41
|
else:
|
|
42
42
|
entry_by_loader[RawTableCRUD].append(item)
|
|
43
|
-
db_item = RawDatabaseCRUD.dump_id(
|
|
43
|
+
db_item = RawDatabaseCRUD.dump_id(RawDatabaseId(name=table_id.db_name))
|
|
44
44
|
hashable_db_item = tuple(db_item.items())
|
|
45
45
|
if hashable_db_item not in seen_databases:
|
|
46
46
|
seen_databases.add(hashable_db_item)
|
|
@@ -11,7 +11,6 @@ from cognite_toolkit._cdf_tk.client.api.legacy.extended_files import ExtendedFil
|
|
|
11
11
|
from cognite_toolkit._cdf_tk.client.api.legacy.extended_functions import ExtendedFunctionsAPI
|
|
12
12
|
from cognite_toolkit._cdf_tk.client.api.legacy.extended_raw import ExtendedRawAPI
|
|
13
13
|
from cognite_toolkit._cdf_tk.client.api.legacy.extended_timeseries import ExtendedTimeSeriesAPI
|
|
14
|
-
from cognite_toolkit._cdf_tk.client.api.legacy.robotics import RoboticsAPI as RoboticsLegacyAPI
|
|
15
14
|
from cognite_toolkit._cdf_tk.client.http_client import HTTPClient
|
|
16
15
|
|
|
17
16
|
from .api.assets import AssetsAPI
|
|
@@ -80,7 +79,6 @@ class ToolkitClient(CogniteClient):
|
|
|
80
79
|
self.console = console or Console()
|
|
81
80
|
self.tool = ToolAPI(http_client, self.console)
|
|
82
81
|
self.search = SearchAPI(self._config, self._API_VERSION, self)
|
|
83
|
-
self.robotics = RoboticsLegacyAPI(self._config, self._API_VERSION, self)
|
|
84
82
|
self.dml = DMLAPI(self._config, self._API_VERSION, self)
|
|
85
83
|
self.verify = VerifyAPI(self._config, self._API_VERSION, self)
|
|
86
84
|
self.lookup = LookUpGroup(self._config, self._API_VERSION, self, self.console)
|
|
@@ -2,10 +2,16 @@ from collections.abc import Iterable, Sequence
|
|
|
2
2
|
|
|
3
3
|
from cognite_toolkit._cdf_tk.client.cdf_client import CDFResourceAPI, Endpoint, PagedResponse, ResponseItems
|
|
4
4
|
from cognite_toolkit._cdf_tk.client.http_client import HTTPClient, ItemsSuccessResponse, SuccessResponse
|
|
5
|
-
from cognite_toolkit._cdf_tk.client.resource_classes.
|
|
5
|
+
from cognite_toolkit._cdf_tk.client.resource_classes.identifiers import RawDatabaseId, RawTableId
|
|
6
|
+
from cognite_toolkit._cdf_tk.client.resource_classes.raw import (
|
|
7
|
+
RAWDatabaseRequest,
|
|
8
|
+
RAWDatabaseResponse,
|
|
9
|
+
RAWTableRequest,
|
|
10
|
+
RAWTableResponse,
|
|
11
|
+
)
|
|
6
12
|
|
|
7
13
|
|
|
8
|
-
class RawDatabasesAPI(CDFResourceAPI[
|
|
14
|
+
class RawDatabasesAPI(CDFResourceAPI[RawDatabaseId, RAWDatabaseRequest, RAWDatabaseResponse]):
|
|
9
15
|
"""API for managing RAW databases in CDF.
|
|
10
16
|
|
|
11
17
|
This API provides methods to create, list, and delete RAW databases.
|
|
@@ -21,13 +27,15 @@ class RawDatabasesAPI(CDFResourceAPI[RAWDatabase, RAWDatabase, RAWDatabase]):
|
|
|
21
27
|
},
|
|
22
28
|
)
|
|
23
29
|
|
|
24
|
-
def _validate_page_response(
|
|
25
|
-
|
|
30
|
+
def _validate_page_response(
|
|
31
|
+
self, response: SuccessResponse | ItemsSuccessResponse
|
|
32
|
+
) -> PagedResponse[RAWDatabaseResponse]:
|
|
33
|
+
return PagedResponse[RAWDatabaseResponse].model_validate_json(response.body)
|
|
26
34
|
|
|
27
|
-
def _reference_response(self, response: SuccessResponse) -> ResponseItems[
|
|
28
|
-
return ResponseItems[
|
|
35
|
+
def _reference_response(self, response: SuccessResponse) -> ResponseItems[RAWDatabaseResponse]:
|
|
36
|
+
return ResponseItems[RAWDatabaseResponse].model_validate_json(response.body)
|
|
29
37
|
|
|
30
|
-
def create(self, items: Sequence[
|
|
38
|
+
def create(self, items: Sequence[RAWDatabaseRequest]) -> list[RAWDatabaseResponse]:
|
|
31
39
|
"""Create databases in CDF.
|
|
32
40
|
|
|
33
41
|
Args:
|
|
@@ -38,20 +46,20 @@ class RawDatabasesAPI(CDFResourceAPI[RAWDatabase, RAWDatabase, RAWDatabase]):
|
|
|
38
46
|
"""
|
|
39
47
|
return self._request_item_response(list(items), "create")
|
|
40
48
|
|
|
41
|
-
def delete(self, items: Sequence[
|
|
49
|
+
def delete(self, items: Sequence[RawDatabaseId], recursive: bool = False) -> None:
|
|
42
50
|
"""Delete databases from CDF.
|
|
43
51
|
|
|
44
52
|
Args:
|
|
45
53
|
items: List of RAWDatabase objects to delete.
|
|
46
54
|
recursive: Whether to delete tables within the database recursively.
|
|
47
55
|
"""
|
|
48
|
-
self._request_no_response(
|
|
56
|
+
self._request_no_response(items, "delete", extra_body={"recursive": recursive})
|
|
49
57
|
|
|
50
58
|
def paginate(
|
|
51
59
|
self,
|
|
52
60
|
limit: int = 100,
|
|
53
61
|
cursor: str | None = None,
|
|
54
|
-
) -> PagedResponse[
|
|
62
|
+
) -> PagedResponse[RAWDatabaseResponse]:
|
|
55
63
|
"""Iterate over all databases in CDF.
|
|
56
64
|
|
|
57
65
|
Args:
|
|
@@ -66,7 +74,7 @@ class RawDatabasesAPI(CDFResourceAPI[RAWDatabase, RAWDatabase, RAWDatabase]):
|
|
|
66
74
|
def iterate(
|
|
67
75
|
self,
|
|
68
76
|
limit: int = 100,
|
|
69
|
-
) -> Iterable[list[
|
|
77
|
+
) -> Iterable[list[RAWDatabaseResponse]]:
|
|
70
78
|
"""Iterate over all databases in CDF.
|
|
71
79
|
|
|
72
80
|
Args:
|
|
@@ -77,7 +85,7 @@ class RawDatabasesAPI(CDFResourceAPI[RAWDatabase, RAWDatabase, RAWDatabase]):
|
|
|
77
85
|
"""
|
|
78
86
|
return self._iterate(limit=limit)
|
|
79
87
|
|
|
80
|
-
def list(self, limit: int | None = None) -> list[
|
|
88
|
+
def list(self, limit: int | None = None) -> list[RAWDatabaseResponse]:
|
|
81
89
|
"""List all databases in CDF.
|
|
82
90
|
|
|
83
91
|
Args:
|
|
@@ -89,7 +97,7 @@ class RawDatabasesAPI(CDFResourceAPI[RAWDatabase, RAWDatabase, RAWDatabase]):
|
|
|
89
97
|
return self._list(limit=limit)
|
|
90
98
|
|
|
91
99
|
|
|
92
|
-
class RawTablesAPI(CDFResourceAPI[
|
|
100
|
+
class RawTablesAPI(CDFResourceAPI[RawTableId, RAWTableRequest, RAWTableResponse]):
|
|
93
101
|
"""API for managing RAW tables in CDF.
|
|
94
102
|
|
|
95
103
|
This API provides methods to create, list, and delete RAW tables within a database.
|
|
@@ -109,15 +117,17 @@ class RawTablesAPI(CDFResourceAPI[RAWTable, RAWTable, RAWTable]):
|
|
|
109
117
|
},
|
|
110
118
|
)
|
|
111
119
|
|
|
112
|
-
def _validate_page_response(
|
|
120
|
+
def _validate_page_response(
|
|
121
|
+
self, response: SuccessResponse | ItemsSuccessResponse
|
|
122
|
+
) -> PagedResponse[RAWTableResponse]:
|
|
113
123
|
"""Parse a page response. Note: db_name must be injected separately."""
|
|
114
|
-
return PagedResponse[
|
|
124
|
+
return PagedResponse[RAWTableResponse].model_validate_json(response.body)
|
|
115
125
|
|
|
116
|
-
def _reference_response(self, response: SuccessResponse) -> ResponseItems[
|
|
126
|
+
def _reference_response(self, response: SuccessResponse) -> ResponseItems[RAWTableResponse]:
|
|
117
127
|
"""Parse a reference response. Note: db_name must be injected separately."""
|
|
118
|
-
return ResponseItems[
|
|
128
|
+
return ResponseItems[RAWTableResponse].model_validate_json(response.body)
|
|
119
129
|
|
|
120
|
-
def create(self, items: Sequence[
|
|
130
|
+
def create(self, items: Sequence[RAWTableRequest], ensure_parent: bool = False) -> list[RAWTableResponse]:
|
|
121
131
|
"""Create tables in a database in CDF.
|
|
122
132
|
|
|
123
133
|
Args:
|
|
@@ -127,7 +137,7 @@ class RawTablesAPI(CDFResourceAPI[RAWTable, RAWTable, RAWTable]):
|
|
|
127
137
|
Returns:
|
|
128
138
|
List of created RAWTable objects.
|
|
129
139
|
"""
|
|
130
|
-
result: list[
|
|
140
|
+
result: list[RAWTableResponse] = []
|
|
131
141
|
for (db_name,), group in self._group_items_by_text_field(items, "db_name").items():
|
|
132
142
|
if not db_name:
|
|
133
143
|
raise ValueError("db_name must be set on all RAWTable items for creation.")
|
|
@@ -136,10 +146,11 @@ class RawTablesAPI(CDFResourceAPI[RAWTable, RAWTable, RAWTable]):
|
|
|
136
146
|
group, "create", params={"ensureParent": ensure_parent}, endpoint=endpoint
|
|
137
147
|
)
|
|
138
148
|
for table in created:
|
|
139
|
-
|
|
149
|
+
table.db_name = db_name
|
|
150
|
+
result.append(table)
|
|
140
151
|
return result
|
|
141
152
|
|
|
142
|
-
def delete(self, items: Sequence[
|
|
153
|
+
def delete(self, items: Sequence[RawTableId]) -> None:
|
|
143
154
|
"""Delete tables from a database in CDF.
|
|
144
155
|
|
|
145
156
|
Args:
|
|
@@ -156,7 +167,7 @@ class RawTablesAPI(CDFResourceAPI[RAWTable, RAWTable, RAWTable]):
|
|
|
156
167
|
db_name: str,
|
|
157
168
|
limit: int = 100,
|
|
158
169
|
cursor: str | None = None,
|
|
159
|
-
) -> PagedResponse[
|
|
170
|
+
) -> PagedResponse[RAWTableResponse]:
|
|
160
171
|
"""Iterate over all tables in a database in CDF.
|
|
161
172
|
|
|
162
173
|
Args:
|
|
@@ -167,13 +178,16 @@ class RawTablesAPI(CDFResourceAPI[RAWTable, RAWTable, RAWTable]):
|
|
|
167
178
|
Returns:
|
|
168
179
|
PagedResponse of RAWTable objects.
|
|
169
180
|
"""
|
|
170
|
-
|
|
181
|
+
page = self._paginate(cursor=cursor, limit=limit, endpoint_path=f"/raw/dbs/{db_name}/tables")
|
|
182
|
+
for table in page.items:
|
|
183
|
+
table.db_name = db_name
|
|
184
|
+
return page
|
|
171
185
|
|
|
172
186
|
def iterate(
|
|
173
187
|
self,
|
|
174
188
|
db_name: str,
|
|
175
189
|
limit: int = 100,
|
|
176
|
-
) -> Iterable[list[
|
|
190
|
+
) -> Iterable[list[RAWTableResponse]]:
|
|
177
191
|
"""Iterate over all tables in a database in CDF.
|
|
178
192
|
|
|
179
193
|
Args:
|
|
@@ -183,9 +197,12 @@ class RawTablesAPI(CDFResourceAPI[RAWTable, RAWTable, RAWTable]):
|
|
|
183
197
|
Returns:
|
|
184
198
|
Iterable of lists of RAWTable objects.
|
|
185
199
|
"""
|
|
186
|
-
|
|
200
|
+
for table in self._iterate(limit=limit, endpoint_path=f"/raw/dbs/{db_name}/tables"):
|
|
201
|
+
for t in table:
|
|
202
|
+
t.db_name = db_name
|
|
203
|
+
yield table
|
|
187
204
|
|
|
188
|
-
def list(self, db_name: str, limit: int | None = None) -> list[
|
|
205
|
+
def list(self, db_name: str, limit: int | None = None) -> list[RAWTableResponse]:
|
|
189
206
|
"""List all tables in a database in CDF.
|
|
190
207
|
|
|
191
208
|
Args:
|
|
@@ -195,7 +212,10 @@ class RawTablesAPI(CDFResourceAPI[RAWTable, RAWTable, RAWTable]):
|
|
|
195
212
|
Returns:
|
|
196
213
|
List of RAWTable objects.
|
|
197
214
|
"""
|
|
198
|
-
|
|
215
|
+
listed = self._list(limit, endpoint_path=f"/raw/dbs/{db_name}/tables")
|
|
216
|
+
for table in listed:
|
|
217
|
+
table.db_name = db_name
|
|
218
|
+
return listed
|
|
199
219
|
|
|
200
220
|
|
|
201
221
|
class RawAPI:
|
|
@@ -53,7 +53,7 @@ class CapabilitiesAPI(CDFResourceAPI[ExternalId, RobotCapabilityRequest, RobotCa
|
|
|
53
53
|
"""
|
|
54
54
|
return self._request_item_response(items, "create")
|
|
55
55
|
|
|
56
|
-
def retrieve(self, items: Sequence[ExternalId]) -> list[RobotCapabilityResponse]:
|
|
56
|
+
def retrieve(self, items: Sequence[ExternalId], ignore_unknown_ids: bool = False) -> list[RobotCapabilityResponse]:
|
|
57
57
|
"""Retrieve capabilities from CDF.
|
|
58
58
|
|
|
59
59
|
Args:
|
|
@@ -61,6 +61,8 @@ class CapabilitiesAPI(CDFResourceAPI[ExternalId, RobotCapabilityRequest, RobotCa
|
|
|
61
61
|
Returns:
|
|
62
62
|
List of retrieved RobotCapabilityResponse objects.
|
|
63
63
|
"""
|
|
64
|
+
if ignore_unknown_ids:
|
|
65
|
+
return self._request_item_split_retries(items, method="retrieve")
|
|
64
66
|
return self._request_item_response(items, method="retrieve")
|
|
65
67
|
|
|
66
68
|
def update(
|
|
@@ -77,13 +79,17 @@ class CapabilitiesAPI(CDFResourceAPI[ExternalId, RobotCapabilityRequest, RobotCa
|
|
|
77
79
|
"""
|
|
78
80
|
return self._update(items, mode=mode)
|
|
79
81
|
|
|
80
|
-
def delete(self, items: Sequence[ExternalId]) -> None:
|
|
82
|
+
def delete(self, items: Sequence[ExternalId], ignore_unknown_ids: bool = False) -> None:
|
|
81
83
|
"""Delete capabilities from CDF.
|
|
82
84
|
|
|
83
85
|
Args:
|
|
84
86
|
items: List of ExternalId objects to delete.
|
|
87
|
+
ignore_unknown_ids: If True, ignores unknown IDs during deletion.
|
|
85
88
|
"""
|
|
86
|
-
|
|
89
|
+
if ignore_unknown_ids:
|
|
90
|
+
self._request_item_split_retries_no_response(items, "delete")
|
|
91
|
+
else:
|
|
92
|
+
self._request_no_response(items, "delete")
|
|
87
93
|
|
|
88
94
|
def paginate(
|
|
89
95
|
self,
|
|
@@ -64,14 +64,19 @@ class DataPostProcessingAPI(
|
|
|
64
64
|
"""
|
|
65
65
|
return self._request_item_response(items, "create")
|
|
66
66
|
|
|
67
|
-
def retrieve(
|
|
67
|
+
def retrieve(
|
|
68
|
+
self, items: Sequence[ExternalId], ignore_unknown_ids: bool = False
|
|
69
|
+
) -> list[RobotDataPostProcessingResponse]:
|
|
68
70
|
"""Retrieve data post-processing configurations from CDF.
|
|
69
71
|
|
|
70
72
|
Args:
|
|
71
73
|
items: List of ExternalId objects to retrieve.
|
|
74
|
+
ignore_unknown_ids: If True, ignores unknown IDs during retrieval.
|
|
72
75
|
Returns:
|
|
73
76
|
List of retrieved RobotDataPostProcessingResponse objects.
|
|
74
77
|
"""
|
|
78
|
+
if ignore_unknown_ids:
|
|
79
|
+
return self._request_item_split_retries(items, method="retrieve")
|
|
75
80
|
return self._request_item_response(items, method="retrieve")
|
|
76
81
|
|
|
77
82
|
def update(
|
|
@@ -88,13 +93,17 @@ class DataPostProcessingAPI(
|
|
|
88
93
|
"""
|
|
89
94
|
return self._update(items, mode=mode)
|
|
90
95
|
|
|
91
|
-
def delete(self, items: Sequence[ExternalId]) -> None:
|
|
96
|
+
def delete(self, items: Sequence[ExternalId], ignore_unknown_ids: bool = False) -> None:
|
|
92
97
|
"""Delete data post-processing configurations from CDF.
|
|
93
98
|
|
|
94
99
|
Args:
|
|
95
100
|
items: List of ExternalId objects to delete.
|
|
101
|
+
ignore_unknown_ids: If True, ignores unknown IDs during deletion.
|
|
96
102
|
"""
|
|
97
|
-
|
|
103
|
+
if ignore_unknown_ids:
|
|
104
|
+
self._request_item_split_retries_no_response(items, "delete")
|
|
105
|
+
else:
|
|
106
|
+
self._request_no_response(items, "delete")
|
|
98
107
|
|
|
99
108
|
def paginate(
|
|
100
109
|
self,
|
|
@@ -48,14 +48,17 @@ class FramesAPI(CDFResourceAPI[ExternalId, RobotFrameRequest, RobotFrameResponse
|
|
|
48
48
|
"""
|
|
49
49
|
return self._request_item_response(items, "create")
|
|
50
50
|
|
|
51
|
-
def retrieve(self, items: Sequence[ExternalId]) -> list[RobotFrameResponse]:
|
|
51
|
+
def retrieve(self, items: Sequence[ExternalId], ignore_unknown_ids: bool = False) -> list[RobotFrameResponse]:
|
|
52
52
|
"""Retrieve frames from CDF.
|
|
53
53
|
|
|
54
54
|
Args:
|
|
55
55
|
items: List of ExternalId objects to retrieve.
|
|
56
|
+
ignore_unknown_ids: If True, ignores unknown IDs during retrieval.
|
|
56
57
|
Returns:
|
|
57
58
|
List of retrieved RobotFrameResponse objects.
|
|
58
59
|
"""
|
|
60
|
+
if ignore_unknown_ids:
|
|
61
|
+
return self._request_item_split_retries(items, method="retrieve")
|
|
59
62
|
return self._request_item_response(items, method="retrieve")
|
|
60
63
|
|
|
61
64
|
def update(
|
|
@@ -72,13 +75,17 @@ class FramesAPI(CDFResourceAPI[ExternalId, RobotFrameRequest, RobotFrameResponse
|
|
|
72
75
|
"""
|
|
73
76
|
return self._update(items, mode=mode)
|
|
74
77
|
|
|
75
|
-
def delete(self, items: Sequence[ExternalId]) -> None:
|
|
78
|
+
def delete(self, items: Sequence[ExternalId], ignore_unknown_ids: bool = False) -> None:
|
|
76
79
|
"""Delete frames from CDF.
|
|
77
80
|
|
|
78
81
|
Args:
|
|
79
82
|
items: List of ExternalId objects to delete.
|
|
83
|
+
ignore_unknown_ids: If True, ignores unknown IDs during deletion.
|
|
80
84
|
"""
|
|
81
|
-
|
|
85
|
+
if ignore_unknown_ids:
|
|
86
|
+
self._request_item_split_retries_no_response(items, "delete")
|
|
87
|
+
else:
|
|
88
|
+
self._request_no_response(items, "delete")
|
|
82
89
|
|
|
83
90
|
def paginate(
|
|
84
91
|
self,
|
|
@@ -53,14 +53,17 @@ class LocationsAPI(CDFResourceAPI[ExternalId, RobotLocationRequest, RobotLocatio
|
|
|
53
53
|
"""
|
|
54
54
|
return self._request_item_response(items, "create")
|
|
55
55
|
|
|
56
|
-
def retrieve(self, items: Sequence[ExternalId]) -> list[RobotLocationResponse]:
|
|
56
|
+
def retrieve(self, items: Sequence[ExternalId], ignore_unknown_ids: bool = False) -> list[RobotLocationResponse]:
|
|
57
57
|
"""Retrieve locations from CDF.
|
|
58
58
|
|
|
59
59
|
Args:
|
|
60
60
|
items: List of ExternalId objects to retrieve.
|
|
61
|
+
ignore_unknown_ids: If True, ignores unknown IDs during retrieval.
|
|
61
62
|
Returns:
|
|
62
63
|
List of retrieved RobotLocationResponse objects.
|
|
63
64
|
"""
|
|
65
|
+
if ignore_unknown_ids:
|
|
66
|
+
return self._request_item_split_retries(items, method="retrieve")
|
|
64
67
|
return self._request_item_response(items, method="retrieve")
|
|
65
68
|
|
|
66
69
|
def update(
|
|
@@ -77,13 +80,17 @@ class LocationsAPI(CDFResourceAPI[ExternalId, RobotLocationRequest, RobotLocatio
|
|
|
77
80
|
"""
|
|
78
81
|
return self._update(items, mode=mode)
|
|
79
82
|
|
|
80
|
-
def delete(self, items: Sequence[ExternalId]) -> None:
|
|
83
|
+
def delete(self, items: Sequence[ExternalId], ignore_unknown_ids: bool = False) -> None:
|
|
81
84
|
"""Delete locations from CDF.
|
|
82
85
|
|
|
83
86
|
Args:
|
|
84
87
|
items: List of ExternalId objects to delete.
|
|
88
|
+
ignore_unknown_ids: If True, ignores unknown IDs during deletion.
|
|
85
89
|
"""
|
|
86
|
-
|
|
90
|
+
if ignore_unknown_ids:
|
|
91
|
+
self._request_item_split_retries_no_response(items, "delete")
|
|
92
|
+
else:
|
|
93
|
+
self._request_no_response(items, "delete")
|
|
87
94
|
|
|
88
95
|
def paginate(
|
|
89
96
|
self,
|
|
@@ -48,14 +48,17 @@ class MapsAPI(CDFResourceAPI[ExternalId, RobotMapRequest, RobotMapResponse]):
|
|
|
48
48
|
"""
|
|
49
49
|
return self._request_item_response(items, "create")
|
|
50
50
|
|
|
51
|
-
def retrieve(self, items: Sequence[ExternalId]) -> list[RobotMapResponse]:
|
|
51
|
+
def retrieve(self, items: Sequence[ExternalId], ignore_unknown_ids: bool = False) -> list[RobotMapResponse]:
|
|
52
52
|
"""Retrieve maps from CDF.
|
|
53
53
|
|
|
54
54
|
Args:
|
|
55
55
|
items: List of ExternalId objects to retrieve.
|
|
56
|
+
ignore_unknown_ids: If True, ignores unknown IDs during retrieval.
|
|
56
57
|
Returns:
|
|
57
58
|
List of retrieved RobotMapResponse objects.
|
|
58
59
|
"""
|
|
60
|
+
if ignore_unknown_ids:
|
|
61
|
+
return self._request_item_split_retries(items, method="retrieve")
|
|
59
62
|
return self._request_item_response(items, method="retrieve")
|
|
60
63
|
|
|
61
64
|
def update(
|
|
@@ -72,13 +75,17 @@ class MapsAPI(CDFResourceAPI[ExternalId, RobotMapRequest, RobotMapResponse]):
|
|
|
72
75
|
"""
|
|
73
76
|
return self._update(items, mode=mode)
|
|
74
77
|
|
|
75
|
-
def delete(self, items: Sequence[ExternalId]) -> None:
|
|
78
|
+
def delete(self, items: Sequence[ExternalId], ignore_unknown_ids: bool = False) -> None:
|
|
76
79
|
"""Delete maps from CDF.
|
|
77
80
|
|
|
78
81
|
Args:
|
|
79
82
|
items: List of ExternalId objects to delete.
|
|
83
|
+
ignore_unknown_ids: If True, ignores unknown IDs during deletion.
|
|
80
84
|
"""
|
|
81
|
-
|
|
85
|
+
if ignore_unknown_ids:
|
|
86
|
+
self._request_item_split_retries_no_response(items, "delete")
|
|
87
|
+
else:
|
|
88
|
+
self._request_no_response(items, "delete")
|
|
82
89
|
|
|
83
90
|
def paginate(
|
|
84
91
|
self,
|
|
@@ -46,14 +46,17 @@ class RobotsAPI(CDFResourceAPI[DataSetId, RobotRequest, RobotResponse]):
|
|
|
46
46
|
"""
|
|
47
47
|
return self._request_item_response(items, "create")
|
|
48
48
|
|
|
49
|
-
def retrieve(self, items: Sequence[DataSetId]) -> list[RobotResponse]:
|
|
49
|
+
def retrieve(self, items: Sequence[DataSetId], ignore_unknown_ids: bool = False) -> list[RobotResponse]:
|
|
50
50
|
"""Retrieve robots from CDF.
|
|
51
51
|
|
|
52
52
|
Args:
|
|
53
53
|
items: List of DataSetId objects to retrieve.
|
|
54
|
+
ignore_unknown_ids: If True, ignores unknown IDs during retrieval.
|
|
54
55
|
Returns:
|
|
55
56
|
List of retrieved RobotResponse objects.
|
|
56
57
|
"""
|
|
58
|
+
if ignore_unknown_ids:
|
|
59
|
+
return self._request_item_split_retries(items, method="retrieve")
|
|
57
60
|
return self._request_item_response(items, method="retrieve")
|
|
58
61
|
|
|
59
62
|
def update(
|
|
@@ -70,13 +73,17 @@ class RobotsAPI(CDFResourceAPI[DataSetId, RobotRequest, RobotResponse]):
|
|
|
70
73
|
"""
|
|
71
74
|
return self._update(items, mode=mode)
|
|
72
75
|
|
|
73
|
-
def delete(self, items: Sequence[DataSetId]) -> None:
|
|
76
|
+
def delete(self, items: Sequence[DataSetId], ignore_unknown_ids: bool = False) -> None:
|
|
74
77
|
"""Delete robots from CDF.
|
|
75
78
|
|
|
76
79
|
Args:
|
|
77
80
|
items: List of DataSetId objects to delete.
|
|
81
|
+
ignore_unknown_ids: If True, ignores unknown IDs during deletion.
|
|
78
82
|
"""
|
|
79
|
-
|
|
83
|
+
if ignore_unknown_ids:
|
|
84
|
+
self._request_item_split_retries_no_response(items, "delete")
|
|
85
|
+
else:
|
|
86
|
+
self._request_no_response(items, "delete")
|
|
80
87
|
|
|
81
88
|
def paginate(
|
|
82
89
|
self,
|
|
@@ -65,7 +65,7 @@ class HTTPClient:
|
|
|
65
65
|
pool_connections: int = 10,
|
|
66
66
|
pool_maxsize: int = 20,
|
|
67
67
|
retry_status_codes: Set[int] = frozenset({408, 429, 502, 503, 504}),
|
|
68
|
-
split_items_status_codes: Set[int] = frozenset({400, 408, 409, 422, 502, 503, 504}),
|
|
68
|
+
split_items_status_codes: Set[int] = frozenset({400, 404, 408, 409, 422, 502, 503, 504}),
|
|
69
69
|
console: Console | None = None,
|
|
70
70
|
):
|
|
71
71
|
self.config = config
|
|
@@ -23,6 +23,7 @@ class HTTPResult(BaseModel):
|
|
|
23
23
|
f"Request failed with status code {self.status_code}: {self.error.message}",
|
|
24
24
|
missing=self.error.missing, # type: ignore[arg-type]
|
|
25
25
|
duplicated=self.error.duplicated, # type: ignore[arg-type]
|
|
26
|
+
code=self.error.code,
|
|
26
27
|
)
|
|
27
28
|
elif isinstance(self, FailedRequest):
|
|
28
29
|
raise ToolkitAPIError(f"Request failed with error: {self.error}")
|
|
@@ -5,9 +5,14 @@ class ToolkitAPIError(Exception):
|
|
|
5
5
|
"""Base class for all exceptions raised by the Cognite Toolkit API client."""
|
|
6
6
|
|
|
7
7
|
def __init__(
|
|
8
|
-
self,
|
|
8
|
+
self,
|
|
9
|
+
message: str,
|
|
10
|
+
missing: list[dict[str, Any]] | None = None,
|
|
11
|
+
duplicated: list[dict[str, Any]] | None = None,
|
|
12
|
+
code: int | None = None,
|
|
9
13
|
) -> None:
|
|
10
14
|
super().__init__(message)
|
|
11
15
|
self.message = message
|
|
12
16
|
self.missing = missing
|
|
13
17
|
self.duplicated = duplicated
|
|
18
|
+
self.code = code
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from collections.abc import Sequence
|
|
2
2
|
from typing import Annotated, Any, Literal
|
|
3
3
|
|
|
4
|
-
from pydantic import Field, model_serializer, model_validator
|
|
4
|
+
from pydantic import AliasChoices, Field, model_serializer, model_validator
|
|
5
5
|
|
|
6
6
|
from cognite_toolkit._cdf_tk.client._resource_base import Identifier
|
|
7
7
|
|
|
@@ -65,6 +65,31 @@ class NameId(Identifier):
|
|
|
65
65
|
return f"name='{self.name}'"
|
|
66
66
|
|
|
67
67
|
|
|
68
|
+
class RawDatabaseId(Identifier):
|
|
69
|
+
name: str = Field(alias="name", validation_alias=AliasChoices("dbName", "name"))
|
|
70
|
+
|
|
71
|
+
def __str__(self) -> str:
|
|
72
|
+
return f"name='{self.name}'"
|
|
73
|
+
|
|
74
|
+
def dump(self, camel_case: bool = True, exclude_extra: bool = False) -> dict[str, Any]:
|
|
75
|
+
"""Dump the resource to a dictionary.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
camel_case (bool): Will be ignored. Included for compatibility.
|
|
79
|
+
exclude_extra (bool): Will be ignored. Included for compatibility.
|
|
80
|
+
|
|
81
|
+
"""
|
|
82
|
+
return self.model_dump(mode="json", by_alias=False)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class RawTableId(Identifier):
|
|
86
|
+
name: str
|
|
87
|
+
db_name: str
|
|
88
|
+
|
|
89
|
+
def __str__(self) -> str:
|
|
90
|
+
return f"dbName='{self.db_name}', name='{self.name}'"
|
|
91
|
+
|
|
92
|
+
|
|
68
93
|
class WorkflowVersionId(Identifier):
|
|
69
94
|
workflow_external_id: str
|
|
70
95
|
version: str
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import sys
|
|
2
|
+
from typing import Any
|
|
2
3
|
|
|
3
4
|
from pydantic import Field
|
|
4
5
|
|
|
5
6
|
from cognite_toolkit._cdf_tk.client._resource_base import (
|
|
6
|
-
Identifier,
|
|
7
7
|
RequestResource,
|
|
8
8
|
ResponseResource,
|
|
9
9
|
)
|
|
10
|
+
from cognite_toolkit._cdf_tk.client.resource_classes.identifiers import RawDatabaseId, RawTableId
|
|
10
11
|
|
|
11
12
|
if sys.version_info >= (3, 11):
|
|
12
13
|
from typing import Self
|
|
@@ -14,31 +15,84 @@ else:
|
|
|
14
15
|
from typing_extensions import Self
|
|
15
16
|
|
|
16
17
|
|
|
17
|
-
class
|
|
18
|
+
class RAWDatabaseRequest(RequestResource):
|
|
19
|
+
name: str = Field(alias="dbName")
|
|
20
|
+
|
|
21
|
+
def as_id(self) -> RawDatabaseId:
|
|
22
|
+
return RawDatabaseId(name=self.name)
|
|
23
|
+
|
|
24
|
+
# Override dump to always use by_alias=False since the API expects name='...'
|
|
25
|
+
def dump(self, camel_case: bool = True, exclude_extra: bool = False) -> dict[str, Any]:
|
|
26
|
+
"""Dump the resource to a dictionary.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
camel_case (bool): Whether to use camelCase for the keys. Default is True.
|
|
30
|
+
exclude_extra (bool): Whether to exclude extra fields not defined in the model. Default is False.
|
|
31
|
+
|
|
32
|
+
"""
|
|
33
|
+
if exclude_extra:
|
|
34
|
+
return self.model_dump(
|
|
35
|
+
mode="json",
|
|
36
|
+
by_alias=False,
|
|
37
|
+
exclude_unset=True,
|
|
38
|
+
exclude=set(self.__pydantic_extra__) if self.__pydantic_extra__ else None,
|
|
39
|
+
)
|
|
40
|
+
return self.model_dump(mode="json", by_alias=False, exclude_unset=True)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class RAWDatabaseResponse(ResponseResource[RAWDatabaseRequest]):
|
|
18
44
|
name: str
|
|
45
|
+
created_time: int
|
|
46
|
+
|
|
47
|
+
def as_request_resource(self) -> RAWDatabaseRequest:
|
|
48
|
+
return RAWDatabaseRequest.model_validate(self.dump(), extra="ignore")
|
|
19
49
|
|
|
20
|
-
def as_id(self) ->
|
|
21
|
-
return self
|
|
50
|
+
def as_id(self) -> RawDatabaseId:
|
|
51
|
+
return RawDatabaseId(name=self.name)
|
|
22
52
|
|
|
23
|
-
def __str__(self) -> str:
|
|
24
|
-
return f"name='{self.name}'"
|
|
25
53
|
|
|
26
|
-
|
|
27
|
-
|
|
54
|
+
class RAWTableRequest(RequestResource):
|
|
55
|
+
# This is a query parameter, so we exclude it from serialization.
|
|
56
|
+
db_name: str = Field(exclude=True)
|
|
57
|
+
name: str = Field(alias="tableName")
|
|
58
|
+
|
|
59
|
+
def as_id(self) -> RawTableId:
|
|
60
|
+
return RawTableId(db_name=self.db_name, name=self.name)
|
|
61
|
+
|
|
62
|
+
# Override dump to always use by_alias=False since the API expects name='...'
|
|
63
|
+
def dump(self, camel_case: bool = True, exclude_extra: bool = False) -> dict[str, Any]:
|
|
64
|
+
"""Dump the resource to a dictionary.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
camel_case (bool): Whether to use camelCase for the keys. Default is True.
|
|
68
|
+
exclude_extra (bool): Whether to exclude extra fields not defined in the model. Default is False.
|
|
28
69
|
|
|
70
|
+
"""
|
|
71
|
+
if exclude_extra:
|
|
72
|
+
return self.model_dump(
|
|
73
|
+
mode="json",
|
|
74
|
+
by_alias=False,
|
|
75
|
+
exclude_unset=True,
|
|
76
|
+
exclude=set(self.__pydantic_extra__) if self.__pydantic_extra__ else None,
|
|
77
|
+
)
|
|
78
|
+
return self.model_dump(mode="json", by_alias=False, exclude_unset=True)
|
|
29
79
|
|
|
30
|
-
|
|
80
|
+
|
|
81
|
+
class RAWTableResponse(ResponseResource[RAWTableRequest]):
|
|
31
82
|
# This is a query parameter, so we exclude it from serialization.
|
|
32
83
|
# Default to empty string to allow parsing from API responses (which don't include db_name).
|
|
33
84
|
db_name: str = Field(default="", exclude=True)
|
|
34
85
|
name: str
|
|
86
|
+
created_time: int
|
|
35
87
|
|
|
36
|
-
def
|
|
37
|
-
|
|
88
|
+
def as_request_resource(self) -> RAWTableRequest:
|
|
89
|
+
dumped = {**self.dump(), "dbName": self.db_name}
|
|
90
|
+
return RAWTableRequest.model_validate(dumped, extra="ignore")
|
|
38
91
|
|
|
39
|
-
|
|
40
|
-
|
|
92
|
+
@classmethod
|
|
93
|
+
def _load(cls, resource: dict[str, Any]) -> Self:
|
|
94
|
+
"""Load method to match CogniteResource signature."""
|
|
95
|
+
return cls.model_validate(resource, by_name=True)
|
|
41
96
|
|
|
42
|
-
def
|
|
43
|
-
|
|
44
|
-
return type(self).model_validate(dumped, extra="ignore")
|
|
97
|
+
def as_id(self) -> RawTableId:
|
|
98
|
+
return RawTableId(db_name=self.db_name, name=self.name)
|