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
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"""Views API for managing CDF data modeling views.
|
|
2
|
+
|
|
3
|
+
Based on the API specification at:
|
|
4
|
+
https://api-docs.cognite.com/20230101/tag/Views/operation/ApplyViews
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from collections.abc import Iterable, Sequence
|
|
8
|
+
|
|
9
|
+
from cognite_toolkit._cdf_tk.client.cdf_client import CDFResourceAPI, Endpoint, PagedResponse
|
|
10
|
+
from cognite_toolkit._cdf_tk.client.http_client import HTTPClient, ItemsSuccessResponse2, SuccessResponse2
|
|
11
|
+
from cognite_toolkit._cdf_tk.client.request_classes.filters import ViewFilter
|
|
12
|
+
from cognite_toolkit._cdf_tk.client.resource_classes.data_modeling import (
|
|
13
|
+
ViewReference,
|
|
14
|
+
ViewRequest,
|
|
15
|
+
ViewResponse,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ViewsAPI(CDFResourceAPI[ViewReference, ViewRequest, ViewResponse]):
|
|
20
|
+
"""API for managing CDF data modeling views.
|
|
21
|
+
|
|
22
|
+
Views use an apply/upsert pattern for create and update operations.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(self, http_client: HTTPClient) -> None:
|
|
26
|
+
super().__init__(
|
|
27
|
+
http_client=http_client,
|
|
28
|
+
method_endpoint_map={
|
|
29
|
+
"upsert": Endpoint(method="POST", path="/models/views", item_limit=100),
|
|
30
|
+
"retrieve": Endpoint(method="POST", path="/models/views/byids", item_limit=100),
|
|
31
|
+
"delete": Endpoint(method="POST", path="/models/views/delete", item_limit=100),
|
|
32
|
+
"list": Endpoint(method="GET", path="/models/views", item_limit=1000),
|
|
33
|
+
},
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
def _validate_page_response(
|
|
37
|
+
self, response: SuccessResponse2 | ItemsSuccessResponse2
|
|
38
|
+
) -> PagedResponse[ViewResponse]:
|
|
39
|
+
return PagedResponse[ViewResponse].model_validate_json(response.body)
|
|
40
|
+
|
|
41
|
+
def create(self, items: Sequence[ViewRequest]) -> list[ViewResponse]:
|
|
42
|
+
"""Apply (create or update) views in CDF.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
items: List of ViewRequest objects to apply.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
List of applied ViewResponse objects.
|
|
49
|
+
"""
|
|
50
|
+
return self._request_item_response(items, "upsert")
|
|
51
|
+
|
|
52
|
+
def update(self, items: Sequence[ViewRequest]) -> list[ViewResponse]:
|
|
53
|
+
"""Apply (create or update) views in CDF.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
items: List of ViewRequest objects to apply.
|
|
57
|
+
Returns:
|
|
58
|
+
List of applied ViewResponse objects.
|
|
59
|
+
"""
|
|
60
|
+
return self._request_item_response(items, "upsert")
|
|
61
|
+
|
|
62
|
+
def retrieve(self, items: Sequence[ViewReference], include_inherited_properties: bool = True) -> list[ViewResponse]:
|
|
63
|
+
"""Retrieve views from CDF.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
items: List of ViewReference objects to retrieve.
|
|
67
|
+
include_inherited_properties: Whether to include inherited properties.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
List of retrieved ViewResponse objects.
|
|
71
|
+
"""
|
|
72
|
+
return self._request_item_response(
|
|
73
|
+
items, method="retrieve", extra_body={"includeInheritedProperties": include_inherited_properties}
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
def delete(self, items: Sequence[ViewReference]) -> None:
|
|
77
|
+
"""Delete views from CDF.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
items: List of ViewReference objects to delete.
|
|
81
|
+
"""
|
|
82
|
+
self._request_no_response(items, "delete")
|
|
83
|
+
|
|
84
|
+
def paginate(
|
|
85
|
+
self,
|
|
86
|
+
filter: ViewFilter | None = None,
|
|
87
|
+
limit: int = 100,
|
|
88
|
+
cursor: str | None = None,
|
|
89
|
+
) -> PagedResponse[ViewResponse]:
|
|
90
|
+
"""Get a page of views from CDF.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
filter: ViewFilter to filter views.
|
|
94
|
+
limit: Maximum number of views to return.
|
|
95
|
+
cursor: Cursor for pagination.
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
PagedResponse of ViewResponse objects.
|
|
99
|
+
"""
|
|
100
|
+
return self._paginate(
|
|
101
|
+
cursor=cursor,
|
|
102
|
+
limit=limit,
|
|
103
|
+
params=filter.dump() if filter else None,
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
def iterate(
|
|
107
|
+
self,
|
|
108
|
+
filter: ViewFilter | None = None,
|
|
109
|
+
limit: int | None = None,
|
|
110
|
+
) -> Iterable[list[ViewResponse]]:
|
|
111
|
+
"""Iterate over all views in CDF.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
filter: ViewFilter to filter views.
|
|
115
|
+
limit: Maximum total number of views to return.
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
Iterable of lists of ViewResponse objects.
|
|
119
|
+
"""
|
|
120
|
+
return self._iterate(
|
|
121
|
+
limit=limit,
|
|
122
|
+
params=filter.dump() if filter else None,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
def list(
|
|
126
|
+
self,
|
|
127
|
+
filter: ViewFilter | None = None,
|
|
128
|
+
limit: int | None = None,
|
|
129
|
+
) -> list[ViewResponse]:
|
|
130
|
+
"""List all views in CDF.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
filter: ViewFilter to filter views.
|
|
134
|
+
limit: Maximum total number of views to return.
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
List of ViewResponse objects.
|
|
138
|
+
"""
|
|
139
|
+
return self._list(limit=limit, params=filter.dump() if filter else None)
|
|
@@ -51,15 +51,20 @@ class CDFResourceAPI(Generic[T_Identifier, T_RequestResource, T_ResponseResource
|
|
|
51
51
|
including creating, retrieving, deleting, and listing resources.
|
|
52
52
|
"""
|
|
53
53
|
|
|
54
|
-
def __init__(
|
|
54
|
+
def __init__(
|
|
55
|
+
self, http_client: HTTPClient, method_endpoint_map: dict[APIMethod, Endpoint], disable_gzip: bool = False
|
|
56
|
+
) -> None:
|
|
55
57
|
"""Initialize the resource API.
|
|
56
58
|
|
|
57
59
|
Args:
|
|
58
60
|
http_client: The HTTP client to use for API requests.
|
|
59
61
|
method_endpoint_map: A mapping of endpoint suffixes to their properties.
|
|
62
|
+
disable_gzip: Whether to disable gzip compression for requests. Defaults to False.
|
|
63
|
+
This is only used by the robotics API. If that API is dropped, this parameter can be removed.
|
|
60
64
|
"""
|
|
61
65
|
self._http_client = http_client
|
|
62
66
|
self._method_endpoint_map = method_endpoint_map
|
|
67
|
+
self._disable_gzip = disable_gzip
|
|
63
68
|
|
|
64
69
|
@classmethod
|
|
65
70
|
def _serialize_items(cls, items: Sequence[BaseModel]) -> list[dict[str, JsonValue]]:
|
|
@@ -151,6 +156,7 @@ class CDFResourceAPI(Generic[T_Identifier, T_RequestResource, T_ResponseResource
|
|
|
151
156
|
method=endpoint.method,
|
|
152
157
|
body_content={"items": serialization(chunk), **(extra_body or {})}, # type: ignore[dict-item]
|
|
153
158
|
parameters=request_params,
|
|
159
|
+
disable_gzip=self._disable_gzip,
|
|
154
160
|
)
|
|
155
161
|
response = self._http_client.request_single_retries(request)
|
|
156
162
|
yield response.get_success_or_raise()
|
|
@@ -180,6 +186,27 @@ class CDFResourceAPI(Generic[T_Identifier, T_RequestResource, T_ResponseResource
|
|
|
180
186
|
response_items.extend(self._validate_page_response(response).items)
|
|
181
187
|
return response_items
|
|
182
188
|
|
|
189
|
+
def _request_item_split_retries_no_response(
|
|
190
|
+
self,
|
|
191
|
+
items: Sequence[_T_BaseModel],
|
|
192
|
+
method: APIMethod,
|
|
193
|
+
params: dict[str, Any] | None = None,
|
|
194
|
+
extra_body: dict[str, Any] | None = None,
|
|
195
|
+
) -> None:
|
|
196
|
+
"""Request items with retries, splitting on failures, without returning any response.
|
|
197
|
+
|
|
198
|
+
This method handles large batches of items by chunking them according to the endpoint's item limit.
|
|
199
|
+
If a single item fails, it splits the request into individual item requests to isolate the failure.
|
|
200
|
+
|
|
201
|
+
Args:
|
|
202
|
+
items: Sequence of items to request.
|
|
203
|
+
method: API method to use for the request.
|
|
204
|
+
params: Optional query parameters for the request.
|
|
205
|
+
extra_body: Optional additional body fields for the request.
|
|
206
|
+
"""
|
|
207
|
+
list(self._chunk_requests_items_split_retries(items, method, params, extra_body))
|
|
208
|
+
return None
|
|
209
|
+
|
|
183
210
|
def _chunk_requests_items_split_retries(
|
|
184
211
|
self,
|
|
185
212
|
items: Sequence[_T_BaseModel],
|
|
@@ -215,6 +242,7 @@ class CDFResourceAPI(Generic[T_Identifier, T_RequestResource, T_ResponseResource
|
|
|
215
242
|
parameters=request_params,
|
|
216
243
|
items=chunk,
|
|
217
244
|
extra_body_fields=extra_body,
|
|
245
|
+
disable_gzip=self._disable_gzip,
|
|
218
246
|
)
|
|
219
247
|
responses = self._http_client.request_items_retries(request)
|
|
220
248
|
for response in responses:
|
|
@@ -230,12 +258,12 @@ class CDFResourceAPI(Generic[T_Identifier, T_RequestResource, T_ResponseResource
|
|
|
230
258
|
|
|
231
259
|
@classmethod
|
|
232
260
|
def _group_items_by_text_field(
|
|
233
|
-
cls, items: Sequence[_T_BaseModel],
|
|
234
|
-
) -> dict[str, list[_T_BaseModel]]:
|
|
261
|
+
cls, items: Sequence[_T_BaseModel], *field_names: str
|
|
262
|
+
) -> dict[tuple[str, ...], list[_T_BaseModel]]:
|
|
235
263
|
"""Group items by a text field."""
|
|
236
|
-
grouped_items: dict[str, list[_T_BaseModel]] = defaultdict(list)
|
|
264
|
+
grouped_items: dict[tuple[str, ...], list[_T_BaseModel]] = defaultdict(list)
|
|
237
265
|
for item in items:
|
|
238
|
-
key = str(getattr(item, field_name))
|
|
266
|
+
key = tuple(str(getattr(item, field_name)) for field_name in field_names)
|
|
239
267
|
grouped_items[key].append(item)
|
|
240
268
|
return grouped_items
|
|
241
269
|
|
|
@@ -287,6 +315,7 @@ class CDFResourceAPI(Generic[T_Identifier, T_RequestResource, T_ResponseResource
|
|
|
287
315
|
method=endpoint.method,
|
|
288
316
|
parameters=request_params,
|
|
289
317
|
body_content=body,
|
|
318
|
+
disable_gzip=self._disable_gzip,
|
|
290
319
|
)
|
|
291
320
|
result = self._http_client.request_single_retries(request)
|
|
292
321
|
response = result.get_success_or_raise()
|
|
@@ -316,9 +345,15 @@ class CDFResourceAPI(Generic[T_Identifier, T_RequestResource, T_ResponseResource
|
|
|
316
345
|
next_cursor = page.next_cursor
|
|
317
346
|
|
|
318
347
|
def _list(
|
|
319
|
-
self,
|
|
348
|
+
self,
|
|
349
|
+
limit: int | None = None,
|
|
350
|
+
params: dict[str, Any] | None = None,
|
|
351
|
+
endpoint_path: str | None = None,
|
|
352
|
+
body: dict[str, Any] | None = None,
|
|
320
353
|
) -> list[T_ResponseResource]:
|
|
321
354
|
"""List all resources, handling pagination automatically."""
|
|
322
355
|
return [
|
|
323
|
-
item
|
|
356
|
+
item
|
|
357
|
+
for batch in self._iterate(limit=limit, params=params, endpoint_path=endpoint_path, body=body)
|
|
358
|
+
for item in batch
|
|
324
359
|
]
|
|
@@ -2,6 +2,8 @@ from typing import Generic, TypeVar
|
|
|
2
2
|
|
|
3
3
|
from pydantic import BaseModel, Field, JsonValue
|
|
4
4
|
|
|
5
|
+
from cognite_toolkit._cdf_tk.client.resource_classes.graphql_data_model import GraphQLDataModelResponse
|
|
6
|
+
|
|
5
7
|
T = TypeVar("T", bound=BaseModel)
|
|
6
8
|
|
|
7
9
|
|
|
@@ -25,3 +27,12 @@ class QueryResponse(BaseModel, Generic[T]):
|
|
|
25
27
|
typing: dict[str, JsonValue] | None = None
|
|
26
28
|
next_cursor: dict[str, str] = Field(alias="nextCursor")
|
|
27
29
|
debug: dict[str, JsonValue] | None = None
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class GraphQLResponse(BaseModel):
|
|
33
|
+
data: GraphQLDataModelResponse
|
|
34
|
+
errors: list[dict[str, JsonValue]] | None = None
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class GraphQLUpsertResponse(BaseModel):
|
|
38
|
+
upsert_graph_ql_dml_version: GraphQLResponse = Field(alias="upsertGraphQlDmlVersion")
|
|
@@ -172,6 +172,7 @@ class HTTPClient:
|
|
|
172
172
|
content_type: str = "application/json",
|
|
173
173
|
accept: str = "application/json",
|
|
174
174
|
content_length: int | None = None,
|
|
175
|
+
disable_gzip: bool = False,
|
|
175
176
|
) -> MutableMapping[str, str]:
|
|
176
177
|
headers: MutableMapping[str, str] = {}
|
|
177
178
|
headers["User-Agent"] = f"httpx/{httpx.__version__} {get_user_agent()}"
|
|
@@ -184,7 +185,7 @@ class HTTPClient:
|
|
|
184
185
|
headers["x-cdp-sdk"] = f"CogniteToolkit:{get_current_toolkit_version()}"
|
|
185
186
|
headers["x-cdp-app"] = self.config.client_name
|
|
186
187
|
headers["cdf-version"] = api_version or self.config.api_subversion
|
|
187
|
-
if not global_config.disable_gzip and content_length is None:
|
|
188
|
+
if not global_config.disable_gzip and content_length is None and not disable_gzip:
|
|
188
189
|
headers["Content-Encoding"] = "gzip"
|
|
189
190
|
return headers
|
|
190
191
|
|
|
@@ -332,7 +333,9 @@ class HTTPClient:
|
|
|
332
333
|
raise TypeError(f"Unexpected result type: {type(result)}")
|
|
333
334
|
|
|
334
335
|
def _make_request2(self, message: BaseRequestMessage) -> httpx.Response:
|
|
335
|
-
headers = self._create_headers(
|
|
336
|
+
headers = self._create_headers(
|
|
337
|
+
message.api_version, message.content_type, message.accept, disable_gzip=message.disable_gzip
|
|
338
|
+
)
|
|
336
339
|
return self.session.request(
|
|
337
340
|
method=message.method,
|
|
338
341
|
url=message.endpoint_url,
|
|
@@ -307,6 +307,11 @@ class ItemsRequest(Generic[T_COVARIANT_ID], BodyRequest):
|
|
|
307
307
|
connect_attempt=self.connect_attempt,
|
|
308
308
|
read_attempt=self.read_attempt,
|
|
309
309
|
status_attempt=status_attempts,
|
|
310
|
+
api_version=self.api_version,
|
|
311
|
+
content_type=self.content_type,
|
|
312
|
+
accept=self.accept,
|
|
313
|
+
content_length=self.content_length,
|
|
314
|
+
max_failures_before_abort=self.max_failures_before_abort,
|
|
310
315
|
)
|
|
311
316
|
first_half.tracker = tracker
|
|
312
317
|
second_half = ItemsRequest[T_COVARIANT_ID](
|
|
@@ -317,6 +322,11 @@ class ItemsRequest(Generic[T_COVARIANT_ID], BodyRequest):
|
|
|
317
322
|
connect_attempt=self.connect_attempt,
|
|
318
323
|
read_attempt=self.read_attempt,
|
|
319
324
|
status_attempt=status_attempts,
|
|
325
|
+
api_version=self.api_version,
|
|
326
|
+
content_type=self.content_type,
|
|
327
|
+
accept=self.accept,
|
|
328
|
+
content_length=self.content_length,
|
|
329
|
+
max_failures_before_abort=self.max_failures_before_abort,
|
|
320
330
|
)
|
|
321
331
|
second_half.tracker = tracker
|
|
322
332
|
return [first_half, second_half]
|
|
@@ -77,6 +77,7 @@ class BaseRequestMessage(BaseModel, ABC):
|
|
|
77
77
|
read_attempt: int = 0
|
|
78
78
|
status_attempt: int = 0
|
|
79
79
|
api_version: str | None = None
|
|
80
|
+
disable_gzip: bool = False
|
|
80
81
|
content_type: str = "application/json"
|
|
81
82
|
accept: str = "application/json"
|
|
82
83
|
|
|
@@ -106,13 +107,13 @@ class RequestMessage2(BaseRequestMessage):
|
|
|
106
107
|
data: str | bytes | None = None
|
|
107
108
|
if self.data_content is not None:
|
|
108
109
|
data = self.data_content
|
|
109
|
-
if not global_config.disable_gzip:
|
|
110
|
+
if not global_config.disable_gzip and not self.disable_gzip:
|
|
110
111
|
data = gzip.compress(data)
|
|
111
112
|
elif self.body_content is not None:
|
|
112
113
|
# We serialize using pydantic instead of json.dumps. This is because pydantic is faster
|
|
113
114
|
# and handles more complex types such as datetime, float('nan'), etc.
|
|
114
115
|
data = _BODY_SERIALIZER.dump_json(self.body_content)
|
|
115
|
-
if not global_config.disable_gzip and isinstance(data, bytes):
|
|
116
|
+
if not global_config.disable_gzip and not self.disable_gzip and isinstance(data, bytes):
|
|
116
117
|
data = gzip.compress(data)
|
|
117
118
|
return data
|
|
118
119
|
|
|
@@ -161,7 +162,7 @@ class ItemsRequest2(BaseRequestMessage):
|
|
|
161
162
|
if self.extra_body_fields:
|
|
162
163
|
body.update(self.extra_body_fields)
|
|
163
164
|
res = _BODY_SERIALIZER.dump_json(body)
|
|
164
|
-
if not global_config.disable_gzip and isinstance(res, bytes):
|
|
165
|
+
if not global_config.disable_gzip and not self.disable_gzip and isinstance(res, bytes):
|
|
165
166
|
return gzip.compress(res)
|
|
166
167
|
return res
|
|
167
168
|
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import sys
|
|
2
|
+
from typing import Any, Literal
|
|
2
3
|
|
|
4
|
+
from pydantic import Field
|
|
5
|
+
|
|
6
|
+
from cognite_toolkit._cdf_tk.client.resource_classes.annotation import AnnotationStatus, AnnotationType
|
|
7
|
+
from cognite_toolkit._cdf_tk.client.resource_classes.data_modeling import NodeReference, ViewReference
|
|
3
8
|
from cognite_toolkit._cdf_tk.client.resource_classes.identifiers import ExternalId, InternalId
|
|
4
9
|
|
|
5
10
|
from .base import BaseModelRequest
|
|
@@ -36,3 +41,73 @@ class ClassicFilter(Filter):
|
|
|
36
41
|
return None
|
|
37
42
|
ids = id if isinstance(id, list) else [id]
|
|
38
43
|
return [ExternalId(external_id=item) if isinstance(item, str) else InternalId(id=item) for item in ids]
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class DataModelingFilter(Filter):
|
|
47
|
+
space: str | None = None
|
|
48
|
+
include_global: bool | None = None
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class ContainerFilter(DataModelingFilter):
|
|
52
|
+
used_for: Literal["node", "edge", "record", "all"] | None
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class ViewFilter(DataModelingFilter):
|
|
56
|
+
include_inherited_properties: bool | None = None
|
|
57
|
+
all_versions: bool | None = None
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class DataModelFilter(DataModelingFilter):
|
|
61
|
+
inline_views: bool | None = None
|
|
62
|
+
all_versions: bool | None = None
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class InstanceFilter(Filter):
|
|
66
|
+
instance_type: Literal["node", "edge"] | None = None
|
|
67
|
+
source: ViewReference | None = None
|
|
68
|
+
space: list[str] | None = None
|
|
69
|
+
|
|
70
|
+
def dump(self, camel_case: bool = True) -> dict[str, Any]:
|
|
71
|
+
body: dict[str, Any] = {}
|
|
72
|
+
if self.instance_type is not None:
|
|
73
|
+
body["instanceType"] = self.instance_type
|
|
74
|
+
if self.source is not None:
|
|
75
|
+
body["sources"] = [{"source": self.source.dump()}]
|
|
76
|
+
if self.space is not None:
|
|
77
|
+
instance_type = self.instance_type or "node"
|
|
78
|
+
body["filter"] = {
|
|
79
|
+
"in": {
|
|
80
|
+
"property": [instance_type, "space"],
|
|
81
|
+
"values": self.space,
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return body
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class AnnotationFilter(Filter):
|
|
88
|
+
annotated_resource_type: Literal["file", "threedmodel"]
|
|
89
|
+
annotated_resource_ids: list[ExternalId | InternalId]
|
|
90
|
+
annotation_type: AnnotationType | None = None
|
|
91
|
+
created_app: str | None = None
|
|
92
|
+
creating_app_version: str | None = None
|
|
93
|
+
creating_user: str | None = None
|
|
94
|
+
status: AnnotationStatus | None = None
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class ThreeDAssetMappingFilter(Filter): ...
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class ThreeDAssetMappingAssetIdFilter(ThreeDAssetMappingFilter):
|
|
101
|
+
asset_ids: list[int] = Field(max_length=100)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class ThreeDAssetMappingAssetInstanceIdFilter(ThreeDAssetMappingFilter):
|
|
105
|
+
asset_instance_ids: list[NodeReference] = Field(max_length=100)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class ThreeDAssetMapping3DNodeFilter(ThreeDAssetMappingFilter):
|
|
109
|
+
node_ids: list[int] = Field(max_length=100)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class ThreeDAssetMappingTreeIndexFilter(ThreeDAssetMappingFilter):
|
|
113
|
+
tree_indexes: list[int] = Field(max_length=100)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
UPSERT_BODY = """
|
|
2
|
+
mutation UpsertGraphQlDmlVersion($dmCreate: GraphQlDmlVersionUpsert!) {
|
|
3
|
+
upsertGraphQlDmlVersion(graphQlDmlVersion: $dmCreate) {
|
|
4
|
+
errors {
|
|
5
|
+
kind
|
|
6
|
+
message
|
|
7
|
+
hint
|
|
8
|
+
location {
|
|
9
|
+
start {
|
|
10
|
+
line
|
|
11
|
+
column
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
result {
|
|
16
|
+
space
|
|
17
|
+
externalId
|
|
18
|
+
version
|
|
19
|
+
name
|
|
20
|
+
description
|
|
21
|
+
graphQlDml
|
|
22
|
+
isGlobal
|
|
23
|
+
createdTime
|
|
24
|
+
lastUpdatedTime
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
"""
|
|
@@ -3,7 +3,6 @@ from typing import Annotated, Any, Literal
|
|
|
3
3
|
from pydantic import BeforeValidator, Field
|
|
4
4
|
|
|
5
5
|
from cognite_toolkit._cdf_tk.client.resource_classes.base import BaseModelObject, RequestResource, ResponseResource
|
|
6
|
-
from tests.test_unit.test_cdf_tk.test_tk_warnings.test_warnings_metatest import get_all_subclasses
|
|
7
6
|
|
|
8
7
|
from .identifiers import ExternalId
|
|
9
8
|
|
|
@@ -74,7 +73,14 @@ class UnknownAgentTool(AgentToolDefinition):
|
|
|
74
73
|
...
|
|
75
74
|
|
|
76
75
|
|
|
77
|
-
|
|
76
|
+
# Mapping of known agent tool types to their classes
|
|
77
|
+
KNOWN_TOOLS: dict[str, type[AgentToolDefinition]] = {
|
|
78
|
+
"askDocument": AskDocument,
|
|
79
|
+
"examineDataSemantically": ExamineDataSemantically,
|
|
80
|
+
"queryKnowledgeGraph": QueryKnowledgeGraph,
|
|
81
|
+
"queryTimeSeriesDatapoints": QueryTimeSeriesDatapoints,
|
|
82
|
+
"summarizeDocument": SummarizeDocument,
|
|
83
|
+
}
|
|
78
84
|
|
|
79
85
|
|
|
80
86
|
def _handle_unknown_tool(value: Any) -> Any:
|
|
@@ -0,0 +1,128 @@
|
|
|
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 ThreeDModelIdentifier(BaseModelObject):
|
|
14
|
+
revision_id: int | None = None
|
|
15
|
+
model_id: int | None = None
|
|
16
|
+
name: str | None = None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ThreeDConfiguration(BaseModelObject):
|
|
20
|
+
full_weight_models: list[ThreeDModelIdentifier] | None = None
|
|
21
|
+
light_weight_models: list[ThreeDModelIdentifier] | None = None
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ResourceFilters(BaseModelObject):
|
|
25
|
+
data_set_ids: list[int] | None = None
|
|
26
|
+
asset_subtree_external_ids: list[str] | None = None
|
|
27
|
+
root_asset_external_ids: list[str] | None = None
|
|
28
|
+
external_id_prefix: str | None = None
|
|
29
|
+
spaces: list[str] | None = None
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class RootLocationDataFilters(BaseModelObject):
|
|
33
|
+
general: ResourceFilters | None = None
|
|
34
|
+
assets: ResourceFilters | None = None
|
|
35
|
+
files: ResourceFilters | None = None
|
|
36
|
+
timeseries: ResourceFilters | None = None
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class ObservationFeatureToggles(BaseModelObject):
|
|
40
|
+
is_enabled: bool | None = None
|
|
41
|
+
is_write_back_enabled: bool | None = None
|
|
42
|
+
notifications_endpoint_external_id: str | None = None
|
|
43
|
+
attachments_endpoint_external_id: str | None = None
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class RootLocationFeatureToggles(BaseModelObject):
|
|
47
|
+
three_d: bool | None = None
|
|
48
|
+
trends: bool | None = None
|
|
49
|
+
documents: bool | None = None
|
|
50
|
+
workorders: bool | None = None
|
|
51
|
+
notifications: bool | None = None
|
|
52
|
+
media: bool | None = None
|
|
53
|
+
template_checklist_flow: bool | None = None
|
|
54
|
+
workorder_checklist_flow: bool | None = None
|
|
55
|
+
observations: ObservationFeatureToggles | None = None
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class ObservationConfigFieldProperty(BaseModelObject):
|
|
59
|
+
display_title: str | None = None
|
|
60
|
+
display_description: str | None = None
|
|
61
|
+
is_required: bool | None = None
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class ObservationConfigDropdownPropertyOption(BaseModelObject):
|
|
65
|
+
id: str | None = None
|
|
66
|
+
value: str | None = None
|
|
67
|
+
label: str | None = None
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class ObservationConfigDropdownProperty(ObservationConfigFieldProperty):
|
|
71
|
+
options: list[ObservationConfigDropdownPropertyOption] | None = None
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class ObservationsConfig(BaseModelObject):
|
|
75
|
+
files: ObservationConfigFieldProperty | None = None
|
|
76
|
+
description: ObservationConfigFieldProperty | None = None
|
|
77
|
+
asset: ObservationConfigFieldProperty | None = None
|
|
78
|
+
troubleshooting: ObservationConfigFieldProperty | None = None
|
|
79
|
+
type: ObservationConfigDropdownProperty | None = None
|
|
80
|
+
priority: ObservationConfigDropdownProperty | None = None
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class RootLocationConfiguration(BaseModelObject):
|
|
84
|
+
asset_external_id: str | None = None
|
|
85
|
+
external_id: str | None = None
|
|
86
|
+
display_name: str | None = None
|
|
87
|
+
three_d_configuration: ThreeDConfiguration | None = None
|
|
88
|
+
data_set_id: int | None = None
|
|
89
|
+
template_admins: list[str] | None = None # list of Group Names
|
|
90
|
+
checklist_admins: list[str] | None = None # list of Group Names
|
|
91
|
+
app_data_instance_space: str | None = None
|
|
92
|
+
source_data_instance_space: str | None = None
|
|
93
|
+
data_filters: RootLocationDataFilters | None = None
|
|
94
|
+
feature_toggles: RootLocationFeatureToggles | None = None
|
|
95
|
+
observations: ObservationsConfig | None = None
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class FeatureConfiguration(BaseModelObject):
|
|
99
|
+
root_location_configurations: list[RootLocationConfiguration] | None = None
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class APMConfig(BaseModelObject):
|
|
103
|
+
space: ClassVar[str] = "APM_Config"
|
|
104
|
+
view_ref: ClassVar[ViewReference] = ViewReference(space="APM_Config", external_id="APM_Config", version="1")
|
|
105
|
+
instance_type: Literal["node"] = "node"
|
|
106
|
+
external_id: str
|
|
107
|
+
name: str | None = None
|
|
108
|
+
app_data_space_id: str | None = None
|
|
109
|
+
app_data_space_version: str | None = None
|
|
110
|
+
customer_data_space_id: str | None = None
|
|
111
|
+
customer_data_space_version: str | None = None
|
|
112
|
+
feature_configuration: FeatureConfiguration | None = None
|
|
113
|
+
|
|
114
|
+
def as_id(self) -> ExternalId:
|
|
115
|
+
return ExternalId(external_id=self.external_id)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
class APMConfigRequest(APMConfig, RequestResource):
|
|
119
|
+
existing_version: int | None = None
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class APMConfigResponse(APMConfig, ResponseResource[APMConfigRequest]):
|
|
123
|
+
version: int
|
|
124
|
+
created_time: int
|
|
125
|
+
last_updated_time: int
|
|
126
|
+
|
|
127
|
+
def as_request_resource(self) -> APMConfigRequest:
|
|
128
|
+
return APMConfigRequest.model_validate(self.dump(), extra="ignore")
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import ClassVar, Literal
|
|
3
|
+
|
|
4
|
+
from cognite_toolkit._cdf_tk.client.resource_classes.base import (
|
|
5
|
+
BaseModelObject,
|
|
6
|
+
RequestResource,
|
|
7
|
+
ResponseResource,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
from .data_modeling import ViewReference
|
|
11
|
+
from .instance_api import NodeReference, TypedNodeIdentifier
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class CogniteFile(BaseModelObject):
|
|
15
|
+
view_ref: ClassVar[ViewReference] = ViewReference(space="cdf_cdm", external_id="CogniteFile", version="v1")
|
|
16
|
+
instance_type: Literal["node"] = "node"
|
|
17
|
+
space: str
|
|
18
|
+
external_id: str
|
|
19
|
+
name: str | None = None
|
|
20
|
+
description: str | None = None
|
|
21
|
+
tags: list[str] | None = None
|
|
22
|
+
aliases: list[str] | None = None
|
|
23
|
+
source_id: str | None = None
|
|
24
|
+
source_context: str | None = None
|
|
25
|
+
source: NodeReference | None = None
|
|
26
|
+
source_created_time: datetime | None = None
|
|
27
|
+
source_updated_time: datetime | None = None
|
|
28
|
+
source_created_user: str | None = None
|
|
29
|
+
source_updated_user: str | None = None
|
|
30
|
+
assets: list[NodeReference] | None = None
|
|
31
|
+
mime_type: str | None = None
|
|
32
|
+
directory: str | None = None
|
|
33
|
+
category: NodeReference | None = None
|
|
34
|
+
type: NodeReference | None = None
|
|
35
|
+
|
|
36
|
+
def as_id(self) -> TypedNodeIdentifier:
|
|
37
|
+
return TypedNodeIdentifier(space=self.space, external_id=self.external_id)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class CogniteFileRequest(CogniteFile, RequestResource):
|
|
41
|
+
existing_version: int | None = None
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class CogniteFileResponse(CogniteFile, ResponseResource[CogniteFileRequest]):
|
|
45
|
+
version: int
|
|
46
|
+
created_time: int
|
|
47
|
+
last_updated_time: int
|
|
48
|
+
is_uploaded: bool | None = None
|
|
49
|
+
uploaded_time: datetime | None = None
|
|
50
|
+
deleted_time: int | None = None
|
|
51
|
+
|
|
52
|
+
def as_request_resource(self) -> CogniteFileRequest:
|
|
53
|
+
return CogniteFileRequest.model_validate(self.dump(), extra="ignore")
|