cognite-toolkit 0.7.42__py3-none-any.whl → 0.7.44__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.
Files changed (72) hide show
  1. cognite_toolkit/_cdf_tk/client/_toolkit_client.py +7 -1
  2. cognite_toolkit/_cdf_tk/client/api/events.py +20 -2
  3. cognite_toolkit/_cdf_tk/client/api/filemetadata.py +145 -0
  4. cognite_toolkit/_cdf_tk/client/api/raw.py +174 -0
  5. cognite_toolkit/_cdf_tk/client/api/simulator_models.py +118 -0
  6. cognite_toolkit/_cdf_tk/client/api/simulators.py +8 -0
  7. cognite_toolkit/_cdf_tk/client/api/timeseries.py +20 -2
  8. cognite_toolkit/_cdf_tk/client/cdf_client/__init__.py +2 -1
  9. cognite_toolkit/_cdf_tk/client/cdf_client/api.py +40 -6
  10. cognite_toolkit/_cdf_tk/client/data_classes/agent.py +6 -9
  11. cognite_toolkit/_cdf_tk/client/data_classes/annotation.py +79 -0
  12. cognite_toolkit/_cdf_tk/client/data_classes/asset.py +7 -14
  13. cognite_toolkit/_cdf_tk/client/data_classes/base.py +15 -5
  14. cognite_toolkit/_cdf_tk/client/data_classes/data_modeling/__init__.py +164 -0
  15. cognite_toolkit/_cdf_tk/client/data_classes/data_modeling/_constraints.py +37 -0
  16. cognite_toolkit/_cdf_tk/client/data_classes/data_modeling/_container.py +50 -0
  17. cognite_toolkit/_cdf_tk/client/data_classes/data_modeling/_data_model.py +73 -0
  18. cognite_toolkit/_cdf_tk/client/data_classes/data_modeling/_data_types.py +116 -0
  19. cognite_toolkit/_cdf_tk/client/data_classes/data_modeling/_indexes.py +26 -0
  20. cognite_toolkit/_cdf_tk/client/data_classes/data_modeling/_instance.py +143 -0
  21. cognite_toolkit/_cdf_tk/client/data_classes/data_modeling/_references.py +86 -0
  22. cognite_toolkit/_cdf_tk/client/data_classes/data_modeling/_space.py +26 -0
  23. cognite_toolkit/_cdf_tk/client/data_classes/data_modeling/_view.py +143 -0
  24. cognite_toolkit/_cdf_tk/client/data_classes/data_modeling/_view_property.py +152 -0
  25. cognite_toolkit/_cdf_tk/client/data_classes/dataset.py +35 -0
  26. cognite_toolkit/_cdf_tk/client/data_classes/event.py +12 -15
  27. cognite_toolkit/_cdf_tk/client/data_classes/extraction_pipeline.py +59 -0
  28. cognite_toolkit/_cdf_tk/client/data_classes/filemetadata.py +15 -19
  29. cognite_toolkit/_cdf_tk/client/data_classes/hosted_extractor_destination.py +34 -0
  30. cognite_toolkit/_cdf_tk/client/data_classes/hosted_extractor_job.py +134 -0
  31. cognite_toolkit/_cdf_tk/client/data_classes/hosted_extractor_mapping.py +72 -0
  32. cognite_toolkit/_cdf_tk/client/data_classes/hosted_extractor_source/__init__.py +63 -0
  33. cognite_toolkit/_cdf_tk/client/data_classes/hosted_extractor_source/_auth.py +63 -0
  34. cognite_toolkit/_cdf_tk/client/data_classes/hosted_extractor_source/_base.py +26 -0
  35. cognite_toolkit/_cdf_tk/client/data_classes/hosted_extractor_source/_certificate.py +20 -0
  36. cognite_toolkit/_cdf_tk/client/data_classes/hosted_extractor_source/_eventhub.py +31 -0
  37. cognite_toolkit/_cdf_tk/client/data_classes/hosted_extractor_source/_kafka.py +53 -0
  38. cognite_toolkit/_cdf_tk/client/data_classes/hosted_extractor_source/_mqtt.py +36 -0
  39. cognite_toolkit/_cdf_tk/client/data_classes/hosted_extractor_source/_rest.py +49 -0
  40. cognite_toolkit/_cdf_tk/client/data_classes/identifiers.py +8 -0
  41. cognite_toolkit/_cdf_tk/client/data_classes/label.py +27 -0
  42. cognite_toolkit/_cdf_tk/client/data_classes/raw.py +3 -2
  43. cognite_toolkit/_cdf_tk/client/data_classes/securitycategory.py +24 -0
  44. cognite_toolkit/_cdf_tk/client/data_classes/sequence.py +45 -0
  45. cognite_toolkit/_cdf_tk/client/data_classes/simulator_model.py +50 -0
  46. cognite_toolkit/_cdf_tk/client/data_classes/timeseries.py +15 -18
  47. cognite_toolkit/_cdf_tk/client/data_classes/transformation.py +140 -0
  48. cognite_toolkit/_cdf_tk/client/data_classes/workflow.py +27 -0
  49. cognite_toolkit/_cdf_tk/client/data_classes/workflow_trigger.py +63 -0
  50. cognite_toolkit/_cdf_tk/client/data_classes/workflow_version.py +155 -0
  51. cognite_toolkit/_cdf_tk/client/testing.py +6 -1
  52. cognite_toolkit/_cdf_tk/commands/_migrate/conversion.py +10 -7
  53. cognite_toolkit/_cdf_tk/commands/_migrate/data_mapper.py +4 -4
  54. cognite_toolkit/_cdf_tk/cruds/_data_cruds.py +7 -3
  55. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/auth.py +5 -1
  56. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/classic.py +40 -39
  57. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/file.py +56 -59
  58. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/relationship.py +3 -3
  59. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/timeseries.py +48 -47
  60. cognite_toolkit/_cdf_tk/resource_classes/__init__.py +2 -0
  61. cognite_toolkit/_cdf_tk/resource_classes/simulator_model.py +17 -0
  62. cognite_toolkit/_cdf_tk/storageio/_asset_centric.py +84 -71
  63. cognite_toolkit/_cdf_tk/storageio/_file_content.py +22 -19
  64. cognite_toolkit/_cdf_tk/utils/useful_types2.py +5 -3
  65. cognite_toolkit/_repo_files/GitHub/.github/workflows/deploy.yaml +1 -1
  66. cognite_toolkit/_repo_files/GitHub/.github/workflows/dry-run.yaml +1 -1
  67. cognite_toolkit/_resources/cdf.toml +1 -1
  68. cognite_toolkit/_version.py +1 -1
  69. {cognite_toolkit-0.7.42.dist-info → cognite_toolkit-0.7.44.dist-info}/METADATA +11 -1
  70. {cognite_toolkit-0.7.42.dist-info → cognite_toolkit-0.7.44.dist-info}/RECORD +72 -34
  71. {cognite_toolkit-0.7.42.dist-info → cognite_toolkit-0.7.44.dist-info}/WHEEL +1 -1
  72. {cognite_toolkit-0.7.42.dist-info → cognite_toolkit-0.7.44.dist-info}/entry_points.txt +0 -0
@@ -16,11 +16,14 @@ from cognite_toolkit._cdf_tk.client.http_client import HTTPClient
16
16
 
17
17
  from .api.assets import AssetsAPI
18
18
  from .api.events import EventsAPI
19
+ from .api.filemetadata import FileMetadataAPI
19
20
  from .api.infield import InfieldAPI
20
21
  from .api.lookup import LookUpGroup
21
22
  from .api.migration import MigrationAPI
22
23
  from .api.project import ProjectAPI
24
+ from .api.raw import RawAPI
23
25
  from .api.search import SearchAPI
26
+ from .api.simulators import SimulatorsAPI
24
27
  from .api.streams import StreamsAPI
25
28
  from .api.three_d import ThreeDAPI
26
29
  from .api.timeseries import TimeSeriesAPI
@@ -36,8 +39,11 @@ class ToolAPI:
36
39
  self.http_client = http_client
37
40
  self.three_d = ThreeDAPI(http_client, console)
38
41
  self.assets = AssetsAPI(http_client)
39
- self.time_series = TimeSeriesAPI(http_client)
42
+ self.timeseries = TimeSeriesAPI(http_client)
43
+ self.filemetadata = FileMetadataAPI(http_client)
40
44
  self.events = EventsAPI(http_client)
45
+ self.raw = RawAPI(http_client)
46
+ self.simulators = SimulatorsAPI(http_client)
41
47
 
42
48
 
43
49
  class ToolkitClient(CogniteClient):
@@ -1,5 +1,5 @@
1
1
  from collections.abc import Sequence
2
- from typing import Literal
2
+ from typing import Any, Literal
3
3
 
4
4
  from cognite_toolkit._cdf_tk.client.cdf_client import CDFResourceAPI, PagedResponse, ResponseItems
5
5
  from cognite_toolkit._cdf_tk.client.cdf_client.api import Endpoint
@@ -75,15 +75,33 @@ class EventsAPI(CDFResourceAPI[InternalOrExternalId, EventRequest, EventResponse
75
75
 
76
76
  def iterate(
77
77
  self,
78
+ data_set_external_ids: list[str] | None = None,
79
+ asset_subtree_external_ids: list[str] | None = None,
78
80
  limit: int = 100,
79
81
  cursor: str | None = None,
80
82
  ) -> PagedResponse[EventResponse]:
81
83
  """Iterate over all events in CDF.
82
84
 
85
+ Args:
86
+ data_set_external_ids: Filter by data set external IDs.
87
+ asset_subtree_external_ids: Filter by asset subtree external IDs.
88
+ limit: Maximum number of items to return.
89
+ cursor: Cursor for pagination.
90
+
83
91
  Returns:
84
92
  PagedResponse of EventResponse objects.
85
93
  """
86
- return self._iterate(cursor=cursor, limit=limit)
94
+ filter_: dict[str, Any] = {}
95
+ if asset_subtree_external_ids:
96
+ filter_["assetSubtreeIds"] = [{"externalId": ext_id} for ext_id in asset_subtree_external_ids]
97
+ if data_set_external_ids:
98
+ filter_["dataSetIds"] = [{"externalId": ds_id} for ds_id in data_set_external_ids]
99
+
100
+ return self._iterate(
101
+ cursor=cursor,
102
+ limit=limit,
103
+ body={"filter": filter_ or None},
104
+ )
87
105
 
88
106
  def list(
89
107
  self,
@@ -0,0 +1,145 @@
1
+ from collections.abc import Sequence
2
+ from typing import Any, Literal
3
+
4
+ from cognite_toolkit._cdf_tk.client.cdf_client import CDFResourceAPI, PagedResponse, ResponseItems
5
+ from cognite_toolkit._cdf_tk.client.cdf_client.api import Endpoint
6
+ from cognite_toolkit._cdf_tk.client.data_classes.filemetadata import FileMetadataRequest, FileMetadataResponse
7
+ from cognite_toolkit._cdf_tk.client.data_classes.identifiers import InternalOrExternalId
8
+ from cognite_toolkit._cdf_tk.client.http_client import HTTPClient, RequestMessage2, SuccessResponse2
9
+
10
+
11
+ class FileMetadataAPI(CDFResourceAPI[InternalOrExternalId, FileMetadataRequest, FileMetadataResponse]):
12
+ def __init__(self, http_client: HTTPClient) -> None:
13
+ super().__init__(
14
+ http_client=http_client,
15
+ method_endpoint_map={
16
+ "create": Endpoint(method="POST", path="/files", item_limit=1, concurrency_max_workers=1),
17
+ "retrieve": Endpoint(method="POST", path="/files/byids", item_limit=1000, concurrency_max_workers=1),
18
+ "update": Endpoint(method="POST", path="/files/update", item_limit=1000, concurrency_max_workers=1),
19
+ "delete": Endpoint(method="POST", path="/files/delete", item_limit=1000, concurrency_max_workers=1),
20
+ "list": Endpoint(method="POST", path="/files/list", item_limit=1000),
21
+ },
22
+ )
23
+
24
+ def _page_response(self, response: SuccessResponse2) -> PagedResponse[FileMetadataResponse]:
25
+ return PagedResponse[FileMetadataResponse].model_validate_json(response.body)
26
+
27
+ def _reference_response(self, response: SuccessResponse2) -> ResponseItems[InternalOrExternalId]:
28
+ return ResponseItems[InternalOrExternalId].model_validate_json(response.body)
29
+
30
+ def create(self, items: Sequence[FileMetadataRequest], overwrite: bool = False) -> list[FileMetadataResponse]:
31
+ """Upload file metadata to CDF.
32
+
33
+ Args:
34
+ items: List of FileMetadataRequest objects to upload.
35
+ overwrite: Whether to overwrite existing file metadata with the same external ID.
36
+
37
+ Returns:
38
+ List of created FileMetadataResponse objects.
39
+ """
40
+ # The Files API is different from other APIs, thus we have a custom implementation here.
41
+ # - It only allow one item per request that is not wrapped in a "items" field.
42
+ # - It uses a query parameter for "overwrite" instead of including it in the body
43
+ endpoint = self._method_endpoint_map["create"]
44
+ results: list[FileMetadataResponse] = []
45
+ for item in items:
46
+ request = RequestMessage2(
47
+ endpoint_url=self._make_url(endpoint.path),
48
+ method=endpoint.method,
49
+ body_content=item.dump(),
50
+ parameters={"overwrite": overwrite},
51
+ )
52
+ response = self._http_client.request_single_retries(request)
53
+ result = response.get_success_or_raise()
54
+ results.extend(self._page_response(result).items)
55
+ return results
56
+
57
+ def retrieve(
58
+ self, items: Sequence[InternalOrExternalId], ignore_unknown_ids: bool = False
59
+ ) -> list[FileMetadataResponse]:
60
+ """Retrieve file metadata from CDF.
61
+
62
+ Args:
63
+ items: List of InternalOrExternalId objects to retrieve.
64
+ ignore_unknown_ids: Whether to ignore unknown IDs.
65
+ Returns:
66
+ List of retrieved FileMetadataResponse objects.
67
+ """
68
+ return self._request_item_response(
69
+ items, method="retrieve", extra_body={"ignoreUnknownIds": ignore_unknown_ids}
70
+ )
71
+
72
+ def update(
73
+ self, items: Sequence[FileMetadataRequest], mode: Literal["patch", "replace"] = "replace"
74
+ ) -> list[FileMetadataResponse]:
75
+ """Update file metadata in CDF.
76
+
77
+ Args:
78
+ items: List of FileMetadataRequest objects to update.
79
+ mode: Update mode, either "patch" or "replace".
80
+
81
+ Returns:
82
+ List of updated FileMetadataResponse objects.
83
+ """
84
+ return self._update(items, mode=mode)
85
+
86
+ def delete(self, items: Sequence[InternalOrExternalId], ignore_unknown_ids: bool = False) -> None:
87
+ """Delete file metadata from CDF.
88
+
89
+ Args:
90
+ items: List of InternalOrExternalId objects to delete.
91
+ ignore_unknown_ids: Whether to ignore unknown IDs.
92
+ """
93
+ self._request_no_response(items, "delete", extra_body={"ignoreUnknownIds": ignore_unknown_ids})
94
+
95
+ def iterate(
96
+ self,
97
+ data_set_external_ids: list[str] | None = None,
98
+ asset_subtree_external_ids: list[str] | None = None,
99
+ directory_prefix: str | None = None,
100
+ uploaded: bool | None = None,
101
+ limit: int = 100,
102
+ cursor: str | None = None,
103
+ ) -> PagedResponse[FileMetadataResponse]:
104
+ """Iterate over file metadata in CDF.
105
+
106
+ Args:
107
+ data_set_external_ids: Filter by data set external IDs.
108
+ asset_subtree_external_ids: Filter by asset subtree external IDs.
109
+ directory_prefix: Filter by directory prefix.
110
+ uploaded: Filter by upload status.
111
+ limit: Maximum number of items to return per page.
112
+ cursor: Cursor for pagination.
113
+
114
+ Returns:
115
+ PagedResponse of FileMetadataResponse objects.
116
+ """
117
+ filter_: dict[str, Any] = {}
118
+ if asset_subtree_external_ids:
119
+ filter_["assetSubtreeIds"] = [{"externalId": ext_id} for ext_id in asset_subtree_external_ids]
120
+ if data_set_external_ids:
121
+ filter_["dataSetIds"] = [{"externalId": ds_id} for ds_id in data_set_external_ids]
122
+ if directory_prefix is not None:
123
+ filter_["directoryPrefix"] = directory_prefix
124
+ if uploaded is not None:
125
+ filter_["uploaded"] = uploaded
126
+
127
+ return self._iterate(
128
+ cursor=cursor,
129
+ limit=limit,
130
+ body={"filter": filter_ or None},
131
+ )
132
+
133
+ def list(
134
+ self,
135
+ limit: int | None = 100,
136
+ ) -> list[FileMetadataResponse]:
137
+ """List all file metadata in CDF.
138
+
139
+ Args:
140
+ limit: Maximum number of items to return. None for all items.
141
+
142
+ Returns:
143
+ List of FileMetadataResponse objects.
144
+ """
145
+ return self._list(limit=limit)
@@ -0,0 +1,174 @@
1
+ from collections.abc import Sequence
2
+
3
+ from cognite_toolkit._cdf_tk.client.cdf_client import CDFResourceAPI, Endpoint, PagedResponse, ResponseItems
4
+ from cognite_toolkit._cdf_tk.client.data_classes.raw import RAWDatabase, RAWTable
5
+ from cognite_toolkit._cdf_tk.client.http_client import HTTPClient, SuccessResponse2
6
+
7
+
8
+ class RawDatabasesAPI(CDFResourceAPI[RAWDatabase, RAWDatabase, RAWDatabase]):
9
+ """API for managing RAW databases in CDF.
10
+
11
+ This API provides methods to create, list, and delete RAW databases.
12
+ """
13
+
14
+ def __init__(self, http_client: HTTPClient) -> None:
15
+ super().__init__(
16
+ http_client,
17
+ {
18
+ "create": Endpoint(method="POST", path="/raw/dbs", item_limit=1000),
19
+ "delete": Endpoint(method="POST", path="/raw/dbs/delete", item_limit=1000),
20
+ "list": Endpoint(method="GET", path="/raw/dbs", item_limit=1000),
21
+ },
22
+ )
23
+
24
+ def _page_response(self, response: SuccessResponse2) -> PagedResponse[RAWDatabase]:
25
+ return PagedResponse[RAWDatabase].model_validate_json(response.body)
26
+
27
+ def _reference_response(self, response: SuccessResponse2) -> ResponseItems[RAWDatabase]:
28
+ return ResponseItems[RAWDatabase].model_validate_json(response.body)
29
+
30
+ def create(self, items: Sequence[RAWDatabase]) -> list[RAWDatabase]:
31
+ """Create databases in CDF.
32
+
33
+ Args:
34
+ items: List of RAWDatabase objects to create.
35
+
36
+ Returns:
37
+ List of created RAWDatabase objects.
38
+ """
39
+ return self._request_item_response(list(items), "create")
40
+
41
+ def delete(self, items: Sequence[RAWDatabase], recursive: bool = False) -> None:
42
+ """Delete databases from CDF.
43
+
44
+ Args:
45
+ items: List of RAWDatabase objects to delete.
46
+ recursive: Whether to delete tables within the database recursively.
47
+ """
48
+ self._request_no_response(list(items), "delete", extra_body={"recursive": recursive})
49
+
50
+ def iterate(
51
+ self,
52
+ limit: int = 100,
53
+ cursor: str | None = None,
54
+ ) -> PagedResponse[RAWDatabase]:
55
+ """Iterate over all databases in CDF.
56
+
57
+ Args:
58
+ limit: Maximum number of items to return.
59
+ cursor: Cursor for pagination.
60
+
61
+ Returns:
62
+ PagedResponse of RAWDatabase objects.
63
+ """
64
+ return self._iterate(limit=limit, cursor=cursor)
65
+
66
+ def list(self, limit: int | None = None) -> list[RAWDatabase]:
67
+ """List all databases in CDF.
68
+
69
+ Args:
70
+ limit: Maximum number of databases to return. If None, returns all databases.
71
+
72
+ Returns:
73
+ List of RAWDatabase objects.
74
+ """
75
+ return self._list(limit=limit)
76
+
77
+
78
+ class RawTablesAPI(CDFResourceAPI[RAWTable, RAWTable, RAWTable]):
79
+ """API for managing RAW tables in CDF.
80
+
81
+ This API provides methods to create, list, and delete RAW tables within a database.
82
+
83
+ Note: This API requires db_name as a path parameter for all operations,
84
+ so it overrides several base class methods to handle dynamic paths.
85
+ """
86
+
87
+ def __init__(self, http_client: HTTPClient) -> None:
88
+ # We pass empty endpoint map since paths are dynamic (depend on db_name)
89
+ super().__init__(
90
+ http_client,
91
+ {
92
+ "create": Endpoint(method="POST", path="/raw/dbs/{dbName}/tables", item_limit=1000),
93
+ "delete": Endpoint(method="POST", path="/raw/dbs/{dbName}/tables/delete", item_limit=1000),
94
+ "list": Endpoint(method="GET", path="/raw/dbs/{dbName}/tables", item_limit=1000),
95
+ },
96
+ )
97
+
98
+ def _page_response(self, response: SuccessResponse2) -> PagedResponse[RAWTable]:
99
+ """Parse a page response. Note: db_name must be injected separately."""
100
+ return PagedResponse[RAWTable].model_validate_json(response.body)
101
+
102
+ def _reference_response(self, response: SuccessResponse2) -> ResponseItems[RAWTable]:
103
+ """Parse a reference response. Note: db_name must be injected separately."""
104
+ return ResponseItems[RAWTable].model_validate_json(response.body)
105
+
106
+ def create(self, items: Sequence[RAWTable], ensure_parent: bool = False) -> list[RAWTable]:
107
+ """Create tables in a database in CDF.
108
+
109
+ Args:
110
+ items: List of RAWTable objects to create.
111
+ ensure_parent: Create database if it doesn't exist already.
112
+
113
+ Returns:
114
+ List of created RAWTable objects.
115
+ """
116
+ result: list[RAWTable] = []
117
+ for db_name, group in self._group_items_by_text_field(items, "db_name").items():
118
+ if not db_name:
119
+ raise ValueError("db_name must be set on all RAWTable items for creation.")
120
+ endpoint = f"/raw/dbs/{db_name}/tables"
121
+ created = self._request_item_response(
122
+ group, "create", params={"ensureParent": ensure_parent}, endpoint=endpoint
123
+ )
124
+ for table in created:
125
+ result.append(RAWTable(db_name=db_name, name=table.name))
126
+ return result
127
+
128
+ def delete(self, items: Sequence[RAWTable]) -> None:
129
+ """Delete tables from a database in CDF.
130
+
131
+ Args:
132
+ items: List of RAWTable objects to delete.
133
+ """
134
+ for db_name, group in self._group_items_by_text_field(items, "db_name").items():
135
+ if not db_name:
136
+ raise ValueError("db_name must be set on all RAWTable items for deletion.")
137
+ endpoint = f"/raw/dbs/{db_name}/tables/delete"
138
+ self._request_no_response(list(group), "delete", endpoint=endpoint)
139
+
140
+ def iterate(
141
+ self,
142
+ db_name: str,
143
+ limit: int = 100,
144
+ cursor: str | None = None,
145
+ ) -> PagedResponse[RAWTable]:
146
+ """Iterate over all tables in a database in CDF.
147
+
148
+ Args:
149
+ db_name: The name of the database to list tables from.
150
+ limit: Maximum number of items to return.
151
+ cursor: Cursor for pagination.
152
+
153
+ Returns:
154
+ PagedResponse of RAWTable objects.
155
+ """
156
+ return self._iterate(cursor=cursor, limit=limit, endpoint_path=f"/raw/dbs/{db_name}/tables")
157
+
158
+ def list(self, db_name: str, limit: int | None = None) -> list[RAWTable]:
159
+ """List all tables in a database in CDF.
160
+
161
+ Args:
162
+ db_name: The name of the database to list tables from.
163
+ limit: Maximum number of tables to return. If None, returns all tables.
164
+
165
+ Returns:
166
+ List of RAWTable objects.
167
+ """
168
+ return self._list(limit, endpoint_path=f"/raw/dbs/{db_name}/tables")
169
+
170
+
171
+ class RawAPI:
172
+ def __init__(self, http_client: HTTPClient) -> None:
173
+ self.databases = RawDatabasesAPI(http_client)
174
+ self.tables = RawTablesAPI(http_client)
@@ -0,0 +1,118 @@
1
+ from collections.abc import Sequence
2
+ from typing import Any, Literal
3
+
4
+ from cognite_toolkit._cdf_tk.client.cdf_client import CDFResourceAPI, PagedResponse, ResponseItems
5
+ from cognite_toolkit._cdf_tk.client.cdf_client.api import Endpoint
6
+ from cognite_toolkit._cdf_tk.client.data_classes.identifiers import InternalOrExternalId
7
+ from cognite_toolkit._cdf_tk.client.data_classes.simulator_model import SimulatorModelRequest, SimulatorModelResponse
8
+ from cognite_toolkit._cdf_tk.client.http_client import HTTPClient, SuccessResponse2
9
+
10
+
11
+ class SimulatorModelsAPI(CDFResourceAPI[InternalOrExternalId, SimulatorModelRequest, SimulatorModelResponse]):
12
+ def __init__(self, http_client: HTTPClient) -> None:
13
+ super().__init__(
14
+ http_client=http_client,
15
+ method_endpoint_map={
16
+ "create": Endpoint(method="POST", path="/simulators/models", item_limit=1, concurrency_max_workers=1),
17
+ "retrieve": Endpoint(
18
+ method="POST", path="/simulators/models/byids", item_limit=1, concurrency_max_workers=1
19
+ ),
20
+ "update": Endpoint(
21
+ method="POST", path="/simulators/models/update", item_limit=1, concurrency_max_workers=1
22
+ ),
23
+ "delete": Endpoint(
24
+ method="POST", path="/simulators/models/delete", item_limit=1, concurrency_max_workers=1
25
+ ),
26
+ "list": Endpoint(method="POST", path="/simulators/models/list", item_limit=1000),
27
+ },
28
+ )
29
+
30
+ def _page_response(self, response: SuccessResponse2) -> PagedResponse[SimulatorModelResponse]:
31
+ return PagedResponse[SimulatorModelResponse].model_validate_json(response.body)
32
+
33
+ def _reference_response(self, response: SuccessResponse2) -> ResponseItems[InternalOrExternalId]:
34
+ return ResponseItems[InternalOrExternalId].model_validate_json(response.body)
35
+
36
+ def create(self, items: Sequence[SimulatorModelRequest]) -> list[SimulatorModelResponse]:
37
+ """Create simulator models in CDF.
38
+
39
+ Args:
40
+ items: List of SimulatorModelRequest objects to create.
41
+
42
+ Returns:
43
+ List of created SimulatorModelResponse objects.
44
+ """
45
+ return self._request_item_response(items, "create")
46
+
47
+ def retrieve(self, items: Sequence[InternalOrExternalId]) -> list[SimulatorModelResponse]:
48
+ """Retrieve simulator models from CDF.
49
+
50
+ Args:
51
+ items: List of InternalOrExternalId objects to retrieve.
52
+
53
+ Returns:
54
+ List of retrieved SimulatorModelResponse objects.
55
+ """
56
+ return self._request_item_response(items, method="retrieve")
57
+
58
+ def update(
59
+ self, items: Sequence[SimulatorModelRequest], mode: Literal["patch", "replace"] = "replace"
60
+ ) -> list[SimulatorModelResponse]:
61
+ """Update simulator models in CDF.
62
+
63
+ Args:
64
+ items: List of SimulatorModelRequest objects to update.
65
+ mode: Update mode, either "patch" or "replace".
66
+
67
+ Returns:
68
+ List of updated SimulatorModelResponse objects.
69
+ """
70
+ return self._update(items, mode=mode)
71
+
72
+ def delete(self, items: Sequence[InternalOrExternalId]) -> None:
73
+ """Delete simulator models from CDF.
74
+
75
+ Args:
76
+ items: List of InternalOrExternalId objects to delete.
77
+ """
78
+ self._request_no_response(items, "delete")
79
+
80
+ def iterate(
81
+ self,
82
+ simulator_external_ids: list[str] | None = None,
83
+ limit: int = 100,
84
+ cursor: str | None = None,
85
+ ) -> PagedResponse[SimulatorModelResponse]:
86
+ """Iterate over simulator models in CDF.
87
+
88
+ Args:
89
+ simulator_external_ids: Filter by simulator external IDs.
90
+ limit: Maximum number of items to return per page.
91
+ cursor: Cursor for pagination.
92
+
93
+ Returns:
94
+ PagedResponse of SimulatorModelResponse objects.
95
+ """
96
+ filter_: dict[str, Any] = {}
97
+ if simulator_external_ids:
98
+ filter_["simulatorExternalIds"] = simulator_external_ids
99
+
100
+ return self._iterate(
101
+ cursor=cursor,
102
+ limit=limit,
103
+ body={"filter": filter_ or None},
104
+ )
105
+
106
+ def list(
107
+ self,
108
+ limit: int | None = 100,
109
+ ) -> list[SimulatorModelResponse]:
110
+ """List all simulator models in CDF.
111
+
112
+ Args:
113
+ limit: Maximum number of items to return. None for all items.
114
+
115
+ Returns:
116
+ List of SimulatorModelResponse objects.
117
+ """
118
+ return self._list(limit=limit)
@@ -0,0 +1,8 @@
1
+ from cognite_toolkit._cdf_tk.client.http_client import HTTPClient
2
+
3
+ from .simulator_models import SimulatorModelsAPI
4
+
5
+
6
+ class SimulatorsAPI:
7
+ def __init__(self, http_client: HTTPClient) -> None:
8
+ self.models = SimulatorModelsAPI(http_client)
@@ -1,5 +1,5 @@
1
1
  from collections.abc import Sequence
2
- from typing import Literal
2
+ from typing import Any, Literal
3
3
 
4
4
  from cognite_toolkit._cdf_tk.client.cdf_client import CDFResourceAPI, PagedResponse, ResponseItems
5
5
  from cognite_toolkit._cdf_tk.client.cdf_client.api import Endpoint
@@ -83,15 +83,33 @@ class TimeSeriesAPI(CDFResourceAPI[InternalOrExternalId, TimeSeriesRequest, Time
83
83
 
84
84
  def iterate(
85
85
  self,
86
+ data_set_external_ids: list[str] | None = None,
87
+ asset_subtree_external_ids: list[str] | None = None,
86
88
  limit: int = 100,
87
89
  cursor: str | None = None,
88
90
  ) -> PagedResponse[TimeSeriesResponse]:
89
91
  """Iterate over all time series in CDF.
90
92
 
93
+ Args:
94
+ data_set_external_ids: Filter by data set external IDs.
95
+ asset_subtree_external_ids: Filter by asset subtree external IDs.
96
+ limit: Maximum number of items to return.
97
+ cursor: Cursor for pagination.
98
+
91
99
  Returns:
92
100
  PagedResponse of TimeSeriesResponse objects.
93
101
  """
94
- return self._iterate(cursor=cursor, limit=limit)
102
+ filter_: dict[str, Any] = {}
103
+ if asset_subtree_external_ids:
104
+ filter_["assetSubtreeIds"] = [{"externalId": ext_id} for ext_id in asset_subtree_external_ids]
105
+ if data_set_external_ids:
106
+ filter_["dataSetIds"] = [{"externalId": ds_id} for ds_id in data_set_external_ids]
107
+
108
+ return self._iterate(
109
+ cursor=cursor,
110
+ limit=limit,
111
+ body={"filter": filter_ or None},
112
+ )
95
113
 
96
114
  def list(
97
115
  self,
@@ -1,8 +1,9 @@
1
- from .api import CDFResourceAPI
1
+ from .api import CDFResourceAPI, Endpoint
2
2
  from .responses import PagedResponse, QueryResponse, ResponseItems
3
3
 
4
4
  __all__ = [
5
5
  "CDFResourceAPI",
6
+ "Endpoint",
6
7
  "PagedResponse",
7
8
  "QueryResponse",
8
9
  "ResponseItems",