cognite-toolkit 0.7.39__py3-none-any.whl → 0.7.51__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/_download_app.py +1 -1
- cognite_toolkit/_cdf_tk/apps/_dump_app.py +1 -1
- cognite_toolkit/_cdf_tk/apps/_migrate_app.py +6 -6
- cognite_toolkit/_cdf_tk/builders/_function.py +81 -9
- cognite_toolkit/_cdf_tk/builders/_raw.py +1 -1
- cognite_toolkit/_cdf_tk/client/_resource_base.py +187 -0
- cognite_toolkit/_cdf_tk/client/_toolkit_client.py +37 -5
- 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/assets.py +130 -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/datasets.py +141 -0
- cognite_toolkit/_cdf_tk/client/api/events.py +129 -0
- cognite_toolkit/_cdf_tk/client/api/extraction_pipelines.py +148 -0
- cognite_toolkit/_cdf_tk/client/api/filemetadata.py +176 -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/hosted_extractor_destinations.py +131 -0
- cognite_toolkit/_cdf_tk/client/api/hosted_extractor_jobs.py +122 -0
- cognite_toolkit/_cdf_tk/client/api/hosted_extractor_mappings.py +129 -0
- cognite_toolkit/_cdf_tk/client/api/hosted_extractor_sources.py +136 -0
- cognite_toolkit/_cdf_tk/client/api/hosted_extractors.py +23 -0
- cognite_toolkit/_cdf_tk/client/api/infield.py +8 -8
- cognite_toolkit/_cdf_tk/client/api/instances.py +139 -0
- cognite_toolkit/_cdf_tk/client/api/labels.py +125 -0
- cognite_toolkit/_cdf_tk/client/api/legacy/canvas.py +3 -3
- cognite_toolkit/_cdf_tk/client/api/legacy/charts.py +1 -1
- cognite_toolkit/_cdf_tk/client/api/legacy/extended_data_modeling.py +1 -1
- cognite_toolkit/_cdf_tk/client/api/legacy/extended_files.py +2 -2
- cognite_toolkit/_cdf_tk/client/api/legacy/extended_functions.py +1 -1
- cognite_toolkit/_cdf_tk/client/api/legacy/extended_raw.py +1 -1
- cognite_toolkit/_cdf_tk/client/api/legacy/extended_timeseries.py +2 -2
- cognite_toolkit/_cdf_tk/client/api/legacy/location_filters.py +1 -1
- cognite_toolkit/_cdf_tk/client/api/legacy/robotics/capabilities.py +1 -1
- cognite_toolkit/_cdf_tk/client/api/legacy/robotics/data_postprocessing.py +1 -1
- cognite_toolkit/_cdf_tk/client/api/legacy/robotics/frames.py +1 -1
- cognite_toolkit/_cdf_tk/client/api/legacy/robotics/locations.py +1 -1
- cognite_toolkit/_cdf_tk/client/api/legacy/robotics/maps.py +1 -1
- cognite_toolkit/_cdf_tk/client/api/legacy/robotics/robots.py +1 -1
- cognite_toolkit/_cdf_tk/client/api/legacy/search_config.py +1 -1
- cognite_toolkit/_cdf_tk/client/api/location_filters.py +177 -0
- cognite_toolkit/_cdf_tk/client/api/migration.py +1 -1
- cognite_toolkit/_cdf_tk/client/api/project.py +2 -2
- cognite_toolkit/_cdf_tk/client/api/raw.py +204 -0
- 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/security_categories.py +94 -0
- cognite_toolkit/_cdf_tk/client/api/sequences.py +133 -0
- cognite_toolkit/_cdf_tk/client/api/simulator_models.py +154 -0
- cognite_toolkit/_cdf_tk/client/api/simulators.py +8 -0
- cognite_toolkit/_cdf_tk/client/api/spaces.py +117 -0
- cognite_toolkit/_cdf_tk/client/api/streams.py +65 -57
- cognite_toolkit/_cdf_tk/client/api/three_d.py +300 -283
- cognite_toolkit/_cdf_tk/client/api/timeseries.py +137 -0
- cognite_toolkit/_cdf_tk/client/api/token.py +1 -1
- cognite_toolkit/_cdf_tk/client/api/transformations.py +146 -0
- cognite_toolkit/_cdf_tk/client/api/views.py +139 -0
- cognite_toolkit/_cdf_tk/client/api/workflow_triggers.py +128 -0
- cognite_toolkit/_cdf_tk/client/api/workflow_versions.py +138 -0
- cognite_toolkit/_cdf_tk/client/api/workflows.py +119 -0
- cognite_toolkit/_cdf_tk/client/cdf_client/__init__.py +10 -0
- cognite_toolkit/_cdf_tk/client/cdf_client/api.py +358 -0
- cognite_toolkit/_cdf_tk/client/cdf_client/responses.py +38 -0
- cognite_toolkit/_cdf_tk/{utils → client}/http_client/__init__.py +9 -7
- cognite_toolkit/_cdf_tk/{utils → client}/http_client/_client.py +23 -14
- cognite_toolkit/_cdf_tk/{utils → client}/http_client/_data_classes.py +12 -2
- cognite_toolkit/_cdf_tk/client/http_client/_data_classes2.py +151 -0
- cognite_toolkit/_cdf_tk/client/http_client/_exception.py +13 -0
- cognite_toolkit/_cdf_tk/client/http_client/_item_classes.py +118 -0
- cognite_toolkit/_cdf_tk/client/request_classes/base.py +19 -0
- cognite_toolkit/_cdf_tk/client/request_classes/filters.py +113 -0
- cognite_toolkit/_cdf_tk/client/request_classes/graphql.py +28 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/agent.py +130 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/annotation.py +79 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/apm_config.py +128 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/asset.py +47 -0
- cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/charts_data.py +1 -1
- cognite_toolkit/_cdf_tk/client/resource_classes/cognite_file.py +53 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/__init__.py +168 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_constraints.py +37 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_container.py +50 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_data_model.py +73 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_data_types.py +116 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_indexes.py +26 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_instance.py +154 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_references.py +86 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_space.py +26 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_view.py +143 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_view_property.py +152 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/dataset.py +35 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/event.py +40 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/extraction_pipeline.py +59 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/filemetadata.py +52 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/function.py +53 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/function_schedule.py +65 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/graphql_data_model.py +40 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/group/__init__.py +187 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/group/_constants.py +2 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/group/acls.py +653 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/group/capability.py +56 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/group/group.py +63 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/group/scopes.py +166 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_destination.py +34 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_job.py +134 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_mapping.py +72 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/__init__.py +63 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_auth.py +63 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_base.py +26 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_certificate.py +20 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_eventhub.py +31 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_kafka.py +53 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_mqtt.py +36 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_rest.py +49 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/identifiers.py +59 -0
- cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/infield.py +1 -1
- cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/instance_api.py +35 -1
- cognite_toolkit/_cdf_tk/client/resource_classes/label.py +27 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/legacy/__init__.py +0 -0
- cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/canvas.py +48 -15
- cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/charts.py +1 -1
- cognite_toolkit/_cdf_tk/client/resource_classes/location_filter.py +84 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/raw.py +44 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/relationship.py +49 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/resource_view_mapping.py +38 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/robotics/__init__.py +37 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_capability.py +53 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_common.py +34 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_data_post_processing.py +49 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_frame.py +46 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_location.py +36 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_map.py +65 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_robot.py +58 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/search_config.py +54 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/securitycategory.py +24 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/sequence.py +45 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/sequence_rows.py +56 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/simulator_model.py +50 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/streamlit_.py +71 -0
- cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/streams.py +9 -26
- cognite_toolkit/_cdf_tk/client/resource_classes/three_d.py +135 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/timeseries.py +52 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/transformation.py +140 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/workflow.py +27 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/workflow_trigger.py +63 -0
- cognite_toolkit/_cdf_tk/client/resource_classes/workflow_version.py +155 -0
- cognite_toolkit/_cdf_tk/client/testing.py +31 -2
- cognite_toolkit/_cdf_tk/commands/_migrate/command.py +103 -108
- cognite_toolkit/_cdf_tk/commands/_migrate/conversion.py +22 -15
- cognite_toolkit/_cdf_tk/commands/_migrate/creators.py +1 -1
- cognite_toolkit/_cdf_tk/commands/_migrate/data_classes.py +11 -10
- cognite_toolkit/_cdf_tk/commands/_migrate/data_mapper.py +148 -57
- cognite_toolkit/_cdf_tk/commands/_migrate/default_mappings.py +1 -1
- cognite_toolkit/_cdf_tk/commands/_migrate/issues.py +22 -39
- cognite_toolkit/_cdf_tk/commands/_migrate/migration_io.py +29 -27
- cognite_toolkit/_cdf_tk/commands/_profile.py +1 -1
- cognite_toolkit/_cdf_tk/commands/_purge.py +8 -8
- cognite_toolkit/_cdf_tk/commands/_upload.py +1 -1
- cognite_toolkit/_cdf_tk/commands/build_cmd.py +12 -2
- 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/commands/dump_resource.py +4 -4
- cognite_toolkit/_cdf_tk/commands/pull.py +97 -2
- cognite_toolkit/_cdf_tk/commands/run.py +1 -1
- cognite_toolkit/_cdf_tk/cruds/__init__.py +16 -6
- cognite_toolkit/_cdf_tk/cruds/_data_cruds.py +9 -5
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/__init__.py +2 -0
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/auth.py +6 -2
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/classic.py +70 -89
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/configuration.py +1 -1
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/datamodel.py +1 -1
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/extraction_pipeline.py +1 -1
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/fieldops.py +14 -7
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/file.py +50 -59
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/function.py +1 -1
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/industrial_tool.py +1 -1
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/location.py +4 -3
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/migration.py +1 -1
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/raw.py +6 -1
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/relationship.py +5 -4
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/robotics.py +1 -1
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/simulators.py +122 -0
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/streams.py +15 -31
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/timeseries.py +42 -47
- cognite_toolkit/_cdf_tk/cruds/_resource_cruds/transformation.py +1 -1
- 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/data_classes/_tracking_info.py +4 -0
- cognite_toolkit/_cdf_tk/feature_flags.py +8 -0
- cognite_toolkit/_cdf_tk/resource_classes/__init__.py +2 -0
- cognite_toolkit/_cdf_tk/resource_classes/capabilities.py +6 -0
- cognite_toolkit/_cdf_tk/resource_classes/search_config.py +1 -1
- cognite_toolkit/_cdf_tk/resource_classes/simulator_model.py +17 -0
- cognite_toolkit/_cdf_tk/resource_classes/workflow_version.py +13 -4
- cognite_toolkit/_cdf_tk/storageio/_applications.py +53 -15
- cognite_toolkit/_cdf_tk/storageio/_asset_centric.py +117 -107
- cognite_toolkit/_cdf_tk/storageio/_base.py +3 -1
- cognite_toolkit/_cdf_tk/storageio/_datapoints.py +7 -7
- cognite_toolkit/_cdf_tk/storageio/_file_content.py +64 -54
- cognite_toolkit/_cdf_tk/storageio/_instances.py +1 -1
- cognite_toolkit/_cdf_tk/storageio/_raw.py +1 -1
- cognite_toolkit/_cdf_tk/storageio/logger.py +162 -0
- cognite_toolkit/_cdf_tk/tk_warnings/__init__.py +2 -0
- cognite_toolkit/_cdf_tk/tk_warnings/fileread.py +20 -0
- cognite_toolkit/_cdf_tk/utils/__init__.py +11 -1
- cognite_toolkit/_cdf_tk/utils/cdf.py +1 -1
- cognite_toolkit/_cdf_tk/utils/interactive_select.py +8 -6
- cognite_toolkit/_cdf_tk/utils/modules.py +7 -0
- cognite_toolkit/_cdf_tk/utils/pip_validator.py +96 -0
- cognite_toolkit/_cdf_tk/utils/useful_types.py +4 -7
- cognite_toolkit/_cdf_tk/utils/useful_types2.py +14 -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.39.dist-info → cognite_toolkit-0.7.51.dist-info}/METADATA +13 -3
- cognite_toolkit-0.7.51.dist-info/RECORD +445 -0
- {cognite_toolkit-0.7.39.dist-info → cognite_toolkit-0.7.51.dist-info}/WHEEL +2 -2
- cognite_toolkit/_cdf_tk/client/data_classes/api_classes.py +0 -30
- cognite_toolkit/_cdf_tk/client/data_classes/base.py +0 -67
- cognite_toolkit/_cdf_tk/client/data_classes/three_d.py +0 -112
- cognite_toolkit/_cdf_tk/commands/build_v2/build_issues.py +0 -27
- cognite_toolkit/_cdf_tk/utils/http_client/_data_classes2.py +0 -247
- cognite_toolkit/_cdf_tk/utils/http_client/_exception.py +0 -4
- cognite_toolkit-0.7.39.dist-info/RECORD +0 -322
- /cognite_toolkit/_cdf_tk/{utils → client}/http_client/_tracker.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → request_classes}/__init__.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes/legacy → resource_classes}/__init__.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/capabilities.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/apm_config_v1.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/extendable_cognite_file.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/extended_filemetadata.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/extended_filemetdata.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/extended_timeseries.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/functions.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/graphql_data_models.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/instances.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/location_filters.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/migration.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/pending_instances_ids.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/project.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/raw.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/robotics.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/search_config.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/sequences.py +0 -0
- /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/legacy/streamlit_.py +0 -0
- {cognite_toolkit-0.7.39.dist-info → cognite_toolkit-0.7.51.dist-info}/entry_points.txt +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from ._client import HTTPClient
|
|
2
2
|
from ._data_classes import (
|
|
3
|
+
T_COVARIANT_ID,
|
|
3
4
|
DataBodyRequest,
|
|
4
5
|
ErrorDetails,
|
|
5
6
|
FailedRequestItems,
|
|
@@ -10,6 +11,7 @@ from ._data_classes import (
|
|
|
10
11
|
ItemMessage,
|
|
11
12
|
ItemsRequest,
|
|
12
13
|
ParamRequest,
|
|
14
|
+
RequestItem,
|
|
13
15
|
RequestMessage,
|
|
14
16
|
ResponseList,
|
|
15
17
|
ResponseMessage,
|
|
@@ -18,24 +20,24 @@ from ._data_classes import (
|
|
|
18
20
|
SuccessResponseItems,
|
|
19
21
|
)
|
|
20
22
|
from ._data_classes2 import (
|
|
21
|
-
BaseModelObject,
|
|
22
23
|
ErrorDetails2,
|
|
23
24
|
FailedRequest2,
|
|
24
25
|
FailedResponse2,
|
|
25
26
|
HTTPResult2,
|
|
27
|
+
RequestMessage2,
|
|
28
|
+
SuccessResponse2,
|
|
29
|
+
)
|
|
30
|
+
from ._exception import ToolkitAPIError
|
|
31
|
+
from ._item_classes import (
|
|
26
32
|
ItemsFailedRequest2,
|
|
27
33
|
ItemsFailedResponse2,
|
|
28
34
|
ItemsRequest2,
|
|
29
35
|
ItemsResultMessage2,
|
|
30
36
|
ItemsSuccessResponse2,
|
|
31
|
-
RequestMessage2,
|
|
32
|
-
RequestResource,
|
|
33
|
-
SuccessResponse2,
|
|
34
37
|
)
|
|
35
|
-
from ._exception import ToolkitAPIError
|
|
36
38
|
|
|
37
39
|
__all__ = [
|
|
38
|
-
"
|
|
40
|
+
"T_COVARIANT_ID",
|
|
39
41
|
"DataBodyRequest",
|
|
40
42
|
"ErrorDetails",
|
|
41
43
|
"ErrorDetails2",
|
|
@@ -56,9 +58,9 @@ __all__ = [
|
|
|
56
58
|
"ItemsResultMessage2",
|
|
57
59
|
"ItemsSuccessResponse2",
|
|
58
60
|
"ParamRequest",
|
|
61
|
+
"RequestItem",
|
|
59
62
|
"RequestMessage",
|
|
60
63
|
"RequestMessage2",
|
|
61
|
-
"RequestResource",
|
|
62
64
|
"ResponseList",
|
|
63
65
|
"ResponseMessage",
|
|
64
66
|
"SimpleBodyRequest",
|
|
@@ -10,9 +10,7 @@ import httpx
|
|
|
10
10
|
from cognite.client import global_config
|
|
11
11
|
from rich.console import Console
|
|
12
12
|
|
|
13
|
-
from cognite_toolkit._cdf_tk.
|
|
14
|
-
from cognite_toolkit._cdf_tk.utils.auxiliary import get_current_toolkit_version, get_user_agent
|
|
15
|
-
from cognite_toolkit._cdf_tk.utils.http_client._data_classes import (
|
|
13
|
+
from cognite_toolkit._cdf_tk.client.http_client._data_classes import (
|
|
16
14
|
BodyRequest,
|
|
17
15
|
DataBodyRequest,
|
|
18
16
|
FailedRequestMessage,
|
|
@@ -23,21 +21,25 @@ from cognite_toolkit._cdf_tk.utils.http_client._data_classes import (
|
|
|
23
21
|
ResponseList,
|
|
24
22
|
ResponseMessage,
|
|
25
23
|
)
|
|
26
|
-
from cognite_toolkit._cdf_tk.
|
|
24
|
+
from cognite_toolkit._cdf_tk.client.http_client._data_classes2 import (
|
|
27
25
|
BaseRequestMessage,
|
|
28
26
|
ErrorDetails2,
|
|
29
27
|
FailedRequest2,
|
|
30
28
|
FailedResponse2,
|
|
31
29
|
HTTPResult2,
|
|
30
|
+
RequestMessage2,
|
|
31
|
+
SuccessResponse2,
|
|
32
|
+
)
|
|
33
|
+
from cognite_toolkit._cdf_tk.client.http_client._item_classes import (
|
|
32
34
|
ItemsFailedRequest2,
|
|
33
35
|
ItemsFailedResponse2,
|
|
34
36
|
ItemsRequest2,
|
|
35
37
|
ItemsResultList,
|
|
36
38
|
ItemsResultMessage2,
|
|
37
39
|
ItemsSuccessResponse2,
|
|
38
|
-
RequestMessage2,
|
|
39
|
-
SuccessResponse2,
|
|
40
40
|
)
|
|
41
|
+
from cognite_toolkit._cdf_tk.tk_warnings import HighSeverityWarning
|
|
42
|
+
from cognite_toolkit._cdf_tk.utils.auxiliary import get_current_toolkit_version, get_user_agent
|
|
41
43
|
from cognite_toolkit._cdf_tk.utils.useful_types import PrimitiveType
|
|
42
44
|
|
|
43
45
|
if sys.version_info >= (3, 11):
|
|
@@ -172,6 +174,7 @@ class HTTPClient:
|
|
|
172
174
|
content_type: str = "application/json",
|
|
173
175
|
accept: str = "application/json",
|
|
174
176
|
content_length: int | None = None,
|
|
177
|
+
disable_gzip: bool = False,
|
|
175
178
|
) -> MutableMapping[str, str]:
|
|
176
179
|
headers: MutableMapping[str, str] = {}
|
|
177
180
|
headers["User-Agent"] = f"httpx/{httpx.__version__} {get_user_agent()}"
|
|
@@ -184,7 +187,7 @@ class HTTPClient:
|
|
|
184
187
|
headers["x-cdp-sdk"] = f"CogniteToolkit:{get_current_toolkit_version()}"
|
|
185
188
|
headers["x-cdp-app"] = self.config.client_name
|
|
186
189
|
headers["cdf-version"] = api_version or self.config.api_subversion
|
|
187
|
-
if not global_config.disable_gzip and content_length is None:
|
|
190
|
+
if not global_config.disable_gzip and content_length is None and not disable_gzip:
|
|
188
191
|
headers["Content-Encoding"] = "gzip"
|
|
189
192
|
return headers
|
|
190
193
|
|
|
@@ -332,7 +335,13 @@ class HTTPClient:
|
|
|
332
335
|
raise TypeError(f"Unexpected result type: {type(result)}")
|
|
333
336
|
|
|
334
337
|
def _make_request2(self, message: BaseRequestMessage) -> httpx.Response:
|
|
335
|
-
headers = self._create_headers(
|
|
338
|
+
headers = self._create_headers(
|
|
339
|
+
message.api_version,
|
|
340
|
+
message.content_type,
|
|
341
|
+
message.accept,
|
|
342
|
+
content_length=message.content_length,
|
|
343
|
+
disable_gzip=message.disable_gzip,
|
|
344
|
+
)
|
|
336
345
|
return self.session.request(
|
|
337
346
|
method=message.method,
|
|
338
347
|
url=message.endpoint_url,
|
|
@@ -414,7 +423,7 @@ class HTTPClient:
|
|
|
414
423
|
if message.tracker and message.tracker.limit_reached():
|
|
415
424
|
return [
|
|
416
425
|
ItemsFailedRequest2(
|
|
417
|
-
ids=[item
|
|
426
|
+
ids=[str(item) for item in message.items],
|
|
418
427
|
error_message=f"Aborting further splitting of requests after {message.tracker.failed_split_count} failed attempts.",
|
|
419
428
|
)
|
|
420
429
|
]
|
|
@@ -464,7 +473,7 @@ class HTTPClient:
|
|
|
464
473
|
if 200 <= response.status_code < 300:
|
|
465
474
|
return [
|
|
466
475
|
ItemsSuccessResponse2(
|
|
467
|
-
ids=[item
|
|
476
|
+
ids=[str(item) for item in request.items],
|
|
468
477
|
status_code=response.status_code,
|
|
469
478
|
body=response.text,
|
|
470
479
|
content=response.content,
|
|
@@ -480,7 +489,7 @@ class HTTPClient:
|
|
|
480
489
|
if splits[0].tracker and splits[0].tracker.limit_reached():
|
|
481
490
|
return [
|
|
482
491
|
ItemsFailedResponse2(
|
|
483
|
-
ids=[item
|
|
492
|
+
ids=[str(item) for item in request.items],
|
|
484
493
|
status_code=response.status_code,
|
|
485
494
|
body=response.text,
|
|
486
495
|
error=ErrorDetails2.from_response(response),
|
|
@@ -494,7 +503,7 @@ class HTTPClient:
|
|
|
494
503
|
# Permanent failure
|
|
495
504
|
return [
|
|
496
505
|
ItemsFailedResponse2(
|
|
497
|
-
ids=[item
|
|
506
|
+
ids=[str(item) for item in request.items],
|
|
498
507
|
status_code=response.status_code,
|
|
499
508
|
body=response.text,
|
|
500
509
|
error=ErrorDetails2.from_response(response),
|
|
@@ -516,7 +525,7 @@ class HTTPClient:
|
|
|
516
525
|
error_msg = f"Unexpected exception: {e!s}"
|
|
517
526
|
return [
|
|
518
527
|
ItemsFailedRequest2(
|
|
519
|
-
ids=[item
|
|
528
|
+
ids=[str(item) for item in request.items],
|
|
520
529
|
error_message=error_msg,
|
|
521
530
|
)
|
|
522
531
|
]
|
|
@@ -530,7 +539,7 @@ class HTTPClient:
|
|
|
530
539
|
|
|
531
540
|
return [
|
|
532
541
|
ItemsFailedRequest2(
|
|
533
|
-
ids=[item
|
|
542
|
+
ids=[str(item) for item in request.items],
|
|
534
543
|
error_message=error_msg,
|
|
535
544
|
)
|
|
536
545
|
]
|
|
@@ -7,8 +7,8 @@ from typing import Generic, Literal, Protocol, TypeAlias, TypeVar
|
|
|
7
7
|
import httpx
|
|
8
8
|
from cognite.client.utils import _json
|
|
9
9
|
|
|
10
|
-
from cognite_toolkit._cdf_tk.
|
|
11
|
-
from cognite_toolkit._cdf_tk.
|
|
10
|
+
from cognite_toolkit._cdf_tk.client.http_client._exception import ToolkitAPIError
|
|
11
|
+
from cognite_toolkit._cdf_tk.client.http_client._tracker import ItemsRequestTracker
|
|
12
12
|
from cognite_toolkit._cdf_tk.utils.useful_types import JsonVal, PrimitiveType
|
|
13
13
|
|
|
14
14
|
StatusCode: TypeAlias = int
|
|
@@ -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]
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import gzip
|
|
2
|
+
from abc import ABC, abstractmethod
|
|
3
|
+
from collections.abc import Hashable
|
|
4
|
+
from typing import Any, Literal
|
|
5
|
+
|
|
6
|
+
import httpx
|
|
7
|
+
from cognite.client import global_config
|
|
8
|
+
from pydantic import BaseModel, JsonValue, TypeAdapter, model_validator
|
|
9
|
+
|
|
10
|
+
from cognite_toolkit._cdf_tk.client.http_client._data_classes import (
|
|
11
|
+
ErrorDetails,
|
|
12
|
+
FailedRequestItems,
|
|
13
|
+
FailedRequestMessage,
|
|
14
|
+
FailedResponseItems,
|
|
15
|
+
ResponseMessage,
|
|
16
|
+
SuccessResponseItems,
|
|
17
|
+
)
|
|
18
|
+
from cognite_toolkit._cdf_tk.client.http_client._exception import ToolkitAPIError
|
|
19
|
+
from cognite_toolkit._cdf_tk.utils.useful_types import PrimitiveType
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class HTTPResult2(BaseModel):
|
|
23
|
+
def get_success_or_raise(self) -> "SuccessResponse2":
|
|
24
|
+
"""Raises an exception if any response in the list indicates a failure."""
|
|
25
|
+
if isinstance(self, SuccessResponse2):
|
|
26
|
+
return self
|
|
27
|
+
elif isinstance(self, FailedResponse2):
|
|
28
|
+
raise ToolkitAPIError(
|
|
29
|
+
f"Request failed with status code {self.status_code}: {self.error.message}",
|
|
30
|
+
missing=self.error.missing, # type: ignore[arg-type]
|
|
31
|
+
duplicated=self.error.duplicated, # type: ignore[arg-type]
|
|
32
|
+
)
|
|
33
|
+
elif isinstance(self, FailedRequest2):
|
|
34
|
+
raise ToolkitAPIError(f"Request failed with error: {self.error}")
|
|
35
|
+
else:
|
|
36
|
+
raise ToolkitAPIError("Unknown HTTPResult2 type")
|
|
37
|
+
|
|
38
|
+
# Todo: Remove when HTTPResult2 is renamed to HTTPResponse and the old HTTPResponse is deleted
|
|
39
|
+
def as_item_response(self, item_id: Hashable) -> ResponseMessage | FailedRequestMessage:
|
|
40
|
+
if isinstance(self, SuccessResponse2):
|
|
41
|
+
return SuccessResponseItems(
|
|
42
|
+
status_code=self.status_code, content=self.content, ids=[item_id], body=self.body
|
|
43
|
+
)
|
|
44
|
+
elif isinstance(self, FailedResponse2):
|
|
45
|
+
return FailedResponseItems(
|
|
46
|
+
status_code=self.status_code,
|
|
47
|
+
ids=[item_id],
|
|
48
|
+
body=self.body,
|
|
49
|
+
error=ErrorDetails(
|
|
50
|
+
code=self.error.code,
|
|
51
|
+
message=self.error.message,
|
|
52
|
+
missing=self.error.missing,
|
|
53
|
+
duplicated=self.error.duplicated,
|
|
54
|
+
),
|
|
55
|
+
)
|
|
56
|
+
elif isinstance(self, FailedRequest2):
|
|
57
|
+
return FailedRequestItems(ids=[item_id], error=self.error)
|
|
58
|
+
else:
|
|
59
|
+
raise ToolkitAPIError("Unknown HTTPResult2 type")
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class FailedRequest2(HTTPResult2):
|
|
63
|
+
error: str
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class SuccessResponse2(HTTPResult2):
|
|
67
|
+
status_code: int
|
|
68
|
+
body: str
|
|
69
|
+
content: bytes
|
|
70
|
+
|
|
71
|
+
@property
|
|
72
|
+
def body_json(self) -> dict[str, Any]:
|
|
73
|
+
"""Parse the response body as JSON."""
|
|
74
|
+
return TypeAdapter(dict[str, JsonValue]).validate_json(self.body)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class ErrorDetails2(BaseModel):
|
|
78
|
+
"""This is the expected structure of error details in the CDF API"""
|
|
79
|
+
|
|
80
|
+
code: int
|
|
81
|
+
message: str
|
|
82
|
+
missing: list[JsonValue] | None = None
|
|
83
|
+
duplicated: list[JsonValue] | None = None
|
|
84
|
+
is_auto_retryable: bool | None = None
|
|
85
|
+
|
|
86
|
+
@classmethod
|
|
87
|
+
def from_response(cls, response: httpx.Response) -> "ErrorDetails2":
|
|
88
|
+
"""Populate the error details from a httpx response."""
|
|
89
|
+
try:
|
|
90
|
+
res = TypeAdapter(dict[Literal["error"], ErrorDetails2]).validate_json(response.text)
|
|
91
|
+
except ValueError:
|
|
92
|
+
return cls(code=response.status_code, message=response.text)
|
|
93
|
+
return res["error"]
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class FailedResponse2(HTTPResult2):
|
|
97
|
+
status_code: int
|
|
98
|
+
body: str
|
|
99
|
+
error: ErrorDetails2
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class BaseRequestMessage(BaseModel, ABC):
|
|
103
|
+
endpoint_url: str
|
|
104
|
+
method: Literal["GET", "POST", "PATCH", "DELETE", "PUT"]
|
|
105
|
+
connect_attempt: int = 0
|
|
106
|
+
read_attempt: int = 0
|
|
107
|
+
status_attempt: int = 0
|
|
108
|
+
api_version: str | None = None
|
|
109
|
+
disable_gzip: bool = False
|
|
110
|
+
content_length: int | None = None
|
|
111
|
+
content_type: str = "application/json"
|
|
112
|
+
accept: str = "application/json"
|
|
113
|
+
|
|
114
|
+
parameters: dict[str, PrimitiveType] | None = None
|
|
115
|
+
|
|
116
|
+
@property
|
|
117
|
+
def total_attempts(self) -> int:
|
|
118
|
+
return self.connect_attempt + self.read_attempt + self.status_attempt
|
|
119
|
+
|
|
120
|
+
@property
|
|
121
|
+
@abstractmethod
|
|
122
|
+
def content(self) -> str | bytes | None: ...
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class RequestMessage2(BaseRequestMessage):
|
|
126
|
+
data_content: bytes | None = None
|
|
127
|
+
body_content: dict[str, JsonValue] | None = None
|
|
128
|
+
|
|
129
|
+
@model_validator(mode="before")
|
|
130
|
+
def check_data_or_body(cls, values: dict[str, Any]) -> dict[str, Any]:
|
|
131
|
+
if values.get("data_content") is not None and values.get("body_content") is not None:
|
|
132
|
+
raise ValueError("Only one of data_content or body_content can be set.")
|
|
133
|
+
return values
|
|
134
|
+
|
|
135
|
+
@property
|
|
136
|
+
def content(self) -> str | bytes | None:
|
|
137
|
+
data: str | bytes | None = None
|
|
138
|
+
if self.data_content is not None:
|
|
139
|
+
data = self.data_content
|
|
140
|
+
if not global_config.disable_gzip and not self.disable_gzip:
|
|
141
|
+
data = gzip.compress(data)
|
|
142
|
+
elif self.body_content is not None:
|
|
143
|
+
# We serialize using pydantic instead of json.dumps. This is because pydantic is faster
|
|
144
|
+
# and handles more complex types such as datetime, float('nan'), etc.
|
|
145
|
+
data = _BODY_SERIALIZER.dump_json(self.body_content)
|
|
146
|
+
if not global_config.disable_gzip and not self.disable_gzip and isinstance(data, bytes):
|
|
147
|
+
data = gzip.compress(data)
|
|
148
|
+
return data
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
_BODY_SERIALIZER = TypeAdapter(dict[str, JsonValue])
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class ToolkitAPIError(Exception):
|
|
5
|
+
"""Base class for all exceptions raised by the Cognite Toolkit API client."""
|
|
6
|
+
|
|
7
|
+
def __init__(
|
|
8
|
+
self, message: str, missing: list[dict[str, Any]] | None = None, duplicated: list[dict[str, Any]] | None = None
|
|
9
|
+
) -> None:
|
|
10
|
+
super().__init__(message)
|
|
11
|
+
self.message = message
|
|
12
|
+
self.missing = missing
|
|
13
|
+
self.duplicated = duplicated
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"""Data classes for handling item-based requests and responses in the Cognite Toolkit HTTP client."""
|
|
2
|
+
|
|
3
|
+
import gzip
|
|
4
|
+
from collections import UserList
|
|
5
|
+
from collections.abc import Sequence
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from cognite.client import global_config
|
|
9
|
+
from pydantic import BaseModel, ConfigDict, Field, JsonValue
|
|
10
|
+
|
|
11
|
+
from cognite_toolkit._cdf_tk.client._resource_base import RequestItem
|
|
12
|
+
from cognite_toolkit._cdf_tk.client.http_client._data_classes2 import (
|
|
13
|
+
_BODY_SERIALIZER,
|
|
14
|
+
BaseRequestMessage,
|
|
15
|
+
ErrorDetails2,
|
|
16
|
+
)
|
|
17
|
+
from cognite_toolkit._cdf_tk.client.http_client._exception import ToolkitAPIError
|
|
18
|
+
from cognite_toolkit._cdf_tk.client.http_client._tracker import ItemsRequestTracker
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ItemsResultMessage2(BaseModel):
|
|
22
|
+
ids: list[str]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ItemsFailedRequest2(ItemsResultMessage2):
|
|
26
|
+
error_message: str
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ItemsSuccessResponse2(ItemsResultMessage2):
|
|
30
|
+
status_code: int
|
|
31
|
+
body: str
|
|
32
|
+
content: bytes
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class ItemsFailedResponse2(ItemsResultMessage2):
|
|
36
|
+
status_code: int
|
|
37
|
+
error: ErrorDetails2
|
|
38
|
+
body: str
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _set_default_tracker(data: dict[str, Any]) -> ItemsRequestTracker:
|
|
42
|
+
if "tracker" not in data or data["tracker"] is None:
|
|
43
|
+
return ItemsRequestTracker(data.get("max_failures_before_abort", 50))
|
|
44
|
+
return data["tracker"]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class ItemsRequest2(BaseRequestMessage):
|
|
48
|
+
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
49
|
+
items: Sequence[RequestItem]
|
|
50
|
+
extra_body_fields: dict[str, JsonValue] | None = None
|
|
51
|
+
max_failures_before_abort: int = 50
|
|
52
|
+
tracker: ItemsRequestTracker = Field(init=False, default_factory=_set_default_tracker, exclude=True)
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
def content(self) -> str | bytes | None:
|
|
56
|
+
body: dict[str, JsonValue] = {"items": [item.dump(camel_case=True) for item in self.items]}
|
|
57
|
+
if self.extra_body_fields:
|
|
58
|
+
body.update(self.extra_body_fields)
|
|
59
|
+
res = _BODY_SERIALIZER.dump_json(body)
|
|
60
|
+
if not global_config.disable_gzip and not self.disable_gzip and isinstance(res, bytes):
|
|
61
|
+
return gzip.compress(res)
|
|
62
|
+
return res
|
|
63
|
+
|
|
64
|
+
def split(self, status_attempts: int) -> list["ItemsRequest2"]:
|
|
65
|
+
"""Split the request into multiple requests with a single item each."""
|
|
66
|
+
mid = len(self.items) // 2
|
|
67
|
+
if mid == 0:
|
|
68
|
+
return [self]
|
|
69
|
+
self.tracker.register_failure()
|
|
70
|
+
messages: list[ItemsRequest2] = []
|
|
71
|
+
for part in (self.items[:mid], self.items[mid:]):
|
|
72
|
+
new_request = self.model_copy(update={"items": part, "status_attempt": status_attempts})
|
|
73
|
+
new_request.tracker = self.tracker
|
|
74
|
+
messages.append(new_request)
|
|
75
|
+
return messages
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class ItemResponse(BaseModel):
|
|
79
|
+
items: list[dict[str, JsonValue]]
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class ItemsResultList(UserList[ItemsResultMessage2]):
|
|
83
|
+
def __init__(self, collection: Sequence[ItemsResultMessage2] | None = None) -> None:
|
|
84
|
+
super().__init__(collection or [])
|
|
85
|
+
|
|
86
|
+
def raise_for_status(self) -> None:
|
|
87
|
+
"""Raises an exception if any response in the list indicates a failure."""
|
|
88
|
+
failed_responses = [resp for resp in self.data if isinstance(resp, ItemsFailedResponse2)]
|
|
89
|
+
failed_requests = [resp for resp in self.data if isinstance(resp, ItemsFailedRequest2)]
|
|
90
|
+
if not failed_responses and not failed_requests:
|
|
91
|
+
return
|
|
92
|
+
error_messages = "; ".join(f"Status {err.status_code}: {err.error.message}" for err in failed_responses)
|
|
93
|
+
if failed_requests:
|
|
94
|
+
if error_messages:
|
|
95
|
+
error_messages += "; "
|
|
96
|
+
error_messages += "; ".join(f"Request error: {err.error_message}" for err in failed_requests)
|
|
97
|
+
raise ToolkitAPIError(f"One or more requests failed: {error_messages}")
|
|
98
|
+
|
|
99
|
+
@property
|
|
100
|
+
def has_failed(self) -> bool:
|
|
101
|
+
"""Indicates whether any response in the list indicates a failure.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
bool: True if there are any failed responses or requests, False otherwise.
|
|
105
|
+
"""
|
|
106
|
+
for resp in self.data:
|
|
107
|
+
if isinstance(resp, ItemsFailedResponse2 | ItemsFailedRequest2):
|
|
108
|
+
return True
|
|
109
|
+
return False
|
|
110
|
+
|
|
111
|
+
def get_items(self) -> list[dict[str, JsonValue]]:
|
|
112
|
+
"""Get the items from all successful responses."""
|
|
113
|
+
items: list[dict[str, JsonValue]] = []
|
|
114
|
+
for resp in self.data:
|
|
115
|
+
if isinstance(resp, ItemsSuccessResponse2):
|
|
116
|
+
body_json = ItemResponse.model_validate_json(resp.body)
|
|
117
|
+
items.extend(body_json.items)
|
|
118
|
+
return items
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, ConfigDict
|
|
4
|
+
from pydantic.alias_generators import to_camel
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class BaseModelRequest(BaseModel):
|
|
8
|
+
"""Base class for all object. This includes resources and nested objects."""
|
|
9
|
+
|
|
10
|
+
model_config = ConfigDict(alias_generator=to_camel, extra="ignore", populate_by_name=True)
|
|
11
|
+
|
|
12
|
+
def dump(self, camel_case: bool = True) -> dict[str, Any]:
|
|
13
|
+
"""Dump the object to a dictionary.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
camel_case (bool): Whether to use camelCase for the keys. Default is True.
|
|
17
|
+
|
|
18
|
+
"""
|
|
19
|
+
return self.model_dump(mode="json", by_alias=camel_case, exclude_unset=True)
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
from typing import Any, Literal
|
|
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
|
|
8
|
+
from cognite_toolkit._cdf_tk.client.resource_classes.identifiers import ExternalId, InternalId
|
|
9
|
+
|
|
10
|
+
from .base import BaseModelRequest
|
|
11
|
+
|
|
12
|
+
if sys.version_info >= (3, 11):
|
|
13
|
+
from typing import Self
|
|
14
|
+
else:
|
|
15
|
+
from typing_extensions import Self
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class Filter(BaseModelRequest): ...
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ClassicFilter(Filter):
|
|
22
|
+
asset_subtree_ids: list[ExternalId | InternalId] | None = None
|
|
23
|
+
data_set_ids: list[ExternalId | InternalId] | None = None
|
|
24
|
+
|
|
25
|
+
@classmethod
|
|
26
|
+
def from_asset_subtree_and_data_sets(
|
|
27
|
+
cls,
|
|
28
|
+
asset_subtree_id: str | int | list[str | int] | None = None,
|
|
29
|
+
data_set_id: str | int | list[str | int] | None = None,
|
|
30
|
+
) -> Self:
|
|
31
|
+
return cls(
|
|
32
|
+
asset_subtree_ids=cls._as_internal_or_external_id_list(asset_subtree_id),
|
|
33
|
+
data_set_ids=cls._as_internal_or_external_id_list(data_set_id),
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def _as_internal_or_external_id_list(
|
|
38
|
+
cls, id: str | int | list[str | int] | None
|
|
39
|
+
) -> list[ExternalId | InternalId] | None:
|
|
40
|
+
if id is None:
|
|
41
|
+
return None
|
|
42
|
+
ids = id if isinstance(id, list) else [id]
|
|
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
|
+
"""
|