From f01dbc0cbc04c317b2341ad7afe57a191a8d6dd2 Mon Sep 17 00:00:00 2001 From: Vincent <48801276+vincent-cognite@users.noreply.github.com> Date: Fri, 30 Aug 2024 15:48:57 +0200 Subject: [PATCH 01/15] workflow_orchestration is now data_workflows rst and add trigger doc (#1895) --- CHANGELOG.md | 4 +++ cognite/client/_version.py | 2 +- cognite/client/data_classes/workflows.py | 29 ++++++++++++++----- ...w_orchestration.rst => data_workflows.rst} | 17 +++++++++++ docs/source/index.rst | 2 +- pyproject.toml | 2 +- .../test_api/test_data_workflows.py | 4 +-- 7 files changed, 47 insertions(+), 13 deletions(-) rename docs/source/{workflow_orchestration.rst => data_workflows.rst} (76%) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb0d1dc04..1340b161b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,10 @@ Changes are grouped as follows - `Fixed` for any bug fixes. - `Security` in case of vulnerabilities. +## [7.55.2] - 2024-08-29 +### Fixed +- Turn workflow_orchestration into data_workflows and add trigger doc, fix attribute names in data classes + ## [7.55.1] - 2024-08-29 ### Fixed - Missing exports for workflow triggers diff --git a/cognite/client/_version.py b/cognite/client/_version.py index edd6657ff..a2f3828ca 100644 --- a/cognite/client/_version.py +++ b/cognite/client/_version.py @@ -1,4 +1,4 @@ from __future__ import annotations -__version__ = "7.55.1" +__version__ = "7.55.2" __api_subversion__ = "20230101" diff --git a/cognite/client/data_classes/workflows.py b/cognite/client/data_classes/workflows.py index 90410888f..26f13eb6e 100644 --- a/cognite/client/data_classes/workflows.py +++ b/cognite/client/data_classes/workflows.py @@ -1381,23 +1381,33 @@ class WorkflowTriggerRun(CogniteResource): def __init__( self, - trigger_external_id: str, - trigger_fire_time: int, + external_id: str, + fire_time: int, workflow_external_id: str, workflow_version: str, + workflow_execution_id: str, + status: Literal["success", "failed"], + reason_for_failure: str | None = None, ) -> None: - self.trigger_external_id = trigger_external_id - self.trigger_fire_time = trigger_fire_time + self.external_id = external_id + self.fire_time = fire_time self.workflow_external_id = workflow_external_id self.workflow_version = workflow_version + self.workflow_execution_id = workflow_execution_id + self.status = status + self.reason_for_failure = reason_for_failure def dump(self, camel_case: bool = True) -> dict[str, Any]: item = { - "trigger_external_id": self.trigger_external_id, - "trigger_fire_time": self.trigger_fire_time, + "external_id": self.external_id, + "fire_time": self.fire_time, "workflow_external_id": self.workflow_external_id, "workflow_version": self.workflow_version, + "workflow_execution_id": self.workflow_execution_id, + "status": self.status, } + if self.reason_for_failure: + item["reason_for_failure"] = self.reason_for_failure if camel_case: return convert_all_keys_to_camel_case(item) return item @@ -1405,10 +1415,13 @@ def dump(self, camel_case: bool = True) -> dict[str, Any]: @classmethod def _load(cls, resource: dict, cognite_client: CogniteClient | None = None) -> WorkflowTriggerRun: return cls( - trigger_external_id=resource["triggerExternalId"], - trigger_fire_time=resource["triggerFireTime"], + external_id=resource["externalId"], + fire_time=resource["fireTime"], workflow_external_id=resource["workflowExternalId"], workflow_version=resource["workflowVersion"], + workflow_execution_id=resource["workflowExecutionId"], + status=resource["status"], + reason_for_failure=resource.get("reasonForFailure"), ) diff --git a/docs/source/workflow_orchestration.rst b/docs/source/data_workflows.rst similarity index 76% rename from docs/source/workflow_orchestration.rst rename to docs/source/data_workflows.rst index 002395270..81bcc3a3e 100644 --- a/docs/source/workflow_orchestration.rst +++ b/docs/source/data_workflows.rst @@ -71,6 +71,23 @@ Update Status of Async Task ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. automethod:: cognite.client._api.workflows.WorkflowTaskAPI.update +Workflow Triggers +------------------- +Create triggers for workflow executions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. automethod:: cognite.client._api.workflows.WorkflowTriggerAPI.create + +Delete triggers for workflow executions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. automethod:: cognite.client._api.workflows.WorkflowTriggerAPI.delete + +Get triggers for workflow executions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. automethod:: cognite.client._api.workflows.WorkflowTriggerAPI.get_triggers + +Get trigger run history for a workflow trigger +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. automethod:: cognite.client._api.workflows.WorkflowTriggerAPI.get_trigger_run_history Data Workflows data classes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/source/index.rst b/docs/source/index.rst index 2c6883410..f8d2044fc 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -53,7 +53,7 @@ Contents data_organization transformations functions - workflow_orchestration + data_workflows unit_catalog filters deprecated diff --git a/pyproject.toml b/pyproject.toml index a3566ee1b..f2c757338 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "cognite-sdk" -version = "7.55.1" +version = "7.55.2" description = "Cognite Python SDK" readme = "README.md" documentation = "https://cognite-sdk-python.readthedocs-hosted.com" diff --git a/tests/tests_integration/test_api/test_data_workflows.py b/tests/tests_integration/test_api/test_data_workflows.py index 9a3c0f30b..7b87f44a7 100644 --- a/tests/tests_integration/test_api/test_data_workflows.py +++ b/tests/tests_integration/test_api/test_data_workflows.py @@ -253,7 +253,7 @@ def workflow_scheduled_trigger(cognite_client: CogniteClient, add_multiply_workf trigger = cognite_client.workflows.triggers.create( WorkflowTriggerCreate( external_id="integration_test-workflow-scheduled-trigger", - trigger_rule=WorkflowScheduledTriggerRule(cron_expression="0 0 * * *"), + trigger_rule=WorkflowScheduledTriggerRule(cron_expression="* * * * *"), workflow_external_id="integration_test-workflow-add_multiply", workflow_version="1", input={"a": 1, "b": 2}, @@ -490,7 +490,7 @@ def test_create_delete( ) -> None: assert workflow_scheduled_trigger is not None assert workflow_scheduled_trigger.external_id == "integration_test-workflow-scheduled-trigger" - assert workflow_scheduled_trigger.trigger_rule == WorkflowScheduledTriggerRule(cron_expression="0 0 * * *") + assert workflow_scheduled_trigger.trigger_rule == WorkflowScheduledTriggerRule(cron_expression="* * * * *") assert workflow_scheduled_trigger.workflow_external_id == "integration_test-workflow-add_multiply" assert workflow_scheduled_trigger.workflow_version == "1" assert workflow_scheduled_trigger.input == {"a": 1, "b": 2} From 7e3c677bb653c35c84daea3fd771cd1d6ad4b4e7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2024 07:53:45 +0200 Subject: [PATCH 02/15] chore(deps): lock file maintenance (#1901) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/poetry.lock b/poetry.lock index 43f6bc5e2..24b9b0b2c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -132,13 +132,13 @@ tzdata = ["tzdata"] [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] @@ -589,13 +589,13 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "executing" -version = "2.0.1" +version = "2.1.0" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, ] [package.extras] @@ -1672,22 +1672,22 @@ wcwidth = "*" [[package]] name = "protobuf" -version = "5.27.4" +version = "5.28.0" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-5.27.4-cp310-abi3-win32.whl", hash = "sha256:10319748764b917a9a7cddef1582a0a9cd0f8f6d04e545c6236f7ccaf9b624d9"}, - {file = "protobuf-5.27.4-cp310-abi3-win_amd64.whl", hash = "sha256:f0c24374aaaf103f33662e4de7666a4a4280abebdb8a9f3f0f9b1d71b61174ec"}, - {file = "protobuf-5.27.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e85fed07013e5a0121efbaf1b14355fdc66f6e545f12fc5985b2882370410006"}, - {file = "protobuf-5.27.4-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:d5a0e229061600842e57af4ff6a8522ede5280bcfa4fe7f3a1c20589377859a6"}, - {file = "protobuf-5.27.4-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:25ba1f0633f73c3939f3b84e1636f3eb3bab7196952ebb83906d56945edd6aa8"}, - {file = "protobuf-5.27.4-cp38-cp38-win32.whl", hash = "sha256:565b051249a2f8270af04206dd4f3b73a02343e7d9e072aed57441b369b3467d"}, - {file = "protobuf-5.27.4-cp38-cp38-win_amd64.whl", hash = "sha256:e673f173cbac4e59c7817ed358e471e4c77aa9166986edf3e731156379a556c7"}, - {file = "protobuf-5.27.4-cp39-cp39-win32.whl", hash = "sha256:25169c7624d5a9e669fa6faff5a6e818f854346d51ee347b2284676beb9e85dd"}, - {file = "protobuf-5.27.4-cp39-cp39-win_amd64.whl", hash = "sha256:1fe7735902e84ce35c4152cf07981c176713935a8efad78cea547aae5f4f75cb"}, - {file = "protobuf-5.27.4-py3-none-any.whl", hash = "sha256:b97259641e8d38738eef34a173e51d2d53a453baab01a32477a64752d9ce59a3"}, - {file = "protobuf-5.27.4.tar.gz", hash = "sha256:eaa1016e353d8fc5bf08c8087e96eed15f5297aa52bb7ee1f533278bb3f3aad7"}, + {file = "protobuf-5.28.0-cp310-abi3-win32.whl", hash = "sha256:66c3edeedb774a3508ae70d87b3a19786445fe9a068dd3585e0cefa8a77b83d0"}, + {file = "protobuf-5.28.0-cp310-abi3-win_amd64.whl", hash = "sha256:6d7cc9e60f976cf3e873acb9a40fed04afb5d224608ed5c1a105db4a3f09c5b6"}, + {file = "protobuf-5.28.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:532627e8fdd825cf8767a2d2b94d77e874d5ddb0adefb04b237f7cc296748681"}, + {file = "protobuf-5.28.0-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:018db9056b9d75eb93d12a9d35120f97a84d9a919bcab11ed56ad2d399d6e8dd"}, + {file = "protobuf-5.28.0-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:6206afcb2d90181ae8722798dcb56dc76675ab67458ac24c0dd7d75d632ac9bd"}, + {file = "protobuf-5.28.0-cp38-cp38-win32.whl", hash = "sha256:eef7a8a2f4318e2cb2dee8666d26e58eaf437c14788f3a2911d0c3da40405ae8"}, + {file = "protobuf-5.28.0-cp38-cp38-win_amd64.whl", hash = "sha256:d001a73c8bc2bf5b5c1360d59dd7573744e163b3607fa92788b7f3d5fefbd9a5"}, + {file = "protobuf-5.28.0-cp39-cp39-win32.whl", hash = "sha256:dde9fcaa24e7a9654f4baf2a55250b13a5ea701493d904c54069776b99a8216b"}, + {file = "protobuf-5.28.0-cp39-cp39-win_amd64.whl", hash = "sha256:853db610214e77ee817ecf0514e0d1d052dff7f63a0c157aa6eabae98db8a8de"}, + {file = "protobuf-5.28.0-py3-none-any.whl", hash = "sha256:510ed78cd0980f6d3218099e874714cdf0d8a95582e7b059b06cabad855ed0a0"}, + {file = "protobuf-5.28.0.tar.gz", hash = "sha256:dde74af0fa774fa98892209992295adbfb91da3fa98c8f67a88afe8f5a349add"}, ] [[package]] From 95178fdbeb8011ce8cb8eb640613939782aeaf17 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2024 06:14:22 +0000 Subject: [PATCH 03/15] chore(deps): update pre-commit hook astral-sh/ruff-pre-commit to v0.6.3 (#1900) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f39b5f2c5..e3667cdec 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ --- repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.2 + rev: v0.6.3 hooks: - id: ruff args: From bdde64c8c9baf65149e2b6c503e487d774ecd0fa Mon Sep 17 00:00:00 2001 From: olacognite <31041282+olacognite@users.noreply.github.com> Date: Tue, 3 Sep 2024 07:23:34 +0200 Subject: [PATCH 04/15] enable diagram detect based on file instance id (#1887) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ola Liabøtrø Co-authored-by: Anders Albert <60234212+doctrino@users.noreply.github.com> --- CHANGELOG.md | 4 + cognite/client/_api/diagrams.py | 29 +++++- cognite/client/_version.py | 2 +- .../client/data_classes/contextualization.py | 20 ++-- pyproject.toml | 2 +- tests/data/mypnid.pdf | Bin 0 -> 437752 bytes .../test_api/test_diagrams.py | 94 ++++++++++++++++-- 7 files changed, 129 insertions(+), 22 deletions(-) create mode 100644 tests/data/mypnid.pdf diff --git a/CHANGELOG.md b/CHANGELOG.md index 1340b161b..00c6cbaa5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,10 @@ Changes are grouped as follows - `Fixed` for any bug fixes. - `Security` in case of vulnerabilities. +## [7.56.0] - 2024-09-02 +### Added +- Support for referencing files by instance id when running diagrams.detect + ## [7.55.2] - 2024-08-29 ### Fixed - Turn workflow_orchestration into data_workflows and add trigger doc, fix attribute names in data classes diff --git a/cognite/client/_api/diagrams.py b/cognite/client/_api/diagrams.py index 3c3066f64..01da62154 100644 --- a/cognite/client/_api/diagrams.py +++ b/cognite/client/_api/diagrams.py @@ -15,6 +15,7 @@ FileReference, T_ContextualizationJob, ) +from cognite.client.data_classes.data_modeling import NodeId from cognite.client.exceptions import CogniteAPIError, CogniteMissingClientError from cognite.client.utils._experimental import FeaturePreviewWarning from cognite.client.utils._text import to_camel_case @@ -92,24 +93,37 @@ def _list_from_instance_or_list( def _process_file_ids( ids: Sequence[int] | int | None, external_ids: SequenceNotStr[str] | str | None, + instance_ids: Sequence[NodeId] | NodeId | None, file_references: Sequence[FileReference] | FileReference | None, - ) -> list[dict[str, int | str | dict[str, int]] | dict[str, str] | dict[str, int]]: + ) -> list[ + dict[str, int | str | dict[str, str] | dict[str, int]] + | dict[str, dict[str, str]] + | dict[str, str] + | dict[str, int] + ]: ids = DiagramsAPI._list_from_instance_or_list(ids, int, "ids must be int or list of int") external_ids = cast( SequenceNotStr[str], DiagramsAPI._list_from_instance_or_list(external_ids, str, "external_ids must be str or list of str"), ) + instance_ids = DiagramsAPI._list_from_instance_or_list( + instance_ids, NodeId, "instance_ids must be NodeId or list of NodeId" + ) file_references = DiagramsAPI._list_from_instance_or_list( file_references, FileReference, "file_references must be FileReference or list of FileReference" ) # Handle empty lists - if not (external_ids or ids or file_references): + if not (external_ids or ids or instance_ids or file_references): raise ValueError("No ids, external ids or file references specified") id_objs = [{"fileId": id} for id in ids] external_id_objs = [{"fileExternalId": external_id} for external_id in external_ids] + instance_id_objs = [ + {"fileInstanceId": instance_id.dump(camel_case=True, include_instance_type=False)} + for instance_id in instance_ids + ] file_reference_objects = [file_reference.to_api_item() for file_reference in file_references] - return [*id_objs, *external_id_objs, *file_reference_objects] + return [*id_objs, *external_id_objs, *instance_id_objs, *file_reference_objects] @overload def detect( @@ -120,6 +134,7 @@ def detect( min_tokens: int = 2, file_ids: int | Sequence[int] | None = None, file_external_ids: str | SequenceNotStr[str] | None = None, + file_instance_ids: NodeId | Sequence[NodeId] | None = None, file_references: list[FileReference] | FileReference | None = None, pattern_mode: bool = False, configuration: dict[str, Any] | None = None, @@ -136,6 +151,7 @@ def detect( min_tokens: int = 2, file_ids: int | Sequence[int] | None = None, file_external_ids: str | SequenceNotStr[str] | None = None, + file_instance_ids: NodeId | Sequence[NodeId] | None = None, file_references: list[FileReference] | FileReference | None = None, pattern_mode: bool = False, configuration: DiagramDetectConfig | dict[str, Any] | None = None, @@ -152,6 +168,7 @@ def detect( min_tokens: int = 2, file_ids: int | Sequence[int] | None = None, file_external_ids: str | SequenceNotStr[str] | None = None, + file_instance_ids: NodeId | Sequence[NodeId] | None = None, file_references: list[FileReference] | FileReference | None = None, pattern_mode: bool = False, configuration: DiagramDetectConfig | dict[str, Any] | None = None, @@ -165,6 +182,7 @@ def detect( min_tokens: int = 2, file_ids: int | Sequence[int] | None = None, file_external_ids: str | SequenceNotStr[str] | None = None, + file_instance_ids: NodeId | Sequence[NodeId] | None = None, file_references: list[FileReference] | FileReference | None = None, pattern_mode: bool | None = None, configuration: DiagramDetectConfig | dict[str, Any] | None = None, @@ -184,7 +202,8 @@ def detect( min_tokens (int): Minimal number of tokens a match must be based on file_ids (int | Sequence[int] | None): ID of the files, should already be uploaded in the same tenant. file_external_ids (str | SequenceNotStr[str] | None): File external ids, alternative to file_ids and file_references. - file_references (list[FileReference] | FileReference | None): File references (id or external_id), and first_page and last_page to specify page ranges per file. Each reference can specify up to 50 pages. Providing a page range will also make the page count of the document a part of the response. + file_instance_ids (NodeId | Sequence[NodeId] | None): Files to detect in, specified by instance id. + file_references (list[FileReference] | FileReference | None): File references (id, external_id or instance_id), and first_page and last_page to specify page ranges per file. Each reference can specify up to 50 pages. Providing a page range will also make the page count of the document a part of the response. pattern_mode (bool | None): If True, entities must be provided with a sample field. This enables detecting tags that are similar to the sample, but not necessarily identical. Defaults to None. configuration (DiagramDetectConfig | dict[str, Any] | None): Additional configuration for the detect algorithm. See `DiagramDetectConfig` class documentation and `beta API docs `_. multiple_jobs (bool): Enables you to publish multiple jobs. If True the method returns a tuple of DetectJobBundle and list of potentially unposted files. If False it will return a single DiagramDetectResults. Defaults to False. @@ -258,7 +277,7 @@ def detect( Check the documentation for `DiagramDetectConfig` for more information on the available options. """ - items = self._process_file_ids(file_ids, file_external_ids, file_references) + items = self._process_file_ids(file_ids, file_external_ids, file_instance_ids, file_references) entities = [ entity.dump(camel_case=True) if isinstance(entity, CogniteResource) else entity for entity in entities ] diff --git a/cognite/client/_version.py b/cognite/client/_version.py index a2f3828ca..c46b0a1bc 100644 --- a/cognite/client/_version.py +++ b/cognite/client/_version.py @@ -1,4 +1,4 @@ from __future__ import annotations -__version__ = "7.55.2" +__version__ = "7.56.0" __api_subversion__ = "20230101" diff --git a/cognite/client/data_classes/contextualization.py b/cognite/client/data_classes/contextualization.py index a82080deb..ad056330c 100644 --- a/cognite/client/data_classes/contextualization.py +++ b/cognite/client/data_classes/contextualization.py @@ -26,6 +26,7 @@ ) from cognite.client.data_classes.annotation_types.primitives import VisionResource from cognite.client.data_classes.annotations import AnnotationList +from cognite.client.data_classes.data_modeling import NodeId from cognite.client.exceptions import CogniteAPIError, CogniteException, ModelFailedException from cognite.client.utils._auxiliary import convert_true_match, exactly_one_is_not_none, load_resource from cognite.client.utils._text import convert_all_keys_to_snake_case, to_camel_case, to_snake_case @@ -356,24 +357,29 @@ def __init__( self, file_id: int | None = None, file_external_id: str | None = None, + file_instance_id: NodeId | None = None, first_page: int | None = None, last_page: int | None = None, ) -> None: self.file_id = file_id self.file_external_id = file_external_id + self.file_instance_id = file_instance_id self.first_page = first_page self.last_page = last_page - if not exactly_one_is_not_none(file_id, file_external_id): - raise ValueError("Exactly one of file_id and file_external_id must be set for a file reference") + if not exactly_one_is_not_none(file_id, file_external_id, file_instance_id): + raise ValueError("File references must have exactly one of file_id, file_external_id and file_instance_id.") if exactly_one_is_not_none(first_page, last_page): raise ValueError("If the page range feature is used, both first page and last page must be set") - def to_api_item(self) -> dict[str, str | int | dict[str, int]]: - if self.file_id is None and self.file_external_id is not None: - item: dict[str, str | int | dict[str, int]] = {"fileExternalId": self.file_external_id} - if self.file_id is not None and self.file_external_id is None: + def to_api_item(self) -> dict[str, str | int | dict[str, int] | dict[str, str]]: + if self.file_id is None and self.file_external_id is not None and self.file_instance_id is None: + item: dict[str, str | int | dict[str, int] | dict[str, str]] = {"fileExternalId": self.file_external_id} + if self.file_id is not None and self.file_external_id is None and self.file_instance_id is None: item = {"fileId": self.file_id} + if self.file_id is None and self.file_external_id is None and self.file_instance_id is not None: + item = {"fileInstanceId": self.file_instance_id.dump(include_instance_type=False)} + if self.first_page is not None and self.last_page is not None: item["pageRange"] = {"begin": self.first_page, "end": self.last_page} return item @@ -472,6 +478,7 @@ def __init__( self, file_id: int | None = None, file_external_id: str | None = None, + file_instance_id: dict[str, str] | None = None, annotations: list | None = None, error_message: str | None = None, cognite_client: CogniteClient | None = None, @@ -480,6 +487,7 @@ def __init__( ) -> None: self.file_id = file_id self.file_external_id = file_external_id + self.file_instance_id = file_instance_id self.annotations = annotations self.error_message = error_message self._cognite_client = cast("CogniteClient", cognite_client) diff --git a/pyproject.toml b/pyproject.toml index f2c757338..c64b5c137 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "cognite-sdk" -version = "7.55.2" +version = "7.56.0" description = "Cognite Python SDK" readme = "README.md" documentation = "https://cognite-sdk-python.readthedocs-hosted.com" diff --git a/tests/data/mypnid.pdf b/tests/data/mypnid.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4e6c7e15bb455e0a54b9641ab50ef1faca5556b3 GIT binary patch literal 437752 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 z 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 int: + file = cognite_client.files.retrieve(external_id=PNID_FILE_EXTERNAL_ID) + + if file is None: + file = cognite_client.files.upload( + path="tests/data/mypnid.pdf", + external_id=PNID_FILE_EXTERNAL_ID, + name="mypnid.pdf", + mime_type="application/pdf", + ) + cognite_client.files.upload() + return file.id + + +@pytest.fixture(scope="session") +def diagram_space(cognite_client: CogniteClient) -> Space: + return cognite_client.data_modeling.spaces.apply(SpaceApply(space=DIAGRAM_SPACE)) + + +@pytest.fixture(scope="session") +def diagram_node(cognite_client: CogniteClient, pnid_file_id: int, diagram_space: Space) -> NodeId: + file = cognite_client.files.retrieve(id=pnid_file_id) + assert file is not None + + diagram_node_id = ( + cognite_client.data_modeling.instances.apply( + NodeApply( + space=diagram_space.space, + external_id=PNID_FILE_EXTERNAL_ID, + sources=[ + NodeOrEdgeData( + source=ViewId(space=CDM_SPACE, external_id=COGNITE_FILE, version="v1"), + properties={ + "name": file.name, + "mimeType": file.mime_type, + }, + ) + ], + ) + ) + .nodes[0] + .as_id() + ) + + node_file = cognite_client.files.retrieve(instance_id=diagram_node_id) + # Create the file if not existing already + if node_file is None or node_file.uploaded is False: + cognite_client.files.upload_content_bytes( + content=cognite_client.files.download_bytes(id=file.id), instance_id=diagram_node_id + ) + return diagram_node_id + + class TestPNIDParsingIntegration: @pytest.mark.skip - def test_run_diagram_detect(self, cognite_client): + def test_run_diagram_detect(self, cognite_client: CogniteClient, pnid_file_id: int): entities = [{"name": "YT-96122"}, {"name": "XE-96125", "ee": 123}, {"name": "XWDW-9615"}] - file_id = PNID_FILE_ID - detect_job = cognite_client.diagrams.detect(file_ids=[file_id], entities=entities) + + detect_job = cognite_client.diagrams.detect(file_ids=[pnid_file_id], entities=entities) assert isinstance(detect_job, DiagramDetectResults) assert {"statusCount", "numFiles", "items", "partialMatch", "minTokens", "searchField"}.issubset( detect_job.result @@ -30,10 +90,10 @@ def test_run_diagram_detect(self, cognite_client): assert "Completed" == detect_job.status assert [] == detect_job.errors assert isinstance(detect_job.items[0], DiagramDetectItem) - assert isinstance(detect_job[PNID_FILE_ID], DiagramDetectItem) + assert isinstance(detect_job[pnid_file_id], DiagramDetectItem) - assert 3 == len(detect_job[PNID_FILE_ID].annotations) - for annotation in detect_job[PNID_FILE_ID].annotations: + assert 3 == len(detect_job[pnid_file_id].annotations) + for annotation in detect_job[pnid_file_id].annotations: assert 1 == annotation["region"]["page"] convert_job = detect_job.convert() @@ -44,14 +104,14 @@ def test_run_diagram_detect(self, cognite_client): assert {"pngUrl", "svgUrl", "page"}.issubset(convert_job.result["items"][0]["results"][0]) assert "Completed" == convert_job.status - for res_page in convert_job[PNID_FILE_ID].pages: + for res_page in convert_job[pnid_file_id].pages: assert 1 == res_page.page assert ".svg" in res_page.svg_url assert ".png" in res_page.png_url # Enable multiple jobs job_bundle, _unposted_jobs = cognite_client.diagrams.detect( - file_ids=[file_id], entities=entities, multiple_jobs=True + file_ids=[pnid_file_id], entities=entities, multiple_jobs=True ) assert isinstance(job_bundle, DetectJobBundle) succeeded, failed = job_bundle.result @@ -103,3 +163,19 @@ def test_run_diagram_detect_in_pattern_mode(self, cognite_client): assert len(detected_by_resource_type["file_reference"]) >= 10 # 14 seen when making the test assert len(detected_by_resource_type["instrument"]) >= 60 # 72 seen when making the test + + def test_run_diagram_detect_with_file_instance_id(self, cognite_client, diagram_node: NodeId): + entities = [{"name": "YT-96122"}, {"name": "XE-96125", "ee": 123}, {"name": "XWDW-9615"}] + + detect_job = cognite_client.diagrams.detect(file_instance_ids=[diagram_node], entities=entities) + assert isinstance(detect_job, DiagramDetectResults) + assert {"statusCount", "numFiles", "items", "partialMatch", "minTokens", "searchField"}.issubset( + detect_job.result + ) + assert {"fileId", "fileInstanceId", "annotations"}.issubset(detect_job.result["items"][0]) + assert "Completed" == detect_job.status + assert [] == detect_job.errors + assert isinstance(detect_job.items[0], DiagramDetectItem) + assert detect_job.items[0].file_instance_id == diagram_node.dump(include_instance_type=False) + + assert len(detect_job.items[0].annotations) > 0 From 8ff7c8c4dff5b13a8eace60bc2a80b91200e46a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nina=20=C3=98deg=C3=A5rd?= Date: Tue, 3 Sep 2024 10:11:08 +0200 Subject: [PATCH 05/15] feat: adding load method to CogniteClient, GlobalConfig, ClientConfig, and CredentialProviders (#1859) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Håkon V. Treider --- .github/workflows/build.yml | 9 +- .github/workflows/release.yaml | 3 +- CHANGELOG.md | 9 +- CONTRIBUTING.md | 10 + cognite/client/_api/raw.py | 2 +- cognite/client/_cognite_client.py | 36 ++- cognite/client/_version.py | 2 +- cognite/client/config.py | 101 ++++++++ cognite/client/credentials.py | 227 +++++++++++++++++- cognite/client/data_classes/_base.py | 16 +- .../data_classes/data_modeling/instances.py | 4 +- cognite/client/data_classes/datapoints.py | 6 +- cognite/client/data_classes/workflows.py | 3 +- cognite/client/utils/_auxiliary.py | 12 + docs/source/cognite_client.rst | 2 + docs/source/conf.py | 2 +- docs/source/conftest.py | 48 ++++ docs/source/quickstart.rst | 170 ++++++++++--- pyproject.toml | 2 +- pytest.ini | 6 +- tests/tests_unit/conftest.py | 3 + tests/tests_unit/test_cognite_client.py | 25 ++ tests/tests_unit/test_config.py | 102 ++++++++ tests/tests_unit/test_credential_providers.py | 208 ++++++++++++++-- tests/tests_unit/test_docstring_examples.py | 26 +- tests/tests_unit/test_utils/test_auxiliary.py | 22 ++ 26 files changed, 976 insertions(+), 80 deletions(-) create mode 100644 docs/source/conftest.py create mode 100644 tests/tests_unit/test_config.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b51dc86ae..e99293a37 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v4 - uses: ./.github/actions/setup with: - extras: '-E pandas' + extras: "-E pandas" - name: Linting and static code checks run: pre-commit run --all-files @@ -46,13 +46,13 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest] - python-version: ['3.8', '3.11', '3.12'] # TODO: 3.9, 3.10 (requires a lot of work for FakeCogResGen for tests) + python-version: ["3.8", "3.11", "3.12"] # TODO: 3.9, 3.10 (requires a lot of work for FakeCogResGen for tests) steps: - uses: actions/checkout@v4 - uses: ./.github/actions/setup with: python_version: ${{ matrix.python-version }} - extras: '-E all' + extras: "-E all" - name: Test full env: @@ -64,7 +64,8 @@ jobs: COGNITE_PROJECT: python-sdk-test COGNITE_BASE_URL: https://greenfield.cognitedata.com COGNITE_CLIENT_NAME: python-sdk-integration-tests - run: pytest tests --durations=10 --cov --cov-report term --cov-report xml:coverage.xml -n8 --dist loadscope --reruns 2 --maxfail 20 + # Testpaths are defined in the pytest.ini file: + run: pytest --durations=10 --cov --cov-report term --cov-report xml:coverage.xml -n8 --dist loadscope --reruns 2 --maxfail 20 - uses: codecov/codecov-action@v4 if: matrix.os == 'windows-latest' && matrix.python-version == '3.8' diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 4e65a4dad..fc6de2fed 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -25,7 +25,8 @@ jobs: COGNITE_PROJECT: python-sdk-test COGNITE_BASE_URL: https://greenfield.cognitedata.com COGNITE_CLIENT_NAME: python-sdk-integration-tests - run: pytest tests --durations=10 --cov --cov-report term --cov-report xml:coverage.xml -n8 --dist loadscope --reruns 2 --maxfail 20 + # Testpaths are defined in the pytest.ini file: + run: pytest --durations=10 --cov --cov-report term --cov-report xml:coverage.xml -n8 --dist loadscope --reruns 2 --maxfail 20 - uses: codecov/codecov-action@v4 with: diff --git a/CHANGELOG.md b/CHANGELOG.md index 00c6cbaa5..fe3808ce6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,11 @@ Changes are grouped as follows - `Fixed` for any bug fixes. - `Security` in case of vulnerabilities. +## [7.57.0] - 2024-09-03 +### Added +- Add a `load` method to CogniteClient, ClientConfig, and CredenitalProvider (and all it's subclasses). +- Add `apply_settings` method to `global_config` to pass in a dict of settings + ## [7.56.0] - 2024-09-02 ### Added - Support for referencing files by instance id when running diagrams.detect @@ -27,12 +32,12 @@ Changes are grouped as follows ## [7.55.1] - 2024-08-29 ### Fixed -- Missing exports for workflow triggers +- Missing exports for workflow triggers ## [7.55.0] - 2024-08-23 ### Added - Support for creating a session using a one-shot token in the `client.iam.session.create` method. -- Parameter `nonce` to the `client.functions.call()` and `client.workflow.executions.run()` methods to allow passing +- Parameter `nonce` to the `client.functions.call()` and `client.workflow.executions.run()` methods to allow passing a custom nonce instead of letting the SDK generate it from your current credentials. ## [7.54.19] - 2024-08-23 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d9f88fc1e..09c991685 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -95,6 +95,16 @@ To speed up test runs pass the following arguments (this will parallelize across pytest -n4 --dist loadscope tests ``` +#### Unit Tests for Examples in Documentation + +For code examples defined in *docstrings* the doctest library is used and docstring tests are defined in `tests/tests_unit/test_docstring_examples.py`. Some docstring code examples may require patching which should be done here. + +For any code examples written directly in `docs/source` we are using the [sphinx doctest extension](https://www.sphinx-doc.org/en/master/usage/extensions/doctest.html) with pytest. See the `docs/source/quickstart.rst` for an example of a unit test that is setup to use some fixtures defined through pytest (`docs/source/conftest.py`). To run all the tests defined in docs run: + +``` +pytest docs +``` + ### Documentation Build html files of documentation locally by running diff --git a/cognite/client/_api/raw.py b/cognite/client/_api/raw.py index 51a74ebd0..3bad1f2cf 100644 --- a/cognite/client/_api/raw.py +++ b/cognite/client/_api/raw.py @@ -398,7 +398,7 @@ def __call__( Note: When iterating using partitions > 1, the memory usage is bounded at 2 x partitions x chunk_size. This is implemented - by halting retrival speed when the callers code can't keep up. + by halting retrieval speed when the callers code can't keep up. """ if partitions is None or _RUNNING_IN_BROWSER: return self._list_generator( diff --git a/cognite/client/_cognite_client.py b/cognite/client/_cognite_client.py index f6143cb94..559143b09 100644 --- a/cognite/client/_cognite_client.py +++ b/cognite/client/_cognite_client.py @@ -31,7 +31,7 @@ from cognite.client._api_client import APIClient from cognite.client.config import ClientConfig, global_config from cognite.client.credentials import CredentialProvider, OAuthClientCredentials, OAuthInteractive -from cognite.client.utils._auxiliary import get_current_sdk_version +from cognite.client.utils._auxiliary import get_current_sdk_version, load_resource_to_dict class CogniteClient: @@ -213,3 +213,37 @@ def default_oauth_interactive( """ credentials = OAuthInteractive.default_for_azure_ad(tenant_id, client_id, cdf_cluster) return cls.default(project, cdf_cluster, credentials, client_name) + + @classmethod + def load(cls, config: dict[str, Any] | str) -> CogniteClient: + """Load a cognite client object from a YAML/JSON string or dict. + + Args: + config (dict[str, Any] | str): A dictionary or YAML/JSON string containing configuration values defined in the CogniteClient class. + + Returns: + CogniteClient: A cognite client object. + + Examples: + + Create a cognite client object from a dictionary input: + + >>> from cognite.client import CogniteClient + >>> import os + >>> config = { + ... "client_name": "abcd", + ... "project": "cdf-project", + ... "base_url": "https://api.cognitedata.com/", + ... "credentials": { + ... "client_credentials": { + ... "client_id": "abcd", + ... "client_secret": os.environ["OAUTH_CLIENT_SECRET"], + ... "token_url": "https://login.microsoftonline.com/xyz/oauth2/v2.0/token", + ... "scopes": ["https://api.cognitedata.com/.default"], + ... }, + ... }, + ... } + >>> client = CogniteClient.load(config) + """ + loaded = load_resource_to_dict(config) + return cls(config=ClientConfig.load(loaded)) diff --git a/cognite/client/_version.py b/cognite/client/_version.py index c46b0a1bc..bf07c3d97 100644 --- a/cognite/client/_version.py +++ b/cognite/client/_version.py @@ -1,4 +1,4 @@ from __future__ import annotations -__version__ = "7.56.0" +__version__ = "7.57.0" __api_subversion__ = "20230101" diff --git a/cognite/client/config.py b/cognite/client/config.py index 504b70540..cc89bd202 100644 --- a/cognite/client/config.py +++ b/cognite/client/config.py @@ -4,9 +4,11 @@ import pprint import warnings from contextlib import suppress +from typing import Any from cognite.client._version import __api_subversion__ from cognite.client.credentials import CredentialProvider +from cognite.client.utils._auxiliary import load_resource_to_dict class GlobalConfig: @@ -32,6 +34,17 @@ class GlobalConfig: features. Defaults to False. """ + def __new__(cls) -> GlobalConfig: + if hasattr(cls, "_instance"): + raise TypeError( + "GlobalConfig is a singleton and cannot be instantiated directly. Use `global_config` instead, " + "`from cognite.client import global_config`, then apply the wanted settings, e.g. `global_config.max_workers = 5`. " + "Settings are only guaranteed to take effect if applied before instantiating a CogniteClient." + ) + + cls._instance = super().__new__(cls) + return cls._instance + def __init__(self) -> None: self.default_client_config: ClientConfig | None = None self.disable_gzip: bool = False @@ -46,6 +59,43 @@ def __init__(self) -> None: self.max_workers: int = 5 self.silence_feature_preview_warnings: bool = False + def apply_settings(self, settings: dict[str, Any] | str) -> None: + """Apply settings to the global configuration object from a YAML/JSON string or dict. + + Note: + All settings in the dictionary will be applied unless an invalid key is provided, a ValueError will instead be raised and no settings will be applied. + + Warning: + This must be done before instantiating a CogniteClient for the configuration to take effect. + + Args: + settings (dict[str, Any] | str): A dictionary or YAML/JSON string containing configuration values defined in the GlobalConfig class. + + Examples: + + Apply settings to the global_config from a dictionary input: + + >>> from cognite.client import global_config + >>> settings = { + ... "max_retries": 5, + ... "disable_ssl": True, + ... } + >>> global_config.apply_settings(settings) + """ + + loaded = load_resource_to_dict(settings).copy() # doing a shallow copy to avoid mutating the user input config + current_settings = vars(self) + if not loaded.keys() <= current_settings.keys(): + raise ValueError( + f"One or more invalid keys provided for global_config, no settings applied: {loaded.keys() - current_settings}" + ) + + if "default_client_config" in loaded: + if not isinstance(loaded["default_client_config"], ClientConfig): + loaded["default_client_config"] = ClientConfig.load(loaded["default_client_config"]) + + current_settings.update(loaded) + global_config = GlobalConfig() @@ -163,3 +213,54 @@ def default( credentials=credentials, base_url=f"https://{cdf_cluster}.cognitedata.com/", ) + + @classmethod + def load(cls, config: dict[str, Any] | str) -> ClientConfig: + """Load a client config object from a YAML/JSON string or dict. + + Args: + config (dict[str, Any] | str): A dictionary or YAML/JSON string containing configuration values defined in the ClientConfig class. + + Returns: + ClientConfig: A client config object. + + Examples: + + Create a client config object from a dictionary input: + + >>> from cognite.client.config import ClientConfig + >>> import os + >>> config = { + ... "client_name": "abcd", + ... "project": "cdf-project", + ... "base_url": "https://api.cognitedata.com/", + ... "credentials": { + ... "client_credentials": { + ... "client_id": "abcd", + ... "client_secret": os.environ["OAUTH_CLIENT_SECRET"], + ... "token_url": "https://login.microsoftonline.com/xyz/oauth2/v2.0/token", + ... "scopes": ["https://api.cognitedata.com/.default"], + ... }, + ... }, + ... } + >>> client_config = ClientConfig.load(config) + """ + loaded = load_resource_to_dict(config) + + if isinstance(loaded["credentials"], CredentialProvider): + credentials = loaded["credentials"] + else: + credentials = CredentialProvider.load(loaded["credentials"]) + + return cls( + client_name=loaded["client_name"], + project=loaded["project"], + credentials=credentials, + api_subversion=loaded.get("api_subversion"), + base_url=loaded.get("base_url"), + max_workers=loaded.get("max_workers"), + headers=loaded.get("headers"), + timeout=loaded.get("timeout"), + file_transfer_timeout=loaded.get("file_transfer_timeout"), + debug=loaded.get("debug", False), + ) diff --git a/cognite/client/credentials.py b/cognite/client/credentials.py index 6fefae39b..86b64d16b 100644 --- a/cognite/client/credentials.py +++ b/cognite/client/credentials.py @@ -7,22 +7,80 @@ import time from abc import abstractmethod from pathlib import Path -from typing import Any, Callable, Protocol +from types import MappingProxyType +from typing import Any, Callable, Protocol, runtime_checkable from msal import ConfidentialClientApplication, PublicClientApplication, SerializableTokenCache from oauthlib.oauth2 import BackendApplicationClient, OAuth2Error from requests_oauthlib import OAuth2Session from cognite.client.exceptions import CogniteAuthError +from cognite.client.utils._auxiliary import load_resource_to_dict _TOKEN_EXPIRY_LEEWAY_SECONDS_DEFAULT = 30 # Do not change without also updating all the docstrings using it +@runtime_checkable class CredentialProvider(Protocol): @abstractmethod def authorization_header(self) -> tuple[str, str]: raise NotImplementedError + @classmethod + def load(cls, config: dict[str, Any] | str) -> CredentialProvider: + """Load a credential provider object from a YAML/JSON string or dict. + + Note: + The dictionary must contain exactly one top level key, which is the type of the credential provider and must be one of the + following strings: "token", "client_credentials", "interactive", "device_code", "client_certificate". The value of the key + is a dictionary containing the configuration for the credential provider. + + Args: + config (dict[str, Any] | str): A dictionary or YAML/JSON string containing the configuration for the credential provider. + + Returns: + CredentialProvider: Initialized credential provider of the specified type. + + Examples: + + Get a token credential provider: + + >>> from cognite.client.credentials import CredentialProvider + >>> config = {"token": "my secret token"} + >>> credentials = CredentialProvider.load(config) + + Get a client credential provider: + + >>> import os + >>> config = { + ... "client_credentials": { + ... "client_id": "abcd", + ... "client_secret": os.environ["OAUTH_CLIENT_SECRET"], + ... "token_url": "https://login.microsoftonline.com/xyz/oauth2/v2.0/token", + ... "scopes": ["https://api.cognitedata.com/.default"], + ... } + ... } + >>> credentials = CredentialProvider.load(config) + """ + loaded = load_resource_to_dict(config) + + if len(loaded) != 1: + raise ValueError( + f"Credential provider configuration must be a dictionary containing exactly one of the following " + f"supported types as the top level key: {sorted(_SUPPORTED_CREDENTIAL_TYPES.keys())}." + ) + + credential_type, credential_config = next(iter(loaded.items())) + + if credential_type not in _SUPPORTED_CREDENTIAL_TYPES: + raise ValueError( + f"Invalid credential provider type given, the valid options are: {sorted(_SUPPORTED_CREDENTIAL_TYPES.keys())}." + ) + + if credential_type == "token" and (isinstance(credential_config, str) or callable(credential_config)): + credential_config = {"token": credential_config} + return _SUPPORTED_CREDENTIAL_TYPES[credential_type].load(credential_config) # type: ignore [attr-defined] + class Token(CredentialProvider): """Token credential provider @@ -60,6 +118,27 @@ def thread_safe_get_token() -> str: def authorization_header(self) -> tuple[str, str]: return "Authorization", f"Bearer {self.__token_factory()}" + @classmethod + def load(cls, config: dict[str, str | Callable[[], str]] | str) -> Token: + """Load a token credential provider object from a YAML/JSON string or dict. + + Args: + config (dict[str, str | Callable[[], str]] | str): A dictionary or YAML/JSON string containing configuration values defined in the Token class. + + Returns: + Token: Initialized token credential provider. + + Note: + A callable token is not supported if passing in a yaml string. + + Examples: + + >>> from cognite.client.credentials import Token + >>> credentials = Token.load({"token": "my secret token"}) + """ + loaded = load_resource_to_dict(config) + return cls(token=loaded["token"]) + class _OAuthCredentialProviderWithTokenRefresh(CredentialProvider): def __init__(self, token_expiry_leeway_seconds: int = _TOKEN_EXPIRY_LEEWAY_SECONDS_DEFAULT) -> None: @@ -222,6 +301,38 @@ def _refresh_access_token(self) -> tuple[str, float]: self._verify_credentials(credentials) return credentials["access_token"], time.time() + float(credentials["expires_in"]) + @classmethod + def load(cls, config: dict[str, Any] | str) -> OAuthDeviceCode: + """Load a OAuth device code credential provider object from a YAML/JSON string or dict. + + Args: + config (dict[str, Any] | str): A dictionary or YAML/JSON string containing configuration values defined in the OAuthDeviceCode class. + + Returns: + OAuthDeviceCode: Initialized OAuthDeviceCode credential provider. + + Examples: + + >>> from cognite.client.credentials import OAuthDeviceCode + >>> config = { + ... "authority_url": "https://login.microsoftonline.com/xyz", + ... "client_id": "abcd", + ... "scopes": ["https://greenfield.cognitedata.com/.default"], + ... } + >>> credentials = OAuthDeviceCode.load(config) + """ + loaded = load_resource_to_dict(config) + token_cache_path = loaded.get("token_cache_path") + return cls( + authority_url=loaded["authority_url"], + client_id=loaded["client_id"], + scopes=loaded["scopes"], + token_cache_path=Path(token_cache_path) if token_cache_path else None, + token_expiry_leeway_seconds=int( + loaded.get("token_expiry_leeway_seconds", _TOKEN_EXPIRY_LEEWAY_SECONDS_DEFAULT) + ), + ) + class OAuthInteractive(_OAuthCredentialProviderWithTokenRefresh, _WithMsalSerializableTokenCache): """OAuth credential provider for an interactive login flow. @@ -302,6 +413,39 @@ def _refresh_access_token(self) -> tuple[str, float]: self._verify_credentials(credentials) return credentials["access_token"], time.time() + float(credentials["expires_in"]) + @classmethod + def load(cls, config: dict[str, Any] | str) -> OAuthInteractive: + """Load a OAuth interactive credential provider object from a YAML/JSON string or dict. + + Args: + config (dict[str, Any] | str): A dictionary or YAML/JSON string containing configuration values defined in the OAuthInteractive class. + + Returns: + OAuthInteractive: Initialized OAuthInteractive credential provider. + + Examples: + + >>> from cognite.client.credentials import OAuthInteractive + >>> config = { + ... "authority_url": "https://login.microsoftonline.com/xyz", + ... "client_id": "abcd", + ... "scopes": ["https://greenfield.cognitedata.com/.default"], + ... } + >>> credentials = OAuthInteractive.load(config) + """ + loaded = load_resource_to_dict(config) + token_cache_path = loaded.get("token_cache_path") + return cls( + authority_url=loaded["authority_url"], + client_id=loaded["client_id"], + scopes=loaded["scopes"], + redirect_port=int(loaded.get("redirect_port", 53000)), + token_cache_path=Path(token_cache_path) if token_cache_path else None, + token_expiry_leeway_seconds=int( + loaded.get("token_expiry_leeway_seconds", _TOKEN_EXPIRY_LEEWAY_SECONDS_DEFAULT) + ), + ) + @classmethod def default_for_azure_ad( cls, @@ -443,6 +587,41 @@ def _refresh_access_token(self) -> tuple[str, float]: f"Error generating access token: {oauth_err.error}, {oauth_err.status_code}, {oauth_err.description}" ) from oauth_err + @classmethod + def load(cls, config: dict[str, Any] | str) -> OAuthClientCredentials: + """Load a OAuth client credentials credential provider object from a YAML/JSON string or dict. + + Args: + config (dict[str, Any] | str): A dictionary or YAML/JSON string containing configuration values defined in the OAuthClientCredentials class. + + Returns: + OAuthClientCredentials: Initialized OAuthClientCredentials credential provider. + + Examples: + + >>> from cognite.client.credentials import OAuthClientCredentials + >>> import os + >>> config = { + ... "token_url": "https://login.microsoftonline.com/xyz/oauth2/v2.0/token", + ... "client_id": "abcd", + ... "client_secret": os.environ["OAUTH_CLIENT_SECRET"], + ... "scopes": ["https://greenfield.cognitedata.com/.default"], + ... "audience": "some-audience" + ... } + >>> credentials = OAuthClientCredentials.load(config) + """ + loaded = load_resource_to_dict(config).copy() # doing a shallow copy to avoid mutating the user input config + return cls( + token_url=loaded.pop("token_url"), + client_id=loaded.pop("client_id"), + client_secret=loaded.pop("client_secret"), + scopes=loaded.pop("scopes"), + token_expiry_leeway_seconds=int( + loaded.pop("token_expiry_leeway_seconds", _TOKEN_EXPIRY_LEEWAY_SECONDS_DEFAULT) + ), + **loaded, + ) + @classmethod def default_for_azure_ad( cls, @@ -553,3 +732,49 @@ def _refresh_access_token(self) -> tuple[str, float]: self._verify_credentials(credentials) return credentials["access_token"], time.time() + float(credentials["expires_in"]) + + @classmethod + def load(cls, config: dict[str, Any] | str) -> OAuthClientCertificate: + """Load a OAuth client certificate credential provider object from a YAML/JSON string or dict. + + Args: + config (dict[str, Any] | str): A dictionary or YAML/JSON string containing configuration values defined in the OAuthClientCertificate class. + + Returns: + OAuthClientCertificate: Initialized OAuthClientCertificate credential provider. + + Examples: + + >>> from cognite.client.credentials import OAuthClientCertificate + >>> from pathlib import Path + >>> config = { + ... "authority_url": "https://login.microsoftonline.com/xyz", + ... "client_id": "abcd", + ... "cert_thumbprint": "XYZ123", + ... "certificate": Path("certificate.pem").read_text(), + ... "scopes": ["https://greenfield.cognitedata.com/.default"], + ... } + >>> credentials = OAuthClientCertificate.load(config) + """ + loaded = load_resource_to_dict(config) + return cls( + authority_url=loaded["authority_url"], + client_id=loaded["client_id"], + cert_thumbprint=loaded["cert_thumbprint"], + certificate=loaded["certificate"], + scopes=loaded["scopes"], + token_expiry_leeway_seconds=int( + loaded.get("token_expiry_leeway_seconds", _TOKEN_EXPIRY_LEEWAY_SECONDS_DEFAULT) + ), + ) + + +_SUPPORTED_CREDENTIAL_TYPES = MappingProxyType( + { + "token": Token, + "client_credentials": OAuthClientCredentials, + "interactive": OAuthInteractive, + "device_code": OAuthDeviceCode, + "client_certificate": OAuthClientCertificate, + } +) diff --git a/cognite/client/data_classes/_base.py b/cognite/client/data_classes/_base.py index 995ad49a6..551c861b3 100644 --- a/cognite/client/data_classes/_base.py +++ b/cognite/client/data_classes/_base.py @@ -29,7 +29,7 @@ from cognite.client.exceptions import CogniteMissingClientError from cognite.client.utils import _json -from cognite.client.utils._auxiliary import fast_dict_load, load_yaml_or_json +from cognite.client.utils._auxiliary import fast_dict_load, load_resource_to_dict, load_yaml_or_json from cognite.client.utils._identifier import IdentifierSequence from cognite.client.utils._importing import local_import from cognite.client.utils._pandas_helpers import ( @@ -151,14 +151,8 @@ def dump_yaml(self) -> str: @classmethod def load(cls, resource: dict | str, cognite_client: CogniteClient | None = None) -> Self: """Load a resource from a YAML/JSON string or dict.""" - if isinstance(resource, dict): - return cls._load(resource, cognite_client=cognite_client) - - if isinstance(resource, str): - resource = cast(dict, load_yaml_or_json(resource)) - return cls._load(resource, cognite_client=cognite_client) - - raise TypeError(f"Resource must be json or yaml str, or dict, not {type(resource)}") + loaded = load_resource_to_dict(resource) + return cls._load(loaded, cognite_client=cognite_client) @classmethod def _load(cls, resource: dict[str, Any], cognite_client: CogniteClient | None = None) -> Self: @@ -409,7 +403,7 @@ def _load( @classmethod def _load_raw_api_response(cls, responses: list[dict[str, Any]], cognite_client: CogniteClient) -> Self: - # Certain classes may need more than just 'items' from the raw repsonse. These need to provide + # Certain classes may need more than just 'items' from the raw response. These need to provide # an implementation of this method raise NotImplementedError @@ -766,7 +760,7 @@ def load( nulls=data[2], ) elif isinstance(data, str) and (prop_order := data.split(":", 1))[-1] in ("asc", "desc"): - # Syntax ":asc|desc" is depreacted but handled for compatibility + # Syntax ":asc|desc" is deprecated but handled for compatibility return cls(property=prop_order[0], order=cast(Literal["asc", "desc"], prop_order[1])) elif isinstance(data, (str, list, EnumProperty)): return cls(property=data) diff --git a/cognite/client/data_classes/data_modeling/instances.py b/cognite/client/data_classes/data_modeling/instances.py index e3277882d..adfccc5e5 100644 --- a/cognite/client/data_classes/data_modeling/instances.py +++ b/cognite/client/data_classes/data_modeling/instances.py @@ -442,7 +442,7 @@ def to_pandas( # type: ignore [override] convert_timestamps (bool): Convert known attributes storing CDF timestamps (milliseconds since epoch) to datetime. Does not affect properties. expand_properties (bool): Expand the properties into separate rows. Note: Will change default to True in the next major version. remove_property_prefix (bool): Remove view ID prefix from row names of expanded properties (in index). Requires data to be from a single view. - **kwargs (Any): For backwards compatability. + **kwargs (Any): For backwards compatibility. Returns: pd.DataFrame: The dataframe. @@ -1004,7 +1004,7 @@ def to_pandas( # type: ignore [override] convert_timestamps (bool): Convert known columns storing CDF timestamps (milliseconds since epoch) to datetime. Does not affect properties. expand_properties (bool): Expand the properties into separate columns. Note: Will change default to True in the next major version. remove_property_prefix (bool): Remove view ID prefix from columns names of expanded properties. Requires data to be from a single view. - **kwargs (Any): For backwards compatability. + **kwargs (Any): For backwards compatibility. Returns: pd.DataFrame: The Cognite resource as a dataframe. diff --git a/cognite/client/data_classes/datapoints.py b/cognite/client/data_classes/datapoints.py index 54bdaf9b2..85cd251d0 100644 --- a/cognite/client/data_classes/datapoints.py +++ b/cognite/client/data_classes/datapoints.py @@ -1324,7 +1324,8 @@ def get( # type: ignore [override] ) -> DatapointsArray | list[DatapointsArray] | None: """Get a specific DatapointsArray from this list by id or external_id. - Note: For duplicated time series, returns a list of DatapointsArray. + Note: + For duplicated time series, returns a list of DatapointsArray. Args: id (int | None): The id of the item(s) to get. @@ -1406,7 +1407,8 @@ def get( # type: ignore [override] ) -> Datapoints | list[Datapoints] | None: """Get a specific Datapoints from this list by id or external_id. - Note: For duplicated time series, returns a list of Datapoints. + Note: + For duplicated time series, returns a list of Datapoints. Args: id (int | None): The id of the item(s) to get. diff --git a/cognite/client/data_classes/workflows.py b/cognite/client/data_classes/workflows.py index 26f13eb6e..6a65d28b7 100644 --- a/cognite/client/data_classes/workflows.py +++ b/cognite/client/data_classes/workflows.py @@ -397,7 +397,8 @@ class WorkflowTask(CogniteResource): """ This class represents a workflow task. - Note: tasks do not distinguish between write and read versions. + Note: + Tasks do not distinguish between write and read versions. Args: external_id (str): The external ID provided by the client. Must be unique for the resource type. diff --git a/cognite/client/utils/_auxiliary.py b/cognite/client/utils/_auxiliary.py index f7828dd47..50acdb1c0 100644 --- a/cognite/client/utils/_auxiliary.py +++ b/cognite/client/utils/_auxiliary.py @@ -55,6 +55,18 @@ def get_accepted_params(cls: type[T_CogniteResource]) -> dict[str, str]: return {to_camel_case(k): k for k in vars(cls()) if not k.startswith("_")} +def load_resource_to_dict(resource: dict[str, Any] | str) -> dict[str, Any]: + if isinstance(resource, dict): + return resource + + if isinstance(resource, str): + resource = load_yaml_or_json(resource) + if isinstance(resource, dict): + return resource + + raise TypeError(f"Resource must be json or yaml str, or dict, not {type(resource)}") + + def fast_dict_load( cls: type[T_CogniteObject], item: dict[str, Any], cognite_client: CogniteClient | None ) -> T_CogniteObject: diff --git a/docs/source/cognite_client.rst b/docs/source/cognite_client.rst index abee017dc..6dff59321 100644 --- a/docs/source/cognite_client.rst +++ b/docs/source/cognite_client.rst @@ -1,6 +1,7 @@ CogniteClient ============= +.. _class_client_CogniteClient: .. autoclass:: cognite.client.CogniteClient :members: :member-order: bysource @@ -10,6 +11,7 @@ CogniteClient :members: :member-order: bysource +.. _class_client_GlobalConfig: .. autoclass:: cognite.client.config.GlobalConfig :members: :member-order: bysource diff --git a/docs/source/conf.py b/docs/source/conf.py index 3ee27b6a5..1cf25457a 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -28,7 +28,7 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ["sphinx.ext.autodoc", "sphinx.ext.napoleon", "sphinx.ext.autosectionlabel"] +extensions = ["sphinx.ext.autodoc", "sphinx.ext.doctest", "sphinx.ext.napoleon", "sphinx.ext.autosectionlabel"] autosectionlabel_prefix_document = True diff --git a/docs/source/conftest.py b/docs/source/conftest.py new file mode 100644 index 000000000..8c3839c62 --- /dev/null +++ b/docs/source/conftest.py @@ -0,0 +1,48 @@ +import os +from pathlib import Path + +import pytest +import yaml + +# Files to exclude test directories or modules +collect_ignore = ["conf.py"] + + +@pytest.fixture +def set_envs(monkeypatch): + env_vars = { + "MY_CLUSTER": "api", + "MY_TENANT_ID": "my-tenant-id", + "MY_CLIENT_ID": "my-client-id", + "MY_CLIENT_SECRET": "my-client-secret", + } + + monkeypatch.setattr(os, "environ", env_vars) + + +@pytest.fixture +def quickstart_client_config_file(monkeypatch): + data = { + "client": { + "project": "my-project", + "client_name": "my-special-client", + "base_url": "https://${MY_CLUSTER}.cognitedata.com", + "credentials": { + "client_credentials": { + "token_url": "https://login.microsoftonline.com/${MY_TENANT_ID}/oauth2/v2.0/token", + "client_id": "${MY_CLIENT_ID}", + "client_secret": "${MY_CLIENT_SECRET}", + "scopes": ["https://api.cognitedata.com/.default"], + }, + }, + }, + "global": { + "max_retries": 10, + "max_retry_backoff": 10, + }, + } + + def read_text(*args, **kwargs): + return yaml.dump(data) + + monkeypatch.setattr(Path, "read_text", read_text) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 4f358eb0a..427fd99b6 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -1,7 +1,94 @@ Quickstart ========== -Instantiate a new client ------------------------- + +There are multiple ways that a CogniteClient can be configured to authenticate with Cognite Data Fusion (CDF). For the purpose of +this quickstart we'll demonstrate the most common/recommended patterns. More details and usage examples can be found in each respective +section: :ref:`CogniteClient `, :ref:`ClientConfig `, +:ref:`GlobalConfig `, and :ref:`credential_providers:Credential Providers`. + +Instantiate a new client from a configuration file +-------------------------------------------------- +Use this code to instantiate a client using a configuration file in order to execute API calls to Cognite Data Fusion (CDF). + +.. note:: + How you read in the configuration file is up to you as the :ref:`CogniteClient ` load method + accepts both a dictionary and a YAML/JSON string. So for the purposes of this example, we will use the yaml library to read in a yaml file and + substitute environment variables in the file string to ensure that sensitive information is not stored in the file. + +See :ref:`CogniteClient `, :ref:`ClientConfig `, +:ref:`GlobalConfig `, and :ref:`credential_providers:Credential Providers` +for more information on the configuration options. + +.. code:: yaml + + # cognite-sdk-config.yaml + client: + project: "my-project" + client_name: "my-special-client" + base_url: "https://${MY_CLUSTER}.cognitedata.com" + credentials: + client_credentials: + token_url: "https://login.microsoftonline.com/${MY_TENANT_ID}/oauth2/v2.0/token" + client_id: "${MY_CLIENT_ID}" + client_secret: "${MY_CLIENT_SECRET}" + scopes: ["https://api.cognitedata.com/.default"] + global: + max_retries: 10 + max_retry_backoff: 10 + +.. testsetup:: client_config_file + + >>> getfixture("set_envs") # Fixture defined in conftest.py + >>> getfixture("quickstart_client_config_file") # Fixture defined in conftest.py + +.. doctest:: client_config_file + + >>> import os + >>> from pathlib import Path + >>> from string import Template + + >>> import yaml + + >>> from cognite.client import CogniteClient, global_config + + >>> file_path = Path("cognite-sdk-config.yaml") + + >>> # Read in yaml file and substitute environment variables in the file string + >>> env_sub_template = Template(file_path.read_text()) + >>> file_env_parsed = env_sub_template.substitute(dict(os.environ)) + + >>> # Load yaml file string into a dictionary to parse global and client configurations + >>> cognite_config = yaml.safe_load(file_env_parsed) + + >>> # If you want to set a global configuration it must be done before creating the client + >>> global_config.apply_settings(cognite_config["global"]) + >>> client = CogniteClient.load(cognite_config["client"]) + +.. testcode:: client_config_file + :hide: + + >>> global_config.max_retries + 10 + >>> global_config.max_retry_backoff + 10 + >>> client.config.project + 'my-project' + >>> client.config.client_name + 'my-special-client' + >>> client.config.credentials.client_id + 'my-client-id' + >>> client.config.credentials.client_secret + 'my-client-secret' + >>> client.config.credentials.token_url + 'https://login.microsoftonline.com/my-tenant-id/oauth2/v2.0/token' + >>> client.config.credentials.scopes + ['https://api.cognitedata.com/.default'] + +Instantiate a new client using ClientConfig +------------------------------------------- + +Use this code to instantiate a client using the ClientConfig and global_config in order to execute API calls to Cognite Data Fusion (CDF). + Use this code to instantiate a client in order to execute API calls to Cognite Data Fusion (CDF). The :code:`client_name` is a user-defined string intended to give the client a unique identifier. You can provide the :code:`client_name` by passing it directly to the :ref:`ClientConfig ` constructor. @@ -12,36 +99,57 @@ Use one of the credential providers such as OAuthClientCredentials to authentica .. note:: The following example sets a global client configuration which will be used if no config is explicitly passed to :ref:`cognite_client:CogniteClient`. - All examples in this documentation assume that such a global configuration has been set. - -.. code:: python + All examples in this documentation going forward assume that such a global configuration has been set. + +.. testsetup:: client_config + + >>> getfixture("set_envs") # Fixture defined in conftest.py + +.. doctest:: client_config + + >>> from cognite.client import CogniteClient, ClientConfig, global_config + >>> from cognite.client.credentials import OAuthClientCredentials + + >>> # This value will depend on the cluster your CDF project runs on + >>> cluster = "api" + >>> base_url = f"https://{cluster}.cognitedata.com" + >>> tenant_id = "my-tenant-id" + >>> client_id = "my-client-id" + >>> # client secret should not be stored in-code, so we load it from an environment variable + >>> client_secret = os.environ["MY_CLIENT_SECRET"] + >>> creds = OAuthClientCredentials( + ... token_url=f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token", + ... client_id=client_id, + ... client_secret=client_secret, + ... scopes=[f"{base_url}/.default"] + ... ) + + >>> cnf = ClientConfig( + ... client_name="my-special-client", + ... base_url=base_url, + ... project="my-project", + ... credentials=creds + ... ) + + >>> global_config.default_client_config = cnf + >>> client = CogniteClient() + +.. testcode:: client_config + :hide: + + >>> client.config.project + 'my-project' + >>> client.config.client_name + 'my-special-client' + >>> client.config.credentials.client_id + 'my-client-id' + >>> client.config.credentials.client_secret + 'my-client-secret' + >>> client.config.credentials.token_url + 'https://login.microsoftonline.com/my-tenant-id/oauth2/v2.0/token' + >>> client.config.credentials.scopes + ['https://api.cognitedata.com/.default'] - from cognite.client import CogniteClient, ClientConfig, global_config - from cognite.client.credentials import OAuthClientCredentials - - # This value will depend on the cluster your CDF project runs on - cluster = "api" - base_url = f"https://{cluster}.cognitedata.com" - tenant_id = "my-tenant-id" - client_id = "my-client-id" - # client secret should not be stored in-code, so we load it from an environment variable - client_secret = os.environ["MY_CLIENT_SECRET"] - creds = OAuthClientCredentials( - token_url=f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token", - client_id=client_id, - client_secret=client_secret, - scopes=[f"{base_url}/.default"] - ) - - cnf = ClientConfig( - client_name="my-special-client", - base_url=base_url, - project="my-project", - credentials=creds - ) - - global_config.default_client_config = cnf - client = CogniteClient() Examples for all OAuth credential providers can be found in the :ref:`credential_providers:Credential Providers` section. diff --git a/pyproject.toml b/pyproject.toml index c64b5c137..de5e8db3d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "cognite-sdk" -version = "7.56.0" +version = "7.57.0" description = "Cognite Python SDK" readme = "README.md" documentation = "https://cognite-sdk-python.readthedocs-hosted.com" diff --git a/pytest.ini b/pytest.ini index 5dcac4857..5e41b34ef 100644 --- a/pytest.ini +++ b/pytest.ini @@ -11,4 +11,8 @@ filterwarnings = ignore::DeprecationWarning:test ignore::cognite.client.utils._experimental.FeaturePreviewWarning -addopts = --color=yes +testpaths = + tests + docs + +addopts = --color=yes --doctest-modules --doctest-glob='*.rst' diff --git a/tests/tests_unit/conftest.py b/tests/tests_unit/conftest.py index 2c9ff30cc..d772458f0 100644 --- a/tests/tests_unit/conftest.py +++ b/tests/tests_unit/conftest.py @@ -7,6 +7,9 @@ from cognite.client import ClientConfig, CogniteClient from cognite.client.credentials import Token +# Files to exclude test directories or modules +collect_ignore = ["test_api/function_test_resources"] + # TODO: This class-scoped client causes side-effects between tests... @pytest.fixture(scope="class") diff --git a/tests/tests_unit/test_cognite_client.py b/tests/tests_unit/test_cognite_client.py index 4b4af8e6b..5a5f08cd7 100644 --- a/tests/tests_unit/test_cognite_client.py +++ b/tests/tests_unit/test_cognite_client.py @@ -102,6 +102,31 @@ def test_verify_ssl_enabled_by_default(self, rsps, client_config_w_token_factory assert client._api_client._http_client_with_retry.session.verify is True assert client._api_client._http_client.session.verify is True + def test_client_load(self): + config = { + "project": "test-project", + "client_name": "cognite-sdk-python", + "debug": True, + "credentials": { + "client_credentials": { + "client_id": "test-client-id", + "client_secret": "test-client-secret", + "token_url": TOKEN_URL, + "scopes": ["https://test.com/.default", "https://test.com/.admin"], + } + }, + } + client = CogniteClient.load(config) + assert client.config.project == "test-project" + assert client.config.credentials.client_id == "test-client-id" + assert client.config.credentials.client_secret == "test-client-secret" + assert client.config.credentials.token_url == TOKEN_URL + assert client.config.credentials.scopes == ["https://test.com/.default", "https://test.com/.admin"] + assert client.config.debug is True + log = logging.getLogger("cognite.client") + log.handlers = [] + log.propagate = False + class TestInstantiateWithClient: @pytest.mark.parametrize("cls", [Asset, Event, FileMetadata, TimeSeries]) diff --git a/tests/tests_unit/test_config.py b/tests/tests_unit/test_config.py new file mode 100644 index 000000000..37de12ae9 --- /dev/null +++ b/tests/tests_unit/test_config.py @@ -0,0 +1,102 @@ +from contextlib import nullcontext as does_not_raise + +import pytest + +from cognite.client import global_config +from cognite.client.config import ClientConfig, GlobalConfig +from cognite.client.credentials import Token + +_LOAD_RESOURCE_TO_DICT_ERROR = r"Resource must be json or yaml str, or dict, not" + + +class TestGlobalConfig: + def test_global_config_singleton(self): + with pytest.raises( + TypeError, + match=r"GlobalConfig is a singleton and cannot be instantiated directly. Use `global_config` instead,", + ): + GlobalConfig() + + @pytest.mark.parametrize( + "client_config", + [ + { + "project": "test-project", + "base_url": "https://test-cluster.cognitedata.com/", + "credentials": {"token": "abc"}, + "client_name": "test-client", + }, + ClientConfig( + project="test-project", + base_url="https://test-cluster.cognitedata.com/", + credentials=Token("abc"), + client_name="test-client", + ), + None, + ], + ) + def test_apply_settings(self, monkeypatch, client_config): + monkeypatch.delattr(GlobalConfig, "_instance") # ensure that the singleton is re-instantiated + gc = GlobalConfig() + assert gc.max_workers == 5 + assert gc.max_retries == 10 + + settings = { + "max_workers": 6, + "max_retries": 11, + "default_client_config": client_config, + } + with pytest.raises(TypeError, match=_LOAD_RESOURCE_TO_DICT_ERROR) if not client_config else does_not_raise(): + gc.apply_settings(settings) + assert gc.max_workers == 6 + assert gc.max_retries == 11 + assert isinstance(gc.default_client_config, ClientConfig) + assert isinstance(gc.default_client_config.credentials, Token) + assert gc.default_client_config.project == "test-project" + + def test_load_non_existent_attr(self): + settings = { + "max_workers": 0, # use a nonsensical value to ensure that it is not applied without assuming other tests kept the default value + "invalid_1": 10, + "invalid_2": "foo", + } + + with pytest.raises(ValueError, match=r"One or more invalid keys provided for global_config"): + global_config.apply_settings(settings) + + # confirm that the valid keys were not applied since we don't want a partial application + assert global_config.max_workers != 0 + + +class TestClientConfig: + def test_default(self): + config = { + "project": "test-project", + "cdf_cluster": "test-cluster", + "credentials": Token("abc"), + "client_name": "test-client", + } + client_config = ClientConfig.default(**config) + assert client_config.project == "test-project" + assert client_config.base_url == "https://test-cluster.cognitedata.com" + assert isinstance(client_config.credentials, Token) + assert client_config.client_name == "test-client" + + @pytest.mark.parametrize( + "credentials", + [{"token": "abc"}, '{"token": "abc"}', {"token": (lambda: "abc")}, Token("abc"), Token(lambda: "abc"), None], + ) + def test_load(self, credentials): + config = { + "project": "test-project", + "base_url": "https://test-cluster.cognitedata.com/", + "credentials": credentials, + "client_name": "test-client", + } + with pytest.raises(TypeError, match=_LOAD_RESOURCE_TO_DICT_ERROR) if not credentials else does_not_raise(): + client_config = ClientConfig.load(config) + assert client_config.project == "test-project" + assert client_config.base_url == "https://test-cluster.cognitedata.com" + assert isinstance(client_config.credentials, Token) + assert "Authorization", "Bearer abc" == client_config.credentials.authorization_header() + assert client_config.client_name == "test-client" diff --git a/tests/tests_unit/test_credential_providers.py b/tests/tests_unit/test_credential_providers.py index 4742eb5be..bce49dc4f 100644 --- a/tests/tests_unit/test_credential_providers.py +++ b/tests/tests_unit/test_credential_providers.py @@ -1,17 +1,45 @@ +from types import MappingProxyType from typing import ClassVar -from unittest.mock import Mock, patch +from unittest.mock import patch import pytest from oauthlib.oauth2 import InvalidClientIdError from cognite.client.credentials import ( + CredentialProvider, OAuthClientCertificate, OAuthClientCredentials, + OAuthDeviceCode, + OAuthInteractive, Token, ) from cognite.client.exceptions import CogniteAuthError +class TestCredentialProvider: + INVALID_CREDENTIAL_ERROR = "Invalid credential provider type given, the valid options are:" + INVALID_INPUT_LENGTH_ERROR = "Credential provider configuration must be a dictionary containing exactly one of the following supported types as the top level key:" + INVALID_INPUT_TYPE_ERROR = "Resource must be json or yaml str, or dict, not" + + @pytest.mark.parametrize( + "config,error_type,error_message", + [ + pytest.param({"foo": "abc"}, ValueError, INVALID_CREDENTIAL_ERROR, id="Invalid input: credential type"), + pytest.param("token", TypeError, INVALID_INPUT_TYPE_ERROR, id="Invalid input: not a dict, str"), + pytest.param({}, ValueError, INVALID_INPUT_LENGTH_ERROR, id="Invalid input: empty dict"), + pytest.param( + {"token": "abc", "client_credentials": {"client_id": "abc"}}, + ValueError, + INVALID_INPUT_LENGTH_ERROR, + id="Invalid input: multiple keys", + ), + ], + ) + def test_invalid_not_dict(self, config, error_type, error_message): + with pytest.raises(error_type, match=error_message): + CredentialProvider.load(config) + + class TestToken: def test_token_auth_header(self): creds = Token("abc") @@ -21,20 +49,125 @@ def test_token_factory_auth_header(self): creds = Token(lambda: "abc") assert "Authorization", "Bearer abc" == creds.authorization_header() + def test_token_non_string(self): + with pytest.raises( + TypeError, match=r"'token' must be a string or a no-argument-callable returning a string, not" + ): + Token({"foo": "bar"}) + + @pytest.mark.parametrize( + "config", + [ + {"token": "abc"}, + '{"token": "abc"}', + {"token": (lambda: "abc")}, + ], + ) + def test_load(self, config): + creds = Token.load(config) + assert isinstance(creds, Token) + assert "Authorization", "Bearer abc" == creds.authorization_header() + + @pytest.mark.parametrize( + "config", + [ + {"token": "abc"}, + {"token": {"token": "abc"}}, + '{"token": "abc"}', + '{"token": {"token": "abc"}}', + {"token": (lambda: "abc")}, + {"token": {"token": (lambda: "abc")}}, + ], + ) + def test_create_from_credential_provider(self, config): + creds = CredentialProvider.load(config) + assert isinstance(creds, Token) + assert "Authorization", "Bearer abc" == creds.authorization_header() + + +class TestOAuthDeviceCode: + DEFAULT_PROVIDER_ARGS: ClassVar = MappingProxyType( + { + "authority_url": "https://login.microsoftonline.com/xyz", + "client_id": "azure-client-id", + "scopes": ["https://greenfield.cognitedata.com/.default"], + } + ) + + @patch("cognite.client.credentials.PublicClientApplication") + @pytest.mark.parametrize("expires_in", (1000, "1001")) # some IDPs return as string + def test_access_token_generated(self, mock_public_client, expires_in): + mock_public_client().acquire_token_silent.return_value = { + "access_token": "azure_token", + "expires_in": expires_in, + } + creds = OAuthDeviceCode(**self.DEFAULT_PROVIDER_ARGS) + creds._refresh_access_token() + assert "Authorization", "Bearer azure_token" == creds.authorization_header() + + @patch("cognite.client.credentials.PublicClientApplication") + def test_load(self, mock_public_client): + creds = OAuthDeviceCode.load(dict(self.DEFAULT_PROVIDER_ARGS)) + assert isinstance(creds, OAuthDeviceCode) + assert "Authorization", "Bearer azure_token" == creds.authorization_header() + + @patch("cognite.client.credentials.PublicClientApplication") + def test_create_from_credential_provider(self, mock_public_client): + config = {"device_code": dict(self.DEFAULT_PROVIDER_ARGS)} + creds = CredentialProvider.load(config) + assert isinstance(creds, OAuthDeviceCode) + assert "Authorization", "Bearer azure_token" == creds.authorization_header() + + +class TestOAuthInteractive: + DEFAULT_PROVIDER_ARGS: ClassVar = MappingProxyType( + { + "authority_url": "https://login.microsoftonline.com/xyz", + "client_id": "azure-client-id", + "scopes": ["https://greenfield.cognitedata.com/.default"], + } + ) + + @patch("cognite.client.credentials.PublicClientApplication") + @pytest.mark.parametrize("expires_in", (1000, "1001")) # some IDPs return as string + def test_access_token_generated(self, mock_public_client, expires_in): + mock_public_client().acquire_token_silent.return_value = { + "access_token": "azure_token", + "expires_in": expires_in, + } + creds = OAuthInteractive(**self.DEFAULT_PROVIDER_ARGS) + creds._refresh_access_token() + assert "Authorization", "Bearer azure_token" == creds.authorization_header() + + @patch("cognite.client.credentials.PublicClientApplication") + def test_load(self, mock_public_client): + creds = OAuthInteractive.load(dict(self.DEFAULT_PROVIDER_ARGS)) + assert isinstance(creds, OAuthInteractive) + assert "Authorization", "Bearer azure_token" == creds.authorization_header() + + @patch("cognite.client.credentials.PublicClientApplication") + def test_create_from_credential_provider(self, mock_public_client): + config = {"interactive": dict(self.DEFAULT_PROVIDER_ARGS)} + creds = CredentialProvider.load(config) + assert isinstance(creds, OAuthInteractive) + assert "Authorization", "Bearer azure_token" == creds.authorization_header() + class TestOauthClientCredentials: - DEFAULT_PROVIDER_ARGS: ClassVar = { - "client_id": "azure-client-id", - "client_secret": "azure-client-secret", - "token_url": "https://login.microsoftonline.com/testingabc123/oauth2/v2.0/token", - "scopes": ["https://greenfield.cognitedata.com/.default"], - } + DEFAULT_PROVIDER_ARGS: ClassVar = MappingProxyType( + { + "client_id": "azure-client-id", + "client_secret": "azure-client-secret", + "token_url": "https://login.microsoftonline.com/testingabc123/oauth2/v2.0/token", + "scopes": ["https://greenfield.cognitedata.com/.default"], + "other_custom_arg": "some_value", + } + ) @patch("cognite.client.credentials.BackendApplicationClient") @patch("cognite.client.credentials.OAuth2Session") @pytest.mark.parametrize("expires_in", (1000, "1001")) # some IDPs return as string def test_access_token_generated(self, mock_oauth_session, mock_backend_client, expires_in): - mock_backend_client().return_value = Mock() mock_oauth_session().fetch_token.return_value = {"access_token": "azure_token", "expires_in": expires_in} creds = OAuthClientCredentials(**self.DEFAULT_PROVIDER_ARGS) creds._refresh_access_token() @@ -43,7 +176,6 @@ def test_access_token_generated(self, mock_oauth_session, mock_backend_client, e @patch("cognite.client.credentials.BackendApplicationClient") @patch("cognite.client.credentials.OAuth2Session") def test_access_token_not_generated_due_to_error(self, mock_oauth_session, mock_backend_client): - mock_backend_client().return_value = Mock() mock_oauth_session().fetch_token.side_effect = InvalidClientIdError() with pytest.raises( CogniteAuthError, @@ -55,7 +187,6 @@ def test_access_token_not_generated_due_to_error(self, mock_oauth_session, mock_ @patch("cognite.client.credentials.BackendApplicationClient") @patch("cognite.client.credentials.OAuth2Session") def test_access_token_expired(self, mock_oauth_session, mock_backend_client): - mock_backend_client().return_value = Mock() mock_oauth_session().fetch_token.side_effect = [ {"access_token": "azure_token_expired", "expires_in": -1000}, {"access_token": "azure_token_refreshed", "expires_in": 1000}, @@ -64,15 +195,30 @@ def test_access_token_expired(self, mock_oauth_session, mock_backend_client): assert "Authorization", "Bearer azure_token_expired" == creds.authorization_header() assert "Authorization", "Bearer azure_token_refreshed" == creds.authorization_header() + def test_load(self): + creds = OAuthClientCredentials.load(dict(self.DEFAULT_PROVIDER_ARGS)) + assert isinstance(creds, OAuthClientCredentials) + + def test_create_from_credential_provider(self): + creds = CredentialProvider.load({"client_credentials": dict(self.DEFAULT_PROVIDER_ARGS)}) + assert isinstance(creds, OAuthClientCredentials) + assert creds.client_id == "azure-client-id" + assert creds.client_secret == "azure-client-secret" + assert creds.token_url == "https://login.microsoftonline.com/testingabc123/oauth2/v2.0/token" + assert creds.scopes == ["https://greenfield.cognitedata.com/.default"] + assert creds.token_custom_args == {"other_custom_arg": "some_value"} + class TestOAuthClientCertificate: - DEFAULT_PROVIDER_ARGS: ClassVar = { - "authority_url": "https://login.microsoftonline.com/xyz", - "client_id": "azure-client-id", - "cert_thumbprint": "XYZ123", - "certificate": "certificatecontents123", - "scopes": ["https://greenfield.cognitedata.com/.default"], - } + DEFAULT_PROVIDER_ARGS: ClassVar = MappingProxyType( + { + "authority_url": "https://login.microsoftonline.com/xyz", + "client_id": "azure-client-id", + "cert_thumbprint": "XYZ123", + "certificate": "certificatecontents123", + "scopes": ["https://greenfield.cognitedata.com/.default"], + } + ) @patch("cognite.client.credentials.ConfidentialClientApplication") def test_access_token_generated(self, mock_msal_app): @@ -82,3 +228,31 @@ def test_access_token_generated(self, mock_msal_app): } creds = OAuthClientCertificate(**self.DEFAULT_PROVIDER_ARGS) assert "Authorization", "Bearer azure_token" == creds.authorization_header() + + @patch("cognite.client.credentials.ConfidentialClientApplication") + def test_load(self, mock_msal_app): + mock_msal_app().acquire_token_for_client.return_value = { + "access_token": "azure_token", + "expires_in": 1000, + } + creds = OAuthClientCertificate.load(dict(self.DEFAULT_PROVIDER_ARGS)) + assert isinstance(creds, OAuthClientCertificate) + assert creds.authority_url == "https://login.microsoftonline.com/xyz" + assert creds.client_id == "azure-client-id" + assert creds.cert_thumbprint == "XYZ123" + assert creds.certificate == "certificatecontents123" + assert creds.scopes == ["https://greenfield.cognitedata.com/.default"] + + @patch("cognite.client.credentials.ConfidentialClientApplication") + def test_create_from_credential_provider(self, mock_msal_app): + mock_msal_app().acquire_token_for_client.return_value = { + "access_token": "azure_token", + "expires_in": 1000, + } + creds = CredentialProvider.load({"client_certificate": dict(self.DEFAULT_PROVIDER_ARGS)}) + assert isinstance(creds, OAuthClientCertificate) + assert creds.authority_url == "https://login.microsoftonline.com/xyz" + assert creds.client_id == "azure-client-id" + assert creds.cert_thumbprint == "XYZ123" + assert creds.certificate == "certificatecontents123" + assert creds.scopes == ["https://greenfield.cognitedata.com/.default"] diff --git a/tests/tests_unit/test_docstring_examples.py b/tests/tests_unit/test_docstring_examples.py index 6add9fbb4..756fa5119 100644 --- a/tests/tests_unit/test_docstring_examples.py +++ b/tests/tests_unit/test_docstring_examples.py @@ -1,10 +1,11 @@ import doctest from collections import defaultdict from unittest import TextTestRunner -from unittest.mock import patch +from unittest.mock import Mock, patch import pytest +from cognite.client import _cognite_client, config, credentials from cognite.client._api import ( assets, data_sets, @@ -39,8 +40,26 @@ def run_docstring_tests(module): assert 0 == len(s.failures) -@patch("cognite.client.CogniteClient", CogniteClientMock) @patch("os.environ", defaultdict(lambda: "value")) # ensure env.var. lookups does not fail in doctests +def test_cognite_client(): + run_docstring_tests(_cognite_client) + + +@patch("cognite.client.credentials.ConfidentialClientApplication") +@patch("cognite.client.credentials.PublicClientApplication") +@patch("pathlib.Path.read_text", Mock(return_value="certificatecontents123")) +@patch("os.environ", defaultdict(lambda: "value")) # ensure env.var. lookups does not fail in doctests +def test_credential_providers(mock_msal_app, mock_public_client): + mock_msal_app().acquire_token_for_client.return_value = { + "access_token": "azure_token", + "expires_in": 1000, + } + mock_public_client().acquire_token_silent.return_value = {"access_token": "azure_token", "expires_in": 1000} + run_docstring_tests(credentials) + + +@patch("cognite.client.CogniteClient", CogniteClientMock) +@patch("os.environ", defaultdict(lambda: "value")) class TestDocstringExamples: def test_time_series(self): run_docstring_tests(time_series) @@ -100,3 +119,6 @@ def test_workflows(self): def test_units(self): run_docstring_tests(units) + + def test_config(self): + run_docstring_tests(config) diff --git a/tests/tests_unit/test_utils/test_auxiliary.py b/tests/tests_unit/test_utils/test_auxiliary.py index df687f8ab..e5c91635b 100644 --- a/tests/tests_unit/test_utils/test_auxiliary.py +++ b/tests/tests_unit/test_utils/test_auxiliary.py @@ -13,6 +13,7 @@ get_accepted_params, handle_deprecated_camel_case_argument, interpolate_and_url_encode, + load_resource_to_dict, remove_duplicates_keep_order, split_into_chunks, split_into_n_parts, @@ -228,3 +229,24 @@ class TestFastDictLoad: def test_load(self, item, expected): get_accepted_params.cache_clear() # For good measure assert expected == fast_dict_load(MyTestResource, item, cognite_client=None) + + +class TestLoadDictOrStr: + @pytest.mark.parametrize( + "input, expected", + ( + ({"foo": "bar"}, {"foo": "bar"}), + ({"foo": None}, {"foo": None}), + ('{"foo": "bar"}', {"foo": "bar"}), + ('{"foo": null}', {"foo": None}), + ("foo: bar", {"foo": "bar"}), + ('{"foo": {"bar": "thing"}}', {"foo": {"bar": "thing"}}), + ), + ) + def test_load_resource_to_dict(self, input, expected): + assert expected == load_resource_to_dict(input) + + @pytest.mark.parametrize("input", ("foo", 100)) + def test_load_resource_to_dict_raises(self, input): + with pytest.raises(TypeError, match="Resource must be json or yaml str, or dict, not"): + load_resource_to_dict(input) From 2c7ec92022ceb8178da255714c06fd8dd04490e0 Mon Sep 17 00:00:00 2001 From: Bert Verstraete Date: Tue, 3 Sep 2024 10:23:32 +0200 Subject: [PATCH 06/15] [CDF-22368] Allow Subworkflow references (#1902) Adds support for subworkflow task referencing existing workflow versions. --- CHANGELOG.md | 4 +++ cognite/client/_version.py | 2 +- cognite/client/data_classes/workflows.py | 40 ++++++++++++++++++++++-- pyproject.toml | 2 +- 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe3808ce6..ad71ae8dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,10 @@ Changes are grouped as follows - `Fixed` for any bug fixes. - `Security` in case of vulnerabilities. +## [7.58.0] - 2024-09-03 +### Added +- Data Workflows: add support for `SubworkflowReferenceParameters` subworkflow task type. Allowing embedding other workflows into a workflow. + ## [7.57.0] - 2024-09-03 ### Added - Add a `load` method to CogniteClient, ClientConfig, and CredenitalProvider (and all it's subclasses). diff --git a/cognite/client/_version.py b/cognite/client/_version.py index bf07c3d97..7034e995f 100644 --- a/cognite/client/_version.py +++ b/cognite/client/_version.py @@ -1,4 +1,4 @@ from __future__ import annotations -__version__ = "7.57.0" +__version__ = "7.58.0" __api_subversion__ = "20230101" diff --git a/cognite/client/data_classes/workflows.py b/cognite/client/data_classes/workflows.py index 6a65d28b7..ad63526fc 100644 --- a/cognite/client/data_classes/workflows.py +++ b/cognite/client/data_classes/workflows.py @@ -136,8 +136,10 @@ def load_parameters(cls, data: dict) -> WorkflowTaskParameters: return CDFTaskParameters._load(parameters) elif type_ == "dynamic": return DynamicTaskParameters._load(parameters) - elif type_ == "subworkflow": + elif type_ == "subworkflow" and "tasks" in parameters["subworkflow"]: return SubworkflowTaskParameters._load(parameters) + elif type_ == "subworkflow" and "workflowExternalId" in parameters["subworkflow"]: + return SubworkflowReferenceParameters._load(parameters) else: raise ValueError(f"Unknown task type: {type_}. Expected {ValidTaskType}") @@ -319,8 +321,8 @@ class SubworkflowTaskParameters(WorkflowTaskParameters): """ The subworkflow task parameters are used to specify a subworkflow task. - When a workflow is made of stages with dependencies between them, we can use subworkflow tasks for conveniece. It takes the tasks parameter which is an array of - function, transformation, and cdf task definitions. This array needs to be statically set on the worklow definition (if it needs to be defined at runtime, use a + When a workflow is made of stages with dependencies between them, we can use subworkflow tasks for convenience. It takes the tasks parameter which is an array of + function, transformation, cdf, ..., task definitions. This array needs to be statically set on the workflow definition (if it needs to be defined at runtime, use a dynamic task). Args: @@ -344,6 +346,38 @@ def dump(self, camel_case: bool = True) -> dict[str, Any]: return {self.task_type: {"tasks": [task.dump(camel_case) for task in self.tasks]}} +class SubworkflowReferenceParameters(WorkflowTaskParameters): + """ + The subworkflow task parameters are used to specify a subworkflow task. + When a workflow is made of stages with dependencies between them, we can use subworkflow tasks for convenience. + The subworkflow reference is used to specifying a reference to another workflow which will be embedded into the execution at start time. + + Args: + workflow_external_id (str): The external ID of the referenced workflow. + version (str): The version of the referenced workflow. + """ + + task_type = "subworkflow" + + def __init__(self, workflow_external_id: str, version: str) -> None: + self.workflow_external_id = workflow_external_id + self.version = version + + @classmethod + def _load(cls: type[Self], resource: dict, cognite_client: CogniteClient | None = None) -> Self: + subworkflow: dict[str, Any] = resource[cls.task_type] + + return cls(workflow_external_id=subworkflow["workflowExternalId"], version=subworkflow["version"]) + + def dump(self, camel_case: bool = True) -> dict[str, Any]: + return { + self.task_type: { + "workflowExternalId": self.workflow_external_id, + "version": self.version, + } + } + + class DynamicTaskParameters(WorkflowTaskParameters): """ The dynamic task parameters are used to specify a dynamic task. diff --git a/pyproject.toml b/pyproject.toml index de5e8db3d..aed8a0ceb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "cognite-sdk" -version = "7.57.0" +version = "7.58.0" description = "Cognite Python SDK" readme = "README.md" documentation = "https://cognite-sdk-python.readthedocs-hosted.com" From 2fa031886d3d0c72fe0aafa277b27bc7bf5a616e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nina=20=C3=98deg=C3=A5rd?= Date: Tue, 3 Sep 2024 12:03:18 +0200 Subject: [PATCH 07/15] docs: include CredentialProviders class in docs (#1904) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Håkon V. Treider --- cognite/client/credentials.py | 4 ++-- docs/source/credential_providers.rst | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/cognite/client/credentials.py b/cognite/client/credentials.py index 86b64d16b..ed5a24421 100644 --- a/cognite/client/credentials.py +++ b/cognite/client/credentials.py @@ -32,8 +32,8 @@ def load(cls, config: dict[str, Any] | str) -> CredentialProvider: Note: The dictionary must contain exactly one top level key, which is the type of the credential provider and must be one of the - following strings: "token", "client_credentials", "interactive", "device_code", "client_certificate". The value of the key - is a dictionary containing the configuration for the credential provider. + following strings: ``"token"``, ``"client_credentials"``, ``"interactive"``, ``"device_code"``, ``"client_certificate"``. + The value of the key is a dictionary containing the configuration for the credential provider. Args: config (dict[str, Any] | str): A dictionary or YAML/JSON string containing the configuration for the credential provider. diff --git a/docs/source/credential_providers.rst b/docs/source/credential_providers.rst index 6b83c12b8..ce5a28223 100644 --- a/docs/source/credential_providers.rst +++ b/docs/source/credential_providers.rst @@ -1,5 +1,8 @@ Credential Providers ==================== +.. autoclass:: cognite.client.credentials.CredentialProvider + :members: + :member-order: bysource .. autoclass:: cognite.client.credentials.Token :members: :member-order: bysource From 02e43052c9544133123c828cccf42d47215e707a Mon Sep 17 00:00:00 2001 From: Vincent <48801276+vincent-cognite@users.noreply.github.com> Date: Tue, 3 Sep 2024 14:25:48 +0200 Subject: [PATCH 08/15] allow None for workflowExecutionId in WorkflowTriggerRun (#1903) --- CHANGELOG.md | 5 +++++ cognite/client/_version.py | 2 +- cognite/client/data_classes/workflows.py | 7 ++++--- pyproject.toml | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad71ae8dd..b49580bb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,11 @@ Changes are grouped as follows - `Fixed` for any bug fixes. - `Security` in case of vulnerabilities. +## [7.58.1] - 2024-09-03 +### Fixed +- [Feature Preview - beta] data workflows: `workflowExecutionId` in `cognite.client.data_classes.workflows.WorkflowTriggerRun` + can be null or missing, as according to the API spec. + ## [7.58.0] - 2024-09-03 ### Added - Data Workflows: add support for `SubworkflowReferenceParameters` subworkflow task type. Allowing embedding other workflows into a workflow. diff --git a/cognite/client/_version.py b/cognite/client/_version.py index 7034e995f..b4bf6d573 100644 --- a/cognite/client/_version.py +++ b/cognite/client/_version.py @@ -1,4 +1,4 @@ from __future__ import annotations -__version__ = "7.58.0" +__version__ = "7.58.1" __api_subversion__ = "20230101" diff --git a/cognite/client/data_classes/workflows.py b/cognite/client/data_classes/workflows.py index ad63526fc..efae89d72 100644 --- a/cognite/client/data_classes/workflows.py +++ b/cognite/client/data_classes/workflows.py @@ -1420,8 +1420,8 @@ def __init__( fire_time: int, workflow_external_id: str, workflow_version: str, - workflow_execution_id: str, status: Literal["success", "failed"], + workflow_execution_id: str | None = None, reason_for_failure: str | None = None, ) -> None: self.external_id = external_id @@ -1438,9 +1438,10 @@ def dump(self, camel_case: bool = True) -> dict[str, Any]: "fire_time": self.fire_time, "workflow_external_id": self.workflow_external_id, "workflow_version": self.workflow_version, - "workflow_execution_id": self.workflow_execution_id, "status": self.status, } + if self.workflow_execution_id: + item["workflow_execution_id"] = self.workflow_execution_id if self.reason_for_failure: item["reason_for_failure"] = self.reason_for_failure if camel_case: @@ -1454,8 +1455,8 @@ def _load(cls, resource: dict, cognite_client: CogniteClient | None = None) -> W fire_time=resource["fireTime"], workflow_external_id=resource["workflowExternalId"], workflow_version=resource["workflowVersion"], - workflow_execution_id=resource["workflowExecutionId"], status=resource["status"], + workflow_execution_id=resource.get("workflowExecutionId"), reason_for_failure=resource.get("reasonForFailure"), ) diff --git a/pyproject.toml b/pyproject.toml index aed8a0ceb..70327d822 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "cognite-sdk" -version = "7.58.0" +version = "7.58.1" description = "Cognite Python SDK" readme = "README.md" documentation = "https://cognite-sdk-python.readthedocs-hosted.com" From 9c1697781a7ef12cee993251c459567749f17a64 Mon Sep 17 00:00:00 2001 From: Anders Albert <60234212+doctrino@users.noreply.github.com> Date: Tue, 3 Sep 2024 15:00:42 +0200 Subject: [PATCH 09/15] [CDF-22379] Hosted Extractors: Source (#1893) --- CHANGELOG.md | 4 + .../client/_api/hosted_extractors/__init__.py | 16 + .../client/_api/hosted_extractors/sources.py | 275 ++++++++ cognite/client/_api_client.py | 7 +- cognite/client/_cognite_client.py | 2 + cognite/client/_version.py | 2 +- cognite/client/data_classes/_base.py | 2 +- .../data_classes/datapoints_subscriptions.py | 2 +- .../hosted_extractors/__init__.py | 35 + .../data_classes/hosted_extractors/sources.py | 627 ++++++++++++++++++ cognite/client/testing.py | 5 + docs/source/hosted_extractors.rst | 24 + docs/source/index.rst | 1 + pyproject.toml | 2 +- scripts/add_capability.py | 22 +- .../test_hosted_extractors/__init__.py | 0 .../test_hosted_extractors/test_sources.py | 96 +++ tests/tests_unit/test_base.py | 16 +- tests/tests_unit/test_meta.py | 2 +- 19 files changed, 1120 insertions(+), 20 deletions(-) create mode 100644 cognite/client/_api/hosted_extractors/__init__.py create mode 100644 cognite/client/_api/hosted_extractors/sources.py create mode 100644 cognite/client/data_classes/hosted_extractors/__init__.py create mode 100644 cognite/client/data_classes/hosted_extractors/sources.py create mode 100644 docs/source/hosted_extractors.rst create mode 100644 tests/tests_integration/test_api/test_hosted_extractors/__init__.py create mode 100644 tests/tests_integration/test_api/test_hosted_extractors/test_sources.py diff --git a/CHANGELOG.md b/CHANGELOG.md index b49580bb9..2c99ca06e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,10 @@ Changes are grouped as follows - `Fixed` for any bug fixes. - `Security` in case of vulnerabilities. +## [7.58.2] - 2024-09-03 +### Added +- [Feature Preview - alpha] Support for `client.hosted_extractors.sources`. + ## [7.58.1] - 2024-09-03 ### Fixed - [Feature Preview - beta] data workflows: `workflowExecutionId` in `cognite.client.data_classes.workflows.WorkflowTriggerRun` diff --git a/cognite/client/_api/hosted_extractors/__init__.py b/cognite/client/_api/hosted_extractors/__init__.py new file mode 100644 index 000000000..6c6a23a93 --- /dev/null +++ b/cognite/client/_api/hosted_extractors/__init__.py @@ -0,0 +1,16 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +from cognite.client._api.hosted_extractors.sources import SourcesAPI +from cognite.client._api_client import APIClient + +if TYPE_CHECKING: + from cognite.client import CogniteClient + from cognite.client.config import ClientConfig + + +class HostedExtractorsAPI(APIClient): + def __init__(self, config: ClientConfig, api_version: str | None, cognite_client: CogniteClient) -> None: + super().__init__(config, api_version, cognite_client) + self.sources = SourcesAPI(config, api_version, cognite_client) diff --git a/cognite/client/_api/hosted_extractors/sources.py b/cognite/client/_api/hosted_extractors/sources.py new file mode 100644 index 000000000..066930127 --- /dev/null +++ b/cognite/client/_api/hosted_extractors/sources.py @@ -0,0 +1,275 @@ +from __future__ import annotations + +from collections.abc import Iterator +from typing import TYPE_CHECKING, Any, Literal, Sequence, overload + +from cognite.client._api_client import APIClient +from cognite.client._constants import DEFAULT_LIMIT_READ +from cognite.client.data_classes._base import CogniteResource, PropertySpec +from cognite.client.data_classes.hosted_extractors.sources import Source, SourceList, SourceUpdate, SourceWrite +from cognite.client.utils._experimental import FeaturePreviewWarning +from cognite.client.utils._identifier import IdentifierSequence +from cognite.client.utils.useful_types import SequenceNotStr + +if TYPE_CHECKING: + from cognite.client import ClientConfig, CogniteClient + + +class SourcesAPI(APIClient): + _RESOURCE_PATH = "/hostedextractors/sources" + + def __init__(self, config: ClientConfig, api_version: str | None, cognite_client: CogniteClient) -> None: + super().__init__(config, api_version, cognite_client) + self._warning = FeaturePreviewWarning( + api_maturity="alpha", sdk_maturity="alpha", feature_name="Hosted Extractors" + ) + self._CREATE_LIMIT = 100 + self._LIST_LIMIT = 100 + self._RETRIEVE_LIMIT = 100 + self._DELETE_LIMIT = 100 + self._UPDATE_LIMIT = 100 + + @overload + def __call__( + self, + chunk_size: None = None, + limit: int | None = None, + ) -> Iterator[Source]: ... + + @overload + def __call__( + self, + chunk_size: int, + limit: int | None = None, + ) -> Iterator[SourceList]: ... + + def __call__( + self, + chunk_size: int | None = None, + limit: int | None = None, + ) -> Iterator[Source] | Iterator[SourceList]: + """Iterate over sources + + Fetches sources as they are iterated over, so you keep a limited number of sources in memory. + + Args: + chunk_size (int | None): Number of sources to return in each chunk. Defaults to yielding one source a time. + limit (int | None): Maximum number of sources to return. Defaults to returning all items. + + Returns: + Iterator[Source] | Iterator[SourceList]: yields Source one by one if chunk_size is not specified, else SourceList objects. + """ + self._warning.warn() + + return self._list_generator( + list_cls=SourceList, + resource_cls=Source, # type: ignore[type-abstract] + method="GET", + chunk_size=chunk_size, + limit=limit, + headers={"cdf-version": "beta"}, + ) + + def __iter__(self) -> Iterator[Source]: + """Iterate over sources + + Fetches sources as they are iterated over, so you keep a limited number of sources in memory. + + Returns: + Iterator[Source]: yields Source one by one. + """ + return self() + + @overload + def retrieve(self, external_ids: str, ignore_unknown_ids: bool = False) -> Source: ... + + @overload + def retrieve(self, external_ids: SequenceNotStr[str], ignore_unknown_ids: bool = False) -> SourceList: ... + + def retrieve( + self, external_ids: str | SequenceNotStr[str], ignore_unknown_ids: bool = False + ) -> Source | SourceList: + """`Retrieve one or more sources. `_ + + Args: + external_ids (str | SequenceNotStr[str]): The external ID provided by the client. Must be unique for the resource type. + ignore_unknown_ids (bool): Ignore external IDs that are not found rather than throw an exception. + + Returns: + Source | SourceList: Requested sources + + Examples: + + >>> from cognite.client import CogniteClient + >>> client = CogniteClient() + >>> res = client.hosted_extractors.sources.retrieve('myMQTTSource') + + Get multiple sources by id: + + >>> from cognite.client import CogniteClient + >>> client = CogniteClient() + >>> res = client.hosted_extractors.sources.retrieve(["myMQTTSource", "MyEventHubSource"], ignore_unknown_ids=True) + + """ + self._warning.warn() + return self._retrieve_multiple( + list_cls=SourceList, + resource_cls=Source, # type: ignore[type-abstract] + identifiers=IdentifierSequence.load(external_ids=external_ids), + ignore_unknown_ids=ignore_unknown_ids, + headers={"cdf-version": "beta"}, + ) + + def delete( + self, external_ids: str | SequenceNotStr[str], ignore_unknown_ids: bool = False, force: bool = False + ) -> None: + """`Delete one or more sources `_ + + Args: + external_ids (str | SequenceNotStr[str]): The external ID provided by the client. Must be unique for the resource type. + ignore_unknown_ids (bool): Ignore external IDs that are not found rather than throw an exception. + force (bool): Delete any jobs associated with each item. + Examples: + + Delete sources by id:: + + >>> from cognite.client import CogniteClient + >>> client = CogniteClient() + >>> client.hosted_extractors.sources.delete(["myMQTTSource", "MyEventHubSource"]) + """ + self._warning.warn() + extra_body_fields: dict[str, Any] = {} + if ignore_unknown_ids: + extra_body_fields["ignoreUnknownIds"] = True + if force: + extra_body_fields["force"] = True + + self._delete_multiple( + identifiers=IdentifierSequence.load(external_ids=external_ids), + wrap_ids=True, + headers={"cdf-version": "beta"}, + extra_body_fields=extra_body_fields or None, + ) + + @overload + def create(self, items: SourceWrite) -> Source: ... + + @overload + def create(self, items: Sequence[SourceWrite]) -> SourceList: ... + + def create(self, items: SourceWrite | Sequence[SourceWrite]) -> Source | SourceList: + """`Create one or more sources. `_ + + Args: + items (SourceWrite | Sequence[SourceWrite]): Source(s) to create. + + Returns: + Source | SourceList: Created source(s) + + Examples: + + Create new source: + + >>> from cognite.client import CogniteClient + >>> from cognite.client.data_classes.hosted_extractors import EventHubSourceWrite + >>> client = CogniteClient() + >>> source = EventHubSourceWrite('my_event_hub', 'http://myeventhub.com', "My EventHub", 'my_key', 'my_value') + >>> res = client.hosted_extractors.sources.create(source) + """ + self._warning.warn() + return self._create_multiple( + list_cls=SourceList, + resource_cls=Source, # type: ignore[type-abstract] + items=items, # type: ignore[arg-type] + input_resource_cls=SourceWrite, + headers={"cdf-version": "beta"}, + ) + + @overload + def update(self, items: SourceWrite | SourceUpdate) -> Source: ... + + @overload + def update(self, items: Sequence[SourceWrite | SourceUpdate]) -> SourceList: ... + + def update(self, items: SourceWrite | SourceUpdate | Sequence[SourceWrite | SourceUpdate]) -> Source | SourceList: + """`Update one or more sources. `_ + + Args: + items (SourceWrite | SourceUpdate | Sequence[SourceWrite | SourceUpdate]): Source(s) to update. + + Returns: + Source | SourceList: Updated source(s) + + Examples: + + Update source: + + >>> from cognite.client import CogniteClient + >>> from cognite.client.data_classes.hosted_extractors import EventHubSourceUpdate + >>> client = CogniteClient() + >>> source = EventHubSourceUpdate('my_event_hub').event_hub_name.set("My Updated EventHub") + >>> res = client.hosted_extractors.sources.update(source) + """ + self._warning.warn() + return self._update_multiple( + items=items, # type: ignore[arg-type] + list_cls=SourceList, + resource_cls=Source, # type: ignore[type-abstract] + update_cls=SourceUpdate, + headers={"cdf-version": "beta"}, + ) + + @classmethod + def _convert_resource_to_patch_object( + cls, + resource: CogniteResource, + update_attributes: list[PropertySpec], + mode: Literal["replace_ignore_null", "patch", "replace"] = "replace_ignore_null", + ) -> dict[str, dict[str, dict]]: + output = super()._convert_resource_to_patch_object(resource, update_attributes, mode) + if hasattr(resource, "_type"): + output["type"] = resource._type + return output + + def list( + self, + limit: int | None = DEFAULT_LIMIT_READ, + ) -> SourceList: + """`List sources `_ + + Args: + limit (int | None): Maximum number of sources to return. Defaults to 25. Set to -1, float("inf") or None to return all items. + + Returns: + SourceList: List of requested sources + + Examples: + + List sources: + + >>> from cognite.client import CogniteClient + >>> client = CogniteClient() + >>> source_list = client.hosted_extractors.sources.list(limit=5) + + Iterate over sources:: + + >>> from cognite.client import CogniteClient + >>> client = CogniteClient() + >>> for source in client.hosted_extractors.sources: + ... source # do something with the source + + Iterate over chunks of sources to reduce memory load:: + + >>> from cognite.client import CogniteClient + >>> client = CogniteClient() + >>> for source_list in client.hosted_extractors.sources(chunk_size=25): + ... source_list # do something with the sources + """ + self._warning.warn() + return self._list( + list_cls=SourceList, + resource_cls=Source, # type: ignore[type-abstract] + method="GET", + limit=limit, + headers={"cdf-version": "beta"}, + ) diff --git a/cognite/client/_api_client.py b/cognite/client/_api_client.py index 74f9d4c8e..f58946a6c 100644 --- a/cognite/client/_api_client.py +++ b/cognite/client/_api_client.py @@ -106,6 +106,7 @@ class APIClient: "transformations/(filter|byids|jobs/byids|schedules/byids|query/run)", "extpipes/(list|byids|runs/list)", "workflows/.*", + "hostedextractors/.*", ) ) ] @@ -1038,7 +1039,11 @@ def _update_multiple( for index, item in enumerate(item_list): if isinstance(item, CogniteResource): patch_objects.append( - self._convert_resource_to_patch_object(item, update_cls._get_update_properties(item), mode) + self._convert_resource_to_patch_object( + item, + update_cls._get_update_properties(item), + mode, + ) ) elif isinstance(item, CogniteUpdate): patch_objects.append(item.dump(camel_case=True)) diff --git a/cognite/client/_cognite_client.py b/cognite/client/_cognite_client.py index 559143b09..12d83162f 100644 --- a/cognite/client/_cognite_client.py +++ b/cognite/client/_cognite_client.py @@ -16,6 +16,7 @@ from cognite.client._api.files import FilesAPI from cognite.client._api.functions import FunctionsAPI from cognite.client._api.geospatial import GeospatialAPI +from cognite.client._api.hosted_extractors import HostedExtractorsAPI from cognite.client._api.iam import IAMAPI from cognite.client._api.labels import LabelsAPI from cognite.client._api.raw import RawAPI @@ -71,6 +72,7 @@ def __init__(self, config: ClientConfig | None = None) -> None: self.templates = TemplatesAPI(self._config, self._API_VERSION, self) self.vision = VisionAPI(self._config, self._API_VERSION, self) self.extraction_pipelines = ExtractionPipelinesAPI(self._config, self._API_VERSION, self) + self.hosted_extractors = HostedExtractorsAPI(self._config, self._API_VERSION, self) self.transformations = TransformationsAPI(self._config, self._API_VERSION, self) self.diagrams = DiagramsAPI(self._config, self._API_VERSION, self) self.annotations = AnnotationsAPI(self._config, self._API_VERSION, self) diff --git a/cognite/client/_version.py b/cognite/client/_version.py index b4bf6d573..b1cad4426 100644 --- a/cognite/client/_version.py +++ b/cognite/client/_version.py @@ -1,4 +1,4 @@ from __future__ import annotations -__version__ = "7.58.1" +__version__ = "7.58.2" __api_subversion__ = "20230101" diff --git a/cognite/client/data_classes/_base.py b/cognite/client/data_classes/_base.py index 551c861b3..3856850bd 100644 --- a/cognite/client/data_classes/_base.py +++ b/cognite/client/data_classes/_base.py @@ -528,7 +528,7 @@ def __init__(self, update_object: T_CogniteUpdate, name: str) -> None: self._update_object = update_object self._name = name - def _set(self, value: None | str | int | bool) -> T_CogniteUpdate: + def _set(self, value: None | str | int | bool | dict) -> T_CogniteUpdate: if value is None: self._update_object._set_null(self._name) else: diff --git a/cognite/client/data_classes/datapoints_subscriptions.py b/cognite/client/data_classes/datapoints_subscriptions.py index 273cc1eed..806595d4d 100644 --- a/cognite/client/data_classes/datapoints_subscriptions.py +++ b/cognite/client/data_classes/datapoints_subscriptions.py @@ -185,7 +185,7 @@ def set(self, value: Any) -> DataPointSubscriptionUpdate: class _FilterDataPointSubscriptionUpdate(CognitePrimitiveUpdate): def set(self, value: Filter) -> DataPointSubscriptionUpdate: - return self._set(value.dump()) # type: ignore[arg-type] + return self._set(value.dump()) class _ListDataPointSubscriptionUpdate(CogniteListUpdate): def set(self, value: list) -> DataPointSubscriptionUpdate: diff --git a/cognite/client/data_classes/hosted_extractors/__init__.py b/cognite/client/data_classes/hosted_extractors/__init__.py new file mode 100644 index 000000000..abadfb1c4 --- /dev/null +++ b/cognite/client/data_classes/hosted_extractors/__init__.py @@ -0,0 +1,35 @@ +from __future__ import annotations + +from cognite.client.data_classes.hosted_extractors.sources import ( + EventHubSource, + EventHubSourceUpdate, + EventHubSourceWrite, + MQTT3Source, + MQTT3SourceUpdate, + MQTT3SourceWrite, + MQTT5Source, + MQTT5SourceUpdate, + MQTT5SourceWrite, + Source, + SourceList, + SourceUpdate, + SourceWrite, + SourceWriteList, +) + +__all__ = [ + "EventHubSource", + "EventHubSourceWrite", + "MQTT3Source", + "MQTT3SourceWrite", + "MQTT5Source", + "MQTT5SourceWrite", + "Source", + "SourceList", + "SourceWrite", + "SourceWriteList", + "SourceUpdate", + "MQTT3SourceUpdate", + "MQTT5SourceUpdate", + "EventHubSourceUpdate", +] diff --git a/cognite/client/data_classes/hosted_extractors/sources.py b/cognite/client/data_classes/hosted_extractors/sources.py new file mode 100644 index 000000000..640244db8 --- /dev/null +++ b/cognite/client/data_classes/hosted_extractors/sources.py @@ -0,0 +1,627 @@ +from __future__ import annotations + +import itertools +from abc import ABC, abstractmethod +from dataclasses import dataclass +from typing import TYPE_CHECKING, Any, ClassVar, Literal, NoReturn, cast + +from typing_extensions import Self + +from cognite.client.data_classes._base import ( + CogniteObject, + CognitePrimitiveUpdate, + CogniteResource, + CogniteResourceList, + CogniteUpdate, + ExternalIDTransformerMixin, + PropertySpec, + T_WriteClass, + UnknownCogniteObject, + WriteableCogniteResource, + WriteableCogniteResourceList, +) + +if TYPE_CHECKING: + from cognite.client import CogniteClient + + +class SourceWrite(CogniteResource, ABC): + """A hosted extractor source represents an external source system on the internet. + The source resource in CDF contains all the information the extractor needs to + connect to the external source system. + + This is the write/request format of the source resource. + + Args: + external_id (str): The external ID provided by the client. Must be unique for the resource type. + """ + + _type: ClassVar[str] + + def __init__(self, external_id: str) -> None: + self.external_id = external_id + + @classmethod + @abstractmethod + def _load_source(cls, resource: dict[str, Any]) -> Self: + raise NotImplementedError() + + @classmethod + def _load(cls, resource: dict[str, Any], cognite_client: CogniteClient | None = None) -> Self: + type_ = resource.get("type") + if type_ is None and hasattr(cls, "_type"): + type_ = cls._type + elif type_ is None: + raise KeyError("type") + try: + return cast(Self, _SOURCE_WRITE_CLASS_BY_TYPE[type_]._load_source(resource)) + except KeyError: + raise TypeError(f"Unknown source type: {type_}") + + def dump(self, camel_case: bool = True) -> dict[str, Any]: + output = super().dump(camel_case) + output["type"] = self._type + return output + + +class Source(WriteableCogniteResource[T_WriteClass], ABC): + """A hosted extractor source represents an external source system on the internet. + The source resource in CDF contains all the information the extractor needs to + connect to the external source system. + + This is the read/response format of the source resource. + + Args: + external_id (str): The external ID provided by the client. Must be unique for the resource type. + """ + + _type: ClassVar[str] + + def __init__(self, external_id: str) -> None: + self.external_id = external_id + + @classmethod + @abstractmethod + def _load_source(cls, resource: dict[str, Any]) -> Self: + raise NotImplementedError() + + @classmethod + def _load(cls, resource: dict[str, Any], cognite_client: CogniteClient | None = None) -> Self: + type_ = resource.get("type") + if type_ is None and hasattr(cls, "_type"): + type_ = cls._type + elif type_ is None: + raise KeyError("type") + source_class = _SOURCE_CLASS_BY_TYPE.get(type_) + if source_class is None: + return UnknownCogniteObject(resource) # type: ignore[return-value] + return cast(Self, source_class._load_source(resource)) + + def dump(self, camel_case: bool = True) -> dict[str, Any]: + output = super().dump(camel_case) + output["type"] = self._type + return output + + +class SourceUpdate(CogniteUpdate, ABC): + _type: ClassVar[str] + + def __init__(self, external_id: str) -> None: + super().__init__(external_id=external_id) + + def dump(self, camel_case: Literal[True] = True) -> dict[str, Any]: + output = super().dump(camel_case) + output["type"] = self._type + return output + + @classmethod + def _get_update_properties(cls, item: CogniteResource | None = None) -> list[PropertySpec]: + if item is None or not isinstance(item, SourceWrite): + return [] + return _SOURCE_UPDATE_BY_TYPE[item._type]._get_update_properties(item) + + @classmethod + def _get_extra_identifying_properties(cls, item: CogniteResource | None = None) -> dict[str, Any]: + if not isinstance(item, SourceWrite): + return {} + return {"type": item._type} + + +class EventHubSourceWrite(SourceWrite): + """A hosted extractor source represents an external source system on the internet. + The source resource in CDF contains all the information the extractor needs to + connect to the external source system. + + This is the write/request format of the source resource. + + Args: + external_id (str): The external ID provided by the client. Must be unique for the resource type. + host (str): URL of the event hub consumer endpoint. + event_hub_name (str): Name of the event hub + key_name (str): The name of the Event Hub key to use. + key_value (str): Value of the Event Hub key to use for authentication. + consumer_group (str | None): The event hub consumer group to use. Microsoft recommends having a distinct consumer group for each application consuming data from event hub. If left out, this uses the default consumer group. + """ + + _type = "eventhub" + + def __init__( + self, + external_id: str, + host: str, + event_hub_name: str, + key_name: str, + key_value: str, + consumer_group: str | None = None, + ) -> None: + super().__init__(external_id) + self.host = host + self.event_hub_name = event_hub_name + self.key_name = key_name + self.key_value = key_value + self.consumer_group = consumer_group + + def as_write(self) -> SourceWrite: + return self + + @classmethod + def _load_source(cls, resource: dict[str, Any]) -> Self: + return cls( + external_id=resource["externalId"], + host=resource["host"], + event_hub_name=resource["eventHubName"], + key_name=resource["keyName"], + key_value=resource["keyValue"], + consumer_group=resource.get("consumerGroup"), + ) + + +class EventHubSource(Source): + """A hosted extractor source represents an external source system on the internet. + The source resource in CDF contains all the information the extractor needs to + connect to the external source system. + + This is the read/response format of the source resource. + + Args: + external_id (str): The external ID provided by the client. Must be unique for the resource type. + host (str): URL of the event hub consumer endpoint. + event_hub_name (str): Name of the event hub + key_name (str): The name of the Event Hub key to use. + created_time (int): No description. + last_updated_time (int): No description. + consumer_group (str | None): The event hub consumer group to use. Microsoft recommends having a distinct consumer group for each application consuming data from event hub. If left out, this uses the default consumer group. + """ + + _type = "eventhub" + + def __init__( + self, + external_id: str, + host: str, + event_hub_name: str, + key_name: str, + created_time: int, + last_updated_time: int, + consumer_group: str | None = None, + ) -> None: + super().__init__(external_id) + self.host = host + self.event_hub_name = event_hub_name + self.key_name = key_name + self.consumer_group = consumer_group + self.created_time = created_time + self.last_updated_time = last_updated_time + + def as_write(self) -> NoReturn: + raise TypeError(f"{type(self).__name__} cannot be converted to write as id does not contain the secrets") + + @classmethod + def _load_source(cls, resource: dict[str, Any]) -> Self: + return cls( + external_id=resource["externalId"], + host=resource["host"], + event_hub_name=resource["eventHubName"], + key_name=resource["keyName"], + created_time=resource["createdTime"], + last_updated_time=resource["lastUpdatedTime"], + consumer_group=resource.get("consumerGroup"), + ) + + +class EventHubSourceUpdate(SourceUpdate): + _type = "eventhub" + + class _PrimitiveEventHubSourceUpdate(CognitePrimitiveUpdate): + def set(self, value: str) -> EventHubSourceUpdate: + return self._set(value) + + class _PrimitiveNullableEventHubSourceUpdate(CognitePrimitiveUpdate): + def set(self, value: str | None) -> EventHubSourceUpdate: + return self._set(value) + + @property + def host(self) -> _PrimitiveEventHubSourceUpdate: + return EventHubSourceUpdate._PrimitiveEventHubSourceUpdate(self, "host") + + @property + def event_hub_name(self) -> _PrimitiveEventHubSourceUpdate: + return EventHubSourceUpdate._PrimitiveEventHubSourceUpdate(self, "eventHubName") + + @property + def key_name(self) -> _PrimitiveEventHubSourceUpdate: + return EventHubSourceUpdate._PrimitiveEventHubSourceUpdate(self, "keyName") + + @property + def key_value(self) -> _PrimitiveEventHubSourceUpdate: + return EventHubSourceUpdate._PrimitiveEventHubSourceUpdate(self, "keyValue") + + @property + def consumer_group(self) -> _PrimitiveNullableEventHubSourceUpdate: + return EventHubSourceUpdate._PrimitiveNullableEventHubSourceUpdate(self, "consumerGroup") + + @classmethod + def _get_update_properties(cls, item: CogniteResource | None = None) -> list[PropertySpec]: + return [ + PropertySpec("host", is_nullable=False), + PropertySpec("event_hub_name", is_nullable=False), + PropertySpec("key_name", is_nullable=False), + PropertySpec("key_value", is_nullable=False), + PropertySpec("consumer_group", is_nullable=True), + ] + + +@dataclass +class MQTTAuthenticationWrite(CogniteObject, ABC): + _type: ClassVar[str] + + @classmethod + @abstractmethod + def _load_authentication(cls, resource: dict[str, Any]) -> Self: + raise NotImplementedError() + + @classmethod + def _load(cls, resource: dict[str, Any], cognite_client: CogniteClient | None = None) -> Self: + type_ = resource.get("type") + if type_ is None and hasattr(cls, "_type"): + type_ = cls._type + elif type_ is None: + raise KeyError("type is required") + try: + return cast(Self, _MQTTAUTHENTICATION_WRITE_CLASS_BY_TYPE[type_]._load_authentication(resource)) + except KeyError: + raise TypeError(f"Unknown authentication type: {type_}") + + def dump(self, camel_case: bool = True) -> dict[str, Any]: + output = super().dump(camel_case) + output["type"] = self._type + return output + + +@dataclass +class BasicMQTTAuthenticationWrite(MQTTAuthenticationWrite): + _type = "basic" + username: str + password: str | None + + @classmethod + def _load_authentication(cls, resource: dict[str, Any]) -> Self: + return cls( + username=resource["username"], + password=resource.get("password"), + ) + + +@dataclass +class CACertificateWrite(CogniteObject): + type: Literal["der", "pem"] + certificate: str + + @classmethod + def _load(cls, resource: dict[str, Any], cognite_client: CogniteClient | None = None) -> Self: + return cls(type=resource["type"], certificate=resource["certificate"]) + + +@dataclass +class AuthCertificateWrite(CogniteObject): + type: Literal["der", "pem"] + certificate: str + key: str + key_password: str | None + + @classmethod + def _load(cls, resource: dict[str, Any], cognite_client: CogniteClient | None = None) -> Self: + return cls( + type=resource["type"], + certificate=resource["certificate"], + key=resource["key"], + key_password=resource.get("keyPassword"), + ) + + +class _MQTTSourceWrite(SourceWrite, ABC): + def __init__( + self, + external_id: str, + host: str, + port: int | None = None, + authentication: MQTTAuthenticationWrite | None = None, + use_tls: bool = False, + ca_certificate: CACertificateWrite | None = None, + auth_certificate: AuthCertificateWrite | None = None, + ) -> None: + super().__init__(external_id) + self.host = host + self.port = port + self.authentication = authentication + self.use_tls = use_tls + self.ca_certificate = ca_certificate + self.auth_certificate = auth_certificate + + @classmethod + def _load_source(cls, resource: dict[str, Any]) -> Self: + return cls( + external_id=resource["externalId"], + host=resource["host"], + port=resource.get("port"), + authentication=MQTTAuthenticationWrite._load(resource["authentication"]) + if "authentication" in resource + else None, + use_tls=resource.get("useTls", False), + ca_certificate=CACertificateWrite._load(resource["caCertificate"]) if "caCertificate" in resource else None, + auth_certificate=AuthCertificateWrite._load(resource["authCertificate"]) + if "authCertificate" in resource + else None, + ) + + def dump(self, camel_case: bool = True) -> dict[str, Any]: + output = super().dump(camel_case) + if isinstance(self.authentication, MQTTAuthenticationWrite): + output["authentication"] = self.authentication.dump(camel_case) + if isinstance(self.ca_certificate, CACertificateWrite): + output["caCertificate" if camel_case else "ca_certificate"] = self.ca_certificate.dump(camel_case) + if isinstance(self.auth_certificate, AuthCertificateWrite): + output["authCertificate" if camel_case else "auth_certificate"] = self.auth_certificate.dump(camel_case) + return output + + +@dataclass +class MQTTAuthentication(CogniteObject, ABC): + _type: ClassVar[str] + + @classmethod + @abstractmethod + def _load_authentication(cls, resource: dict[str, Any]) -> Self: + raise NotImplementedError() + + @classmethod + def _load(cls, resource: dict[str, Any], cognite_client: CogniteClient | None = None) -> Self: + type_ = resource.get("type") + if type_ is None and hasattr(cls, "_type"): + type_ = cls._type + elif type_ is None: + raise KeyError("type") + + authentication_class = _MQTTAUTHENTICATION_CLASS_BY_TYPE.get(type_) + if authentication_class is None: + return UnknownCogniteObject(resource) # type: ignore[return-value] + return cast(Self, authentication_class._load_authentication(resource)) + + def dump(self, camel_case: bool = True) -> dict[str, Any]: + output = super().dump(camel_case) + output["type"] = self._type + return output + + +@dataclass +class BasicMQTTAuthentication(MQTTAuthentication): + _type = "basic" + username: str + + @classmethod + def _load_authentication(cls, resource: dict[str, Any]) -> Self: + return cls(username=resource["username"]) + + +@dataclass +class CACertificate(CogniteObject): + thumbprint: str + expires_at: str + + @classmethod + def _load(cls, resource: dict[str, Any], cognite_client: CogniteClient | None = None) -> Self: + return cls(thumbprint=resource["thumbprint"], expires_at=resource["expiresAt"]) + + +@dataclass +class AuthCertificate(CogniteObject): + thumbprint: str + expires_at: str + + @classmethod + def _load(cls, resource: dict[str, Any], cognite_client: CogniteClient | None = None) -> Self: + return cls(thumbprint=resource["thumbprint"], expires_at=resource["expiresAt"]) + + +class _MQTTSource(Source, ABC): + def __init__( + self, + external_id: str, + host: str, + created_time: int, + last_updated_time: int, + port: int | None = None, + authentication: MQTTAuthentication | None = None, + use_tls: bool = False, + ca_certificate: CACertificate | None = None, + auth_certificate: AuthCertificate | None = None, + ) -> None: + super().__init__(external_id) + self.host = host + self.port = port + self.authentication = authentication + self.use_tls = use_tls + self.ca_certificate = ca_certificate + self.auth_certificate = auth_certificate + self.created_time = created_time + self.last_updated_time = last_updated_time + + @classmethod + def _load_source(cls, resource: dict[str, Any]) -> Self: + return cls( + external_id=resource["externalId"], + host=resource["host"], + port=resource.get("port"), + authentication=MQTTAuthentication._load(resource["authentication"]) + if "authentication" in resource + else None, + use_tls=resource.get("useTls", False), + ca_certificate=CACertificate._load(resource["caCertificate"]) if "caCertificate" in resource else None, + auth_certificate=AuthCertificate._load(resource["authCertificate"]) + if "authCertificate" in resource + else None, + created_time=resource["createdTime"], + last_updated_time=resource["lastUpdatedTime"], + ) + + def as_write(self) -> NoReturn: + raise TypeError(f"{type(self).__name__} cannot be converted to write as id does not contain the secrets") + + def dump(self, camel_case: bool = True) -> dict[str, Any]: + output = super().dump(camel_case) + if isinstance(self.authentication, MQTTAuthentication): + output["authentication"] = self.authentication.dump(camel_case) + if isinstance(self.ca_certificate, CACertificate): + output["caCertificate" if camel_case else "ca_certificate"] = self.ca_certificate.dump(camel_case) + if isinstance(self.auth_certificate, AuthCertificate): + output["authCertificate" if camel_case else "auth_certificate"] = self.auth_certificate.dump(camel_case) + return output + + +class _MQTTUpdate(SourceUpdate, ABC): + class _HostUpdate(CognitePrimitiveUpdate): + def set(self, value: str) -> _MQTTUpdate: + return self._set(value) + + class _PortUpdate(CognitePrimitiveUpdate): + def set(self, value: int | None) -> _MQTTUpdate: + return self._set(value) + + class _AuthenticationUpdate(CognitePrimitiveUpdate): + def set(self, value: MQTTAuthentication | None) -> _MQTTUpdate: + return self._set(value.dump() if value else None) + + class _UseTlsUpdate(CognitePrimitiveUpdate): + def set(self, value: bool) -> _MQTTUpdate: + return self._set(value) + + class _CACertificateUpdate(CognitePrimitiveUpdate): + def set(self, value: CACertificate | None) -> _MQTTUpdate: + return self._set(value.dump() if value else None) + + class _AuthCertificateUpdate(CognitePrimitiveUpdate): + def set(self, value: AuthCertificate | None) -> _MQTTUpdate: + return self._set(value.dump() if value else None) + + @property + def host(self) -> _HostUpdate: + return _MQTTUpdate._HostUpdate(self, "host") + + @property + def port(self) -> _PortUpdate: + return _MQTTUpdate._PortUpdate(self, "port") + + @property + def authentication(self) -> _AuthenticationUpdate: + return _MQTTUpdate._AuthenticationUpdate(self, "authentication") + + @property + def useTls(self) -> _UseTlsUpdate: + return _MQTTUpdate._UseTlsUpdate(self, "useTls") + + @property + def ca_certificate(self) -> _CACertificateUpdate: + return _MQTTUpdate._CACertificateUpdate(self, "caCertificate") + + @property + def auth_certificate(self) -> _AuthCertificateUpdate: + return _MQTTUpdate._AuthCertificateUpdate(self, "authCertificate") + + @classmethod + def _get_update_properties(cls, item: CogniteResource | None = None) -> list[PropertySpec]: + return [ + PropertySpec("host", is_nullable=False), + PropertySpec("port", is_nullable=True), + PropertySpec("authentication", is_nullable=True, is_container=True), + PropertySpec("useTls", is_nullable=False), + PropertySpec("ca_certificate", is_nullable=True, is_container=True), + PropertySpec("auth_certificate", is_nullable=True, is_container=True), + ] + + +class MQTT3SourceWrite(_MQTTSourceWrite): + _type = "mqtt3" + + +class MQTT5SourceWrite(_MQTTSourceWrite): + _type = "mqtt5" + + +class MQTT3Source(_MQTTSource): + _type = "mqtt3" + + +class MQTT5Source(_MQTTSource): + _type = "mqtt5" + + +class MQTT3SourceUpdate(_MQTTUpdate): + _type = "mqtt3" + + +class MQTT5SourceUpdate(_MQTTUpdate): + _type = "mqtt5" + + +class SourceWriteList(CogniteResourceList[SourceWrite], ExternalIDTransformerMixin): + _RESOURCE = SourceWrite + + +class SourceList(WriteableCogniteResourceList[SourceWrite, Source], ExternalIDTransformerMixin): + _RESOURCE = Source + + def as_write( + self, + ) -> NoReturn: + raise TypeError(f"{type(self).__name__} cannot be converted to write") + + +_SOURCE_WRITE_CLASS_BY_TYPE: dict[str, type[SourceWrite]] = { + subclass._type: subclass # type: ignore[misc] + for subclass in itertools.chain(SourceWrite.__subclasses__(), _MQTTSourceWrite.__subclasses__()) + if hasattr(subclass, "_type") +} + +_SOURCE_CLASS_BY_TYPE: dict[str, type[Source]] = { + subclass._type: subclass # type: ignore[misc] + for subclass in itertools.chain(Source.__subclasses__(), _MQTTSource.__subclasses__()) + if hasattr(subclass, "_type") +} + +_SOURCE_UPDATE_BY_TYPE: dict[str, type[SourceUpdate]] = { + subclass._type: subclass + for subclass in itertools.chain(SourceUpdate.__subclasses__(), _MQTTUpdate.__subclasses__()) + if hasattr(subclass, "_type") +} + +_MQTTAUTHENTICATION_WRITE_CLASS_BY_TYPE: dict[str, type[MQTTAuthenticationWrite]] = { + subclass._type: subclass # type: ignore[type-abstract] + for subclass in MQTTAuthenticationWrite.__subclasses__() + if hasattr(subclass, "_type") +} + +_MQTTAUTHENTICATION_CLASS_BY_TYPE: dict[str, type[MQTTAuthentication]] = { + subclass._type: subclass # type: ignore[type-abstract] + for subclass in MQTTAuthentication.__subclasses__() + if hasattr(subclass, "_type") +} diff --git a/cognite/client/testing.py b/cognite/client/testing.py index bfc3f8593..a4bfcb6f3 100644 --- a/cognite/client/testing.py +++ b/cognite/client/testing.py @@ -29,6 +29,8 @@ from cognite.client._api.files import FilesAPI from cognite.client._api.functions import FunctionCallsAPI, FunctionsAPI, FunctionSchedulesAPI from cognite.client._api.geospatial import GeospatialAPI +from cognite.client._api.hosted_extractors import HostedExtractorsAPI +from cognite.client._api.hosted_extractors.sources import SourcesAPI from cognite.client._api.iam import IAMAPI, GroupsAPI, SecurityCategoriesAPI, SessionsAPI, TokenAPI from cognite.client._api.labels import LabelsAPI from cognite.client._api.raw import RawAPI, RawDatabasesAPI, RawRowsAPI, RawTablesAPI @@ -136,6 +138,9 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: self.sequences = MagicMock(spec=SequencesAPI) self.sequences.data = MagicMock(spec_set=SequencesDataAPI) + self.hosted_extractors = MagicMock(spec=HostedExtractorsAPI) + self.hosted_extractors.sources = MagicMock(spec_set=SourcesAPI) + self.templates = MagicMock(spec=TemplatesAPI) self.templates.groups = MagicMock(spec_set=TemplateGroupsAPI) self.templates.instances = MagicMock(spec_set=TemplateInstancesAPI) diff --git a/docs/source/hosted_extractors.rst b/docs/source/hosted_extractors.rst new file mode 100644 index 000000000..afc45101d --- /dev/null +++ b/docs/source/hosted_extractors.rst @@ -0,0 +1,24 @@ +Hosted Extractors +================= + +Sources +------- +Create new source +^^^^^^^^^^^^^^^^^^ +.. automethod:: cognite.client._api.hosted_extractors.SourcesAPI.create + +Delete source +^^^^^^^^^^^^^^^^^^ +.. automethod:: cognite.client._api.hosted_extractors.SourcesAPI.delete + +List sources +^^^^^^^^^^^^^^^^^^ +.. automethod:: cognite.client._api.hosted_extractors.SourcesAPI.list + +Retrieve sources +^^^^^^^^^^^^^^^^^^ +.. automethod:: cognite.client._api.hosted_extractors.SourcesAPI.retrieve + +Update sources +^^^^^^^^^^^^^^^^^^ +.. automethod:: cognite.client._api.hosted_extractors.SourcesAPI.update diff --git a/docs/source/index.rst b/docs/source/index.rst index f8d2044fc..1881c108b 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -50,6 +50,7 @@ Contents contextualization documents data_ingestion + hosted_extractors data_organization transformations functions diff --git a/pyproject.toml b/pyproject.toml index 70327d822..777549750 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "cognite-sdk" -version = "7.58.1" +version = "7.58.2" description = "Cognite Python SDK" readme = "README.md" documentation = "https://cognite-sdk-python.readthedocs-hosted.com" diff --git a/scripts/add_capability.py b/scripts/add_capability.py index b47c8ae21..1240d5190 100644 --- a/scripts/add_capability.py +++ b/scripts/add_capability.py @@ -2,6 +2,7 @@ from pathlib import Path from cognite.client import CogniteClient +from cognite.client.data_classes.capabilities import Capability TMP_DIR = Path(__file__).resolve().parent / "tmp" @@ -9,9 +10,9 @@ def main(client: CogniteClient): new_capabilities = [ { - "experimentAcl": { - "actions": ["USE"], - "scope": {"experimentscope": {"experiments": ["workflowOrchestrator"]}}, + "hostedExtractorsAcl": { + "actions": ["READ", "WRITE"], + "scope": {"all": {}}, } }, ] @@ -33,28 +34,27 @@ def main(client: CogniteClient): (TMP_DIR / f"{selected_group.name}.json").write_text(json.dumps(selected_group.dump(camel_case=True), indent=4)) existing_capability_by_name = { - next(iter(capability.keys())): capability for capability in selected_group.capabilities + capability._capability_name: capability for capability in selected_group.capabilities } added = [] for new_capability in new_capabilities: (capability_name,) = new_capability.keys() if capability_name not in existing_capability_by_name: - selected_group.capabilities.append(new_capability) + selected_group.capabilities.append(Capability.load(new_capability)) added.append(capability_name) elif new_capability[capability_name] != existing_capability_by_name[capability_name]: # Capability exists, but with different scope or actions - selected_group.capabilities.append(new_capability) - added.append(capability_name) + raise NotImplementedError() + # selected_group.capabilities.append(new_capability) + # added.append(capability_name) else: print(f"Capability {capability_name} already exists") if not added: print("All capabilities already exists") return delete_id = selected_group.id - selected_group.id = None - selected_group.is_deleted = None - selected_group.deleted_time = None - client.iam.groups.create(selected_group) + selected_group_write = selected_group.as_write() + client.iam.groups.create(selected_group_write) client.iam.groups.delete(delete_id) diff --git a/tests/tests_integration/test_api/test_hosted_extractors/__init__.py b/tests/tests_integration/test_api/test_hosted_extractors/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/tests_integration/test_api/test_hosted_extractors/test_sources.py b/tests/tests_integration/test_api/test_hosted_extractors/test_sources.py new file mode 100644 index 000000000..08cba2afb --- /dev/null +++ b/tests/tests_integration/test_api/test_hosted_extractors/test_sources.py @@ -0,0 +1,96 @@ +from __future__ import annotations + +import platform + +import pytest + +from cognite.client import CogniteClient +from cognite.client.data_classes.hosted_extractors import ( + EventHubSource, + EventHubSourceUpdate, + EventHubSourceWrite, + SourceList, +) +from cognite.client.exceptions import CogniteAPIError +from cognite.client.utils._text import random_string + + +@pytest.fixture(scope="session") +def one_event_hub_source(cognite_client: CogniteClient) -> SourceList: + my_hub = EventHubSourceWrite( + external_id=f"myNewHub-{platform.system()}-{platform.python_version()}", + host="myHost", + key_name="myKeyName", + key_value="myKey", + event_hub_name="myEventHub", + ) + retrieved = cognite_client.hosted_extractors.sources.retrieve([my_hub.external_id], ignore_unknown_ids=True) + if retrieved: + return retrieved + return cognite_client.hosted_extractors.sources.create([my_hub]) + + +class TestSources: + def test_create_update_retrieve_delete(self, cognite_client: CogniteClient) -> None: + my_hub = EventHubSourceWrite( + external_id=f"myNewHub-{random_string(10)}", + host="myHost", + key_name="myKeyName", + key_value="myKey", + event_hub_name="myEventHub", + ) + created: EventHubSource | None = None + try: + created = cognite_client.hosted_extractors.sources.create(my_hub) + assert isinstance(created, EventHubSource) + update = EventHubSourceUpdate(external_id=my_hub.external_id).event_hub_name.set("myNewEventHub") + updated = cognite_client.hosted_extractors.sources.update(update) + assert updated.event_hub_name == "myNewEventHub" + retrieved = cognite_client.hosted_extractors.sources.retrieve(created.external_id) + assert retrieved is not None + assert retrieved.external_id == created.external_id + assert retrieved.event_hub_name == "myNewEventHub" + + cognite_client.hosted_extractors.sources.delete(created.external_id) + + with pytest.raises(CogniteAPIError): + cognite_client.hosted_extractors.sources.retrieve(created.external_id) + + cognite_client.hosted_extractors.sources.retrieve(created.external_id, ignore_unknown_ids=True) + + finally: + if created: + cognite_client.hosted_extractors.sources.delete(created.external_id, ignore_unknown_ids=True) + + @pytest.mark.usefixtures("one_event_hub_source") + def test_list(self, cognite_client: CogniteClient) -> None: + res = cognite_client.hosted_extractors.sources.list(limit=1) + assert len(res) == 1 + assert isinstance(res, SourceList) + + def test_update_using_write_object(self, cognite_client: CogniteClient) -> None: + my_hub = EventHubSourceWrite( + external_id=f"to-update-{random_string(10)}", + host="myHost", + key_name="myKeyName", + key_value="myKey", + event_hub_name="myEventHub", + ) + created: EventHubSource | None = None + try: + created = cognite_client.hosted_extractors.sources.create(my_hub) + + my_new_hub = EventHubSourceWrite( + external_id=created.external_id, + host="updatedHost", + key_name="updatedKeyName", + key_value="updatedKey", + event_hub_name="updatedEventHub", + ) + + updated = cognite_client.hosted_extractors.sources.update(my_new_hub) + + assert updated.host == my_new_hub.host + finally: + if created: + cognite_client.hosted_extractors.sources.delete(created.external_id, ignore_unknown_ids=True) diff --git a/tests/tests_unit/test_base.py b/tests/tests_unit/test_base.py index 1d7232564..317a82945 100644 --- a/tests/tests_unit/test_base.py +++ b/tests/tests_unit/test_base.py @@ -36,10 +36,11 @@ ) from cognite.client.data_classes.datapoints import DatapointsArray from cognite.client.data_classes.events import Event, EventList +from cognite.client.data_classes.hosted_extractors import Source, SourceList from cognite.client.exceptions import CogniteMissingClientError from cognite.client.testing import CogniteClientMock from cognite.client.utils import _json -from tests.utils import FakeCogniteResourceGenerator, all_concrete_subclasses, all_subclasses +from tests.utils import FakeCogniteResourceGenerator, all_concrete_subclasses class MyResource(CogniteResource): @@ -192,7 +193,9 @@ def test_dump_load_only_required( "cognite_writable_cls", [ pytest.param(cls, id=f"{cls.__name__} in {cls.__module__}") + # Hosted extractors does not support the as_write method for cls in all_concrete_subclasses(WriteableCogniteResource) + if not issubclass(cls, Source) ], ) def test_writable_as_write( @@ -210,7 +213,7 @@ def test_writable_as_write( [ pytest.param(cls, id=f"{cls.__name__} in {cls.__module__}") for cls in all_concrete_subclasses(WriteableCogniteResourceList) - if cls not in [EdgeListWithCursor, NodeListWithCursor] + if cls not in [EdgeListWithCursor, NodeListWithCursor, SourceList] ], ) def test_writable_list_as_write( @@ -762,13 +765,20 @@ def test_get_update_properties(self): assert hasattr(MyUpdate, "columns") and "columns" not in props assert {"string", "list", "object", "labels"} == set(props) - @pytest.mark.parametrize("cognite_update_subclass", all_subclasses(CogniteUpdate)) + @pytest.mark.parametrize("cognite_update_subclass", all_concrete_subclasses(CogniteUpdate)) def test_correct_implementation_get_update_properties(self, cognite_update_subclass: CogniteUpdate): expected = sorted( key for key in cognite_update_subclass.__dict__ if not key.startswith("_") and key not in {"columns", "dump"} ) + if not expected: + # Check parent class if there are no attributes in the subclass + expected = sorted( + key + for key in cognite_update_subclass.__bases__[0].__dict__ + if not key.startswith("_") and key != "dump" + ) actual = sorted(prop.name for prop in cognite_update_subclass._get_update_properties()) assert expected == actual diff --git a/tests/tests_unit/test_meta.py b/tests/tests_unit/test_meta.py index 30d38c12a..df4199468 100644 --- a/tests/tests_unit/test_meta.py +++ b/tests/tests_unit/test_meta.py @@ -79,7 +79,7 @@ def apis_that_should_not_have_post_retry_rule(): ) def test_all_base_api_paths_have_retry_or_specifically_no_set( api, apis_with_post_method_retry_set, apis_that_should_not_have_post_retry_rule -): +) -> None: # So you've added a new API to the SDK, but suddenly this test is failing - what's the deal?! # Answer the following: # Does this new API have POST methods that should be retried automatically? From 929adcb6f6ec9a01605cfa1db2590ff84f4f04d8 Mon Sep 17 00:00:00 2001 From: Anders Albert <60234212+doctrino@users.noreply.github.com> Date: Tue, 3 Sep 2024 15:21:21 +0200 Subject: [PATCH 10/15] Query optional in instance.search (#1905) --- CHANGELOG.md | 4 ++++ .../client/_api/data_modeling/instances.py | 20 ++++++++++++------- cognite/client/_version.py | 2 +- pyproject.toml | 2 +- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c99ca06e..5b72c42ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,10 @@ Changes are grouped as follows - `Fixed` for any bug fixes. - `Security` in case of vulnerabilities. +## [7.58.3] - 2024-09-03 +### Fixed +- The parameter `query` is now optional in `client.data_modeling.instances.search(...)`. + ## [7.58.2] - 2024-09-03 ### Added - [Feature Preview - alpha] Support for `client.hosted_extractors.sources`. diff --git a/cognite/client/_api/data_modeling/instances.py b/cognite/client/_api/data_modeling/instances.py index ba872aeda..5cfda0834 100644 --- a/cognite/client/_api/data_modeling/instances.py +++ b/cognite/client/_api/data_modeling/instances.py @@ -973,7 +973,8 @@ def apply( def search( self, view: ViewId, - query: str, + query: str | None = None, + *, instance_type: Literal["node"] = "node", properties: list[str] | None = None, target_units: list[TargetUnit] | None = None, @@ -988,7 +989,8 @@ def search( def search( self, view: ViewId, - query: str, + query: str | None = None, + *, instance_type: Literal["edge"], properties: list[str] | None = None, target_units: list[TargetUnit] | None = None, @@ -1003,7 +1005,8 @@ def search( def search( self, view: ViewId, - query: str, + query: str | None = None, + *, instance_type: type[T_Node], properties: list[str] | None = None, target_units: list[TargetUnit] | None = None, @@ -1018,7 +1021,8 @@ def search( def search( self, view: ViewId, - query: str, + query: str | None = None, + *, instance_type: type[T_Edge], properties: list[str] | None = None, target_units: list[TargetUnit] | None = None, @@ -1032,7 +1036,7 @@ def search( def search( self, view: ViewId, - query: str, + query: str | None = None, instance_type: Literal["node", "edge"] | type[T_Node] | type[T_Edge] = "node", properties: list[str] | None = None, target_units: list[TargetUnit] | None = None, @@ -1046,7 +1050,7 @@ def search( Args: view (ViewId): View to search in. - query (str): Query string that will be parsed and used for search. + query (str | None): Query string that will be parsed and used for search. instance_type (Literal["node", "edge"] | type[T_Node] | type[T_Edge]): Whether to search for nodes or edges. properties (list[str] | None): Optional array of properties you want to search through. If you do not specify one or more properties, the service will search all text fields within the view. target_units (list[TargetUnit] | None): Properties to convert to another unit. The API can only convert to another unit if a unit has been defined as part of the type on the underlying container being queried. @@ -1103,7 +1107,9 @@ def search( else: raise ValueError(f"Invalid instance type: {instance_type}") - body = {"view": view.dump(camel_case=True), "query": query, "instanceType": instance_type_str, "limit": limit} + body: dict[str, Any] = {"view": view.dump(camel_case=True), "instanceType": instance_type_str, "limit": limit} + if query: + body["query"] = query if properties: body["properties"] = properties if include_typing: diff --git a/cognite/client/_version.py b/cognite/client/_version.py index b1cad4426..9180aa7e3 100644 --- a/cognite/client/_version.py +++ b/cognite/client/_version.py @@ -1,4 +1,4 @@ from __future__ import annotations -__version__ = "7.58.2" +__version__ = "7.58.3" __api_subversion__ = "20230101" diff --git a/pyproject.toml b/pyproject.toml index 777549750..7726550e8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "cognite-sdk" -version = "7.58.2" +version = "7.58.3" description = "Cognite Python SDK" readme = "README.md" documentation = "https://cognite-sdk-python.readthedocs-hosted.com" From 51910e0f65fe4b4f56a9b1227a0ba692486223c5 Mon Sep 17 00:00:00 2001 From: Anders Albert <60234212+doctrino@users.noreply.github.com> Date: Wed, 4 Sep 2024 10:41:11 +0200 Subject: [PATCH 11/15] Bug datetime parsing (#1906) --- CHANGELOG.md | 4 ++++ cognite/client/_version.py | 2 +- .../data_modeling/typed_instances.py | 5 +++-- cognite/client/utils/_time.py | 17 ++++++++++++++ pyproject.toml | 2 +- tests/tests_unit/test_utils/test_time.py | 22 +++++++++++++++++++ 6 files changed, 48 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b72c42ee..7c2e0dd95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,10 @@ Changes are grouped as follows - `Fixed` for any bug fixes. - `Security` in case of vulnerabilities. +## [7.58.4] - 2024-09-03 +### Fixed +- The deserialization `datetime` properties in `TypedNode`/`TypedEdge` now correctly handles truncated milliseconds. + ## [7.58.3] - 2024-09-03 ### Fixed - The parameter `query` is now optional in `client.data_modeling.instances.search(...)`. diff --git a/cognite/client/_version.py b/cognite/client/_version.py index 9180aa7e3..95cde9ba4 100644 --- a/cognite/client/_version.py +++ b/cognite/client/_version.py @@ -1,4 +1,4 @@ from __future__ import annotations -__version__ = "7.58.3" +__version__ = "7.58.4" __api_subversion__ = "20230101" diff --git a/cognite/client/data_classes/data_modeling/typed_instances.py b/cognite/client/data_classes/data_modeling/typed_instances.py index 4568e6fef..d6cefac6a 100644 --- a/cognite/client/data_classes/data_modeling/typed_instances.py +++ b/cognite/client/data_classes/data_modeling/typed_instances.py @@ -3,7 +3,7 @@ import inspect from abc import ABC from collections.abc import Iterable -from datetime import date, datetime +from datetime import date from typing import TYPE_CHECKING, Any, cast from typing_extensions import Self @@ -20,6 +20,7 @@ _serialize_property_value, ) from cognite.client.utils._text import to_camel_case +from cognite.client.utils._time import convert_data_modelling_timestamp if TYPE_CHECKING: from cognite.client import CogniteClient @@ -304,7 +305,7 @@ def _deserialize_value(value: Any, parameter: inspect.Parameter) -> Any: return value annotation = str(parameter.annotation) if "datetime" in annotation and isinstance(value, str): - return datetime.fromisoformat(value) + return convert_data_modelling_timestamp(value) elif "date" in annotation and isinstance(value, str): return date.fromisoformat(value) elif DirectRelationReference.__name__ in annotation and isinstance(value, dict): diff --git a/cognite/client/utils/_time.py b/cognite/client/utils/_time.py index 7c46ea778..25bc9e6ce 100644 --- a/cognite/client/utils/_time.py +++ b/cognite/client/utils/_time.py @@ -178,6 +178,23 @@ def datetime_to_ms_iso_timestamp(dt: datetime) -> str: raise TypeError(f"Expected datetime object, got {type(dt)}") +def convert_data_modelling_timestamp(timestamp: str) -> datetime: + """Converts a timestamp string to a datetime object. + + Args: + timestamp (str): A timestamp string. + + Returns: + datetime: A datetime object. + """ + try: + return datetime.fromisoformat(timestamp) + except ValueError: + # Typically hits if the timestamp has truncated milliseconds, + # For example, "2021-01-01T00:00:00.17+00:00". + return datetime.strptime(timestamp, "%Y-%m-%dT%H:%M:%S.%f%z") + + def split_granularity_into_quantity_and_normalized_unit(granularity: str) -> tuple[int, str]: """A normalized unit is any unit accepted by the API""" if match := re.match(r"(\d+)(.*)", granularity): diff --git a/pyproject.toml b/pyproject.toml index 7726550e8..f5a1d30d2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "cognite-sdk" -version = "7.58.3" +version = "7.58.4" description = "Cognite Python SDK" readme = "README.md" documentation = "https://cognite-sdk-python.readthedocs-hosted.com" diff --git a/tests/tests_unit/test_utils/test_time.py b/tests/tests_unit/test_utils/test_time.py index b55250d30..34ae4069c 100644 --- a/tests/tests_unit/test_utils/test_time.py +++ b/tests/tests_unit/test_utils/test_time.py @@ -19,6 +19,7 @@ align_large_granularity, align_start_and_end_for_granularity, convert_and_isoformat_time_attrs, + convert_data_modelling_timestamp, datetime_to_ms, datetime_to_ms_iso_timestamp, granularity_to_ms, @@ -230,6 +231,27 @@ def test_negative(self, t): timestamp_to_ms(t) +class TestConvertDataModelingTimestamp: + @pytest.mark.parametrize( + "timestamp_str, expected", + [ + ("2021-01-01T00:00:00.000+00:00", datetime(2021, 1, 1, 0, 0, 0, 0, tzinfo=timezone.utc)), + ("2021-01-01T00:00:00.000+01:00", datetime(2021, 1, 1, 0, 0, 0, 0, tzinfo=timezone(timedelta(hours=1)))), + ( + "2021-01-01T00:00:00.000+01:15", + datetime(2021, 1, 1, 0, 0, 0, 0, tzinfo=timezone(timedelta(hours=1, minutes=15))), + ), + ( + "2021-01-01T00:00:00.000-01:15", + datetime(2021, 1, 1, 0, 0, 0, 0, tzinfo=timezone(timedelta(hours=-1, minutes=-15))), + ), + ("2024-09-03T09:36:01.17+00:00", datetime(2024, 9, 3, 9, 36, 1, 170000, tzinfo=timezone.utc)), + ], + ) + def test_valid_timestamp_str(self, timestamp_str: str, expected: datetime) -> None: + assert expected == convert_data_modelling_timestamp(timestamp_str) + + class TestGranularityToMs: @pytest.mark.parametrize( "granularity, expected_ms", From c4db7415f355efb1387a289bb72c530c60f9d97b Mon Sep 17 00:00:00 2001 From: Anders Albert <60234212+doctrino@users.noreply.github.com> Date: Wed, 4 Sep 2024 11:39:59 +0200 Subject: [PATCH 12/15] Core ReadOnly Properties (#1909) --- cognite/client/data_classes/data_modeling/cdm/v1.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/cognite/client/data_classes/data_modeling/cdm/v1.py b/cognite/client/data_classes/data_modeling/cdm/v1.py index 016ef81dc..2da2d6ce1 100644 --- a/cognite/client/data_classes/data_modeling/cdm/v1.py +++ b/cognite/client/data_classes/data_modeling/cdm/v1.py @@ -3845,9 +3845,6 @@ class CogniteAssetApply( source_created_user (str | None): User identifier from the source system on who created the source data. This identifier is not guaranteed to match the user identifiers in CDF source_updated_user (str | None): User identifier from the source system on who last updated the source data. This identifier is not guaranteed to match the user identifiers in CDF parent (DirectRelationReference | tuple[str, str] | None): Parent of this asset - root (DirectRelationReference | tuple[str, str] | None): Asset at the top of the hierarchy. - path (list[DirectRelationReference | tuple[str, str]] | None): Materialized path of this asset - path_last_updated_time (datetime | None): Last time the path was updated for this asset asset_class (DirectRelationReference | tuple[str, str] | None): Class of this asset type_ (DirectRelationReference | tuple[str, str] | None): Type of this asset existing_version (int | None): Fail the ingestion request if the node's version is greater than or equal to this value. If no existingVersion is specified, the ingestion will always overwrite any existing data for the node (for the specified container or node). If existingVersion is set to 0, the upsert will behave as an insert, so it will fail the bulk if the item already exists. If skipOnVersionConflict is set on the ingestion request, then the item will be skipped instead of failing the ingestion request. @@ -3872,9 +3869,6 @@ def __init__( source_created_user: str | None = None, source_updated_user: str | None = None, parent: DirectRelationReference | tuple[str, str] | None = None, - root: DirectRelationReference | tuple[str, str] | None = None, - path: list[DirectRelationReference | tuple[str, str]] | None = None, - path_last_updated_time: datetime | None = None, asset_class: DirectRelationReference | tuple[str, str] | None = None, type_: DirectRelationReference | tuple[str, str] | None = None, existing_version: int | None = None, @@ -3909,9 +3903,6 @@ def __init__( type=type, ) self.parent = DirectRelationReference.load(parent) if parent else None - self.root = DirectRelationReference.load(root) if root else None - self.path = [DirectRelationReference.load(path) for path in path] if path else None - self.path_last_updated_time = path_last_updated_time self.asset_class = DirectRelationReference.load(asset_class) if asset_class else None self.type_ = DirectRelationReference.load(type_) if type_ else None @@ -4045,9 +4036,6 @@ def as_write(self) -> CogniteAssetApply: source_created_user=self.source_created_user, source_updated_user=self.source_updated_user, parent=self.parent, - root=self.root, - path=self.path, # type: ignore[arg-type] - path_last_updated_time=self.path_last_updated_time, asset_class=self.asset_class, type_=self.type_, existing_version=self.version, From 8c537f1ad47b064d00265741167603d0608c0ccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20V=2E=20Treider?= Date: Wed, 4 Sep 2024 11:47:03 +0200 Subject: [PATCH 13/15] add support for fdm filters that accepts list of objects (#1908) --- CHANGELOG.md | 6 +++ cognite/client/_version.py | 2 +- cognite/client/data_classes/filters.py | 30 +++++++---- pyproject.toml | 2 +- .../test_data_models/test_filters.py | 51 ++++++++++++++++++- 5 files changed, 78 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c2e0dd95..54e573cbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,12 @@ Changes are grouped as follows - `Fixed` for any bug fixes. - `Security` in case of vulnerabilities. +## [7.58.5] - 2024-09-04 +### Added +- Data modeling filters now support properties that are lists. +### Fixed +- Read-only properties on CogniteAssetApply (root, path and last_updated_time) are now removed. + ## [7.58.4] - 2024-09-03 ### Fixed - The deserialization `datetime` properties in `TypedNode`/`TypedEdge` now correctly handles truncated milliseconds. diff --git a/cognite/client/_version.py b/cognite/client/_version.py index 95cde9ba4..7805bd1a2 100644 --- a/cognite/client/_version.py +++ b/cognite/client/_version.py @@ -1,4 +1,4 @@ from __future__ import annotations -__version__ = "7.58.4" +__version__ = "7.58.5" __api_subversion__ = "20230101" diff --git a/cognite/client/data_classes/filters.py b/cognite/client/data_classes/filters.py index 663e61823..9f08598d1 100644 --- a/cognite/client/data_classes/filters.py +++ b/cognite/client/data_classes/filters.py @@ -34,15 +34,22 @@ class ParameterValue: FilterValueList: TypeAlias = Union[Sequence[RawValue], PropertyReferenceValue, ParameterValue] -def _dump_filter_value(filter_value: FilterValueList | FilterValue) -> Any: - if isinstance(filter_value, PropertyReferenceValue): - if isinstance(filter_value.property, EnumProperty): - return {"property": filter_value.property.as_reference()} - return {"property": filter_value.property} +def _dump_filter_value(value: FilterValueList | FilterValue) -> Any: + if isinstance(value, PropertyReferenceValue): + if isinstance(value.property, EnumProperty): + return {"property": value.property.as_reference()} + return {"property": value.property} - if isinstance(filter_value, ParameterValue): - return {"parameter": filter_value.parameter} - return filter_value + elif isinstance(value, ParameterValue): + return {"parameter": value.parameter} + + elif hasattr(value, "dump"): + return value.dump() + + elif isinstance(value, SequenceNotStr): + return list(map(_dump_filter_value, value)) + + return value def _load_filter_value(value: Any) -> FilterValue | FilterValueList: @@ -675,7 +682,8 @@ class Exists(FilterWithProperty): @final class Prefix(FilterWithPropertyAndValue): - """Prefix filter results based on whether the (text) property starts with the provided value. + """Prefix filter results based on whether the property starts with the provided value. When the property + is a list, the list starts with the provided values. Args: property (PropertyReference): The property to filter on. @@ -692,6 +700,10 @@ class Prefix(FilterWithPropertyAndValue): - Composing the property reference using the ``View.as_property_ref`` method: >>> flt = Prefix(my_view.as_property_ref("some_property"), "somePrefix") + + Filter that can be used to retrieve items where the property is a list of e.g. integers that starts with [1, 2, 3]: + + >>> flt = Prefix(my_view.as_property_ref("some_list_property"), [1, 2, 3]) """ _filter_name = "prefix" diff --git a/pyproject.toml b/pyproject.toml index f5a1d30d2..9ae6335af 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "cognite-sdk" -version = "7.58.4" +version = "7.58.5" description = "Cognite Python SDK" readme = "README.md" documentation = "https://cognite-sdk-python.readthedocs-hosted.com" diff --git a/tests/tests_unit/test_data_classes/test_data_models/test_filters.py b/tests/tests_unit/test_data_classes/test_data_models/test_filters.py index 9e18d8d66..d201428c9 100644 --- a/tests/tests_unit/test_data_classes/test_data_models/test_filters.py +++ b/tests/tests_unit/test_data_classes/test_data_models/test_filters.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Iterator, Literal +from typing import TYPE_CHECKING, Any, Iterator, Literal import pytest from _pytest.mark import ParameterSet @@ -8,6 +8,7 @@ import cognite.client.data_classes.filters as f from cognite.client.data_classes._base import EnumProperty from cognite.client.data_classes.data_modeling import ViewId +from cognite.client.data_classes.data_modeling.data_types import DirectRelationReference from cognite.client.data_classes.filters import Filter from tests.utils import all_subclasses @@ -100,6 +101,34 @@ def load_and_dump_equals_data() -> Iterator[ParameterSet]: yield pytest.param( {"prefix": {"property": ["name"], "value": {"parameter": "param1"}}}, id="prefix with parameters" ) + yield pytest.param( + { + "prefix": { + "property": ["cdf_cdm", "CogniteAsset/v1", "path"], + "value": [ + {"space": "s", "externalId": "0"}, + {"space": "s", "externalId": "1"}, + {"space": "s", "externalId": "2"}, + {"space": "s", "externalId": "3"}, + ], + } + }, + id="prefix with list of dicts", + ) + yield pytest.param( + { + "prefix": { + "property": ["cdf_cdm", "CogniteAsset/v1", "path"], + "value": [ + {"space": "s", "externalId": "0"}, + {"space": "s", "externalId": "1"}, + {"space": "s", "externalId": "2"}, + {"space": "s", "externalId": "3"}, + ], + } + }, + id="prefix with list of objects", + ) @pytest.mark.parametrize("raw_data", list(load_and_dump_equals_data())) @@ -114,7 +143,7 @@ def dump_filter_test_data() -> Iterator[ParameterSet]: f.Equals(property=["person", "name"], value=["Quentin", "Tarantino"]), f.ContainsAny(property=["person", "name"], values=[["Quentin", "Tarantino"]]), ) - expected = { + expected: dict[str, Any] = { "or": [ {"equals": {"property": ["person", "name"], "value": ["Quentin", "Tarantino"]}}, {"containsAny": {"property": ["person", "name"], "values": [["Quentin", "Tarantino"]]}}, @@ -181,6 +210,24 @@ def dump_filter_test_data() -> Iterator[ParameterSet]: {"invalid": {"previously_referenced_properties": [["some", "old", "prop"]], "filter_type": "overlaps"}}, ) + property_ref = ["cdf_cdm", "CogniteAsset/v1", "path"] + expected = { + "prefix": { + "property": property_ref, + "value": [{"space": "s", "externalId": "0"}, {"space": "s", "externalId": "1"}], + } + } + prop_list1 = f.Prefix( + property_ref, + [DirectRelationReference(space="s", external_id="0"), DirectRelationReference(space="s", external_id="1")], + ) + prop_list2 = f.Prefix( + property_ref, + [{"space": "s", "externalId": "0"}, {"space": "s", "externalId": "1"}], + ) + yield pytest.param(prop_list1, expected, id="Prefix filter with list property of objects") + yield pytest.param(prop_list2, expected, id="Prefix filter with list property of dicts") + @pytest.mark.parametrize("user_filter, expected", list(dump_filter_test_data())) def test_dump_filter(user_filter: Filter, expected: dict) -> None: From 32f224d945188b455ceb6aa5796d0261cb6574b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20V=2E=20Treider?= Date: Wed, 4 Sep 2024 15:07:51 +0200 Subject: [PATCH 14/15] override methods inherited from Instance in Typed[Node/Edge] (#1910) --- .../data_modeling/typed_instances.py | 36 ++++++++++++++- .../test_data_models/test_typed_instances.py | 45 +++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/cognite/client/data_classes/data_modeling/typed_instances.py b/cognite/client/data_classes/data_modeling/typed_instances.py index d6cefac6a..971f9d680 100644 --- a/cognite/client/data_classes/data_modeling/typed_instances.py +++ b/cognite/client/data_classes/data_modeling/typed_instances.py @@ -4,7 +4,7 @@ from abc import ABC from collections.abc import Iterable from datetime import date -from typing import TYPE_CHECKING, Any, cast +from typing import TYPE_CHECKING, Any, NoReturn, cast from typing_extensions import Self @@ -134,6 +134,23 @@ class TypedNode(Node, ABC): } ) + # We inherit a bit too much from Instance that we must override: + # (methods: get, __getitem__, __setitem__, __delitem__, __contains__) + def get(self, attr: str, default: Any = None) -> NoReturn: + raise AttributeError(f"{type(self).__qualname__} object has no attribute 'get'") + + def __getitem__(self, attr: str) -> NoReturn: + raise TypeError(f"{type(self).__qualname__} object is not subscriptable") + + def __setitem__(self, attr: str, value: Any) -> NoReturn: + raise TypeError(f"{type(self).__qualname__} object does not support item assignment") + + def __delitem__(self, attr: str) -> NoReturn: + raise TypeError(f"{type(self).__qualname__} object does not support item deletion") + + def __contains__(self, attr: str) -> NoReturn: + raise TypeError(f"argument of type {type(self).__qualname__} is not iterable") + @classmethod def get_source(cls) -> ViewId: raise NotImplementedError @@ -175,6 +192,23 @@ class TypedEdge(Edge, ABC): } ) + # We inherit a bit too much from Instance that we must override: + # (methods: get, __getitem__, __setitem__, __delitem__, __contains__) + def get(self, attr: str, default: Any = None) -> NoReturn: + raise AttributeError(f"{type(self).__qualname__!r} object has no attribute 'get'") + + def __getitem__(self, attr: str) -> NoReturn: + raise TypeError(f"{type(self).__qualname__!r} object is not subscriptable") + + def __setitem__(self, attr: str, value: Any) -> NoReturn: + raise TypeError(f"{type(self).__qualname__!r} object does not support item assignment") + + def __delitem__(self, attr: str) -> NoReturn: + raise TypeError(f"{type(self).__qualname__!r} object does not support item deletion") + + def __contains__(self, attr: str) -> NoReturn: + raise TypeError(f"argument of type {type(self).__qualname__!r} is not iterable") + @classmethod def get_source(cls) -> ViewId: raise NotImplementedError diff --git a/tests/tests_unit/test_data_classes/test_data_models/test_typed_instances.py b/tests/tests_unit/test_data_classes/test_data_models/test_typed_instances.py index ed0854b57..23a382b9f 100644 --- a/tests/tests_unit/test_data_classes/test_data_models/test_typed_instances.py +++ b/tests/tests_unit/test_data_classes/test_data_models/test_typed_instances.py @@ -2,7 +2,10 @@ from datetime import date +import pytest + from cognite.client.data_classes.data_modeling import DirectRelationReference, ViewId +from cognite.client.data_classes.data_modeling.cdm.v1 import CogniteAssetApply, CogniteDescribableEdgeApply from cognite.client.data_classes.data_modeling.typed_instances import ( PropertyOptions, TypedEdge, @@ -262,3 +265,45 @@ def test_dump_load_flow(self) -> None: assert flow.dump() == expected loaded = Flow.load(expected) assert flow.dump() == loaded.dump() + + +@pytest.mark.parametrize( + "name, instance", + ( + ( + "CogniteAssetApply", + CogniteAssetApply( + space="foo", + external_id="child", + parent=("foo", "I-am-root"), + ), + ), + ( + "CogniteDescribableEdgeApply", + CogniteDescribableEdgeApply( + space="foo", + external_id="indescribable", + type=DirectRelationReference("foo", "yo"), + start_node=DirectRelationReference("foo", "yo2"), + end_node=DirectRelationReference("foo", "yo3"), + ), + ), + ), +) +def test_typed_instances_overrides_inherited_methods_from_instance_cls( + name: str, instance: TypedNode | TypedEdge +) -> None: + with pytest.raises(AttributeError, match=f"{name!r} object has no attribute 'get'"): + instance.get("space") + + with pytest.raises(TypeError, match=f"{name!r} object is not subscriptable"): + instance["foo"] + + with pytest.raises(TypeError, match=f"{name!r} object does not support item assignment"): + instance["foo"] = "bar" + + with pytest.raises(TypeError, match=f"{name!r} object does not support item deletion"): + del instance["external_id"] + + with pytest.raises(TypeError, match=f"argument of type {name!r} is not iterable"): + "foo" in instance From 8a8ed129ee7dc3bf09596efe68c493ec7565e75c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20V=2E=20Treider?= Date: Thu, 5 Sep 2024 12:15:18 +0200 Subject: [PATCH 15/15] improve space filter ergonomics to more easily list global nodes (#1913) --- CHANGELOG.md | 6 +++++ cognite/client/_version.py | 2 +- cognite/client/data_classes/filters.py | 21 ++++++++++----- pyproject.toml | 2 +- .../test_data_modeling/test_instances.py | 12 +++++++++ .../test_data_models/test_filters.py | 26 ++++++++++++------- 6 files changed, 52 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54e573cbe..72d0f7874 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,12 @@ Changes are grouped as follows - `Fixed` for any bug fixes. - `Security` in case of vulnerabilities. +## [7.58.6] - 2024-09-05 +### Fixed +- Data modeling convenience filter `SpaceFilter` now allows listing of global nodes by using `equals` + (when a single space is requested (requirement)). This also affects the `space` parameter to e.g. + `client.data_modeling.instances.list(...)` + ## [7.58.5] - 2024-09-04 ### Added - Data modeling filters now support properties that are lists. diff --git a/cognite/client/_version.py b/cognite/client/_version.py index 7805bd1a2..ccd04ba03 100644 --- a/cognite/client/_version.py +++ b/cognite/client/_version.py @@ -1,4 +1,4 @@ from __future__ import annotations -__version__ = "7.58.5" +__version__ = "7.58.6" __api_subversion__ = "20230101" diff --git a/cognite/client/data_classes/filters.py b/cognite/client/data_classes/filters.py index 9f08598d1..fb385090e 100644 --- a/cognite/client/data_classes/filters.py +++ b/cognite/client/data_classes/filters.py @@ -809,7 +809,7 @@ class Search(FilterWithPropertyAndValue): # ######################################################### # -class SpaceFilter(FilterWithPropertyAndValueList): +class SpaceFilter(FilterWithProperty): """Filters instances based on the space. Args: @@ -827,15 +827,24 @@ class SpaceFilter(FilterWithPropertyAndValueList): >>> flt = SpaceFilter("space3", instance_type="edge") """ - _filter_name = In._filter_name - def __init__(self, space: str | SequenceNotStr[str], instance_type: Literal["node", "edge"] = "node") -> None: - space_list = [space] if isinstance(space, str) else list(space) - super().__init__(property=[instance_type, "space"], values=space_list) + super().__init__(property=[instance_type, "space"]) + space = [space] if isinstance(space, str) else list(space) + single = len(space) == 1 + self._value = space[0] if single else space + self._value_key = "value" if single else "values" + self._filter_name = Equals._filter_name if single else In._filter_name + self._involved_filter: set[type[Filter]] = {Equals if single else In} @classmethod def load(cls, filter_: dict[str, Any]) -> NoReturn: raise NotImplementedError("Custom filter 'SpaceFilter' can not be loaded") + def _filter_body(self, camel_case_property: bool) -> dict[str, Any]: + return { + "property": self._dump_property(camel_case_property), + self._value_key: _dump_filter_value(self._value), + } + def _involved_filter_types(self) -> set[type[Filter]]: - return {In} + return self._involved_filter diff --git a/pyproject.toml b/pyproject.toml index 9ae6335af..5209f3871 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "cognite-sdk" -version = "7.58.5" +version = "7.58.6" description = "Cognite Python SDK" readme = "README.md" documentation = "https://cognite-sdk-python.readthedocs-hosted.com" diff --git a/tests/tests_integration/test_api/test_data_modeling/test_instances.py b/tests/tests_integration/test_api/test_data_modeling/test_instances.py index 8ee76650a..91bcde8c9 100644 --- a/tests/tests_integration/test_api/test_data_modeling/test_instances.py +++ b/tests/tests_integration/test_api/test_data_modeling/test_instances.py @@ -1083,6 +1083,18 @@ def test_search_person(self, cognite_client: CogniteClient) -> None: assert len(persons) > 0 assert all(isinstance(person, PersonRead) for person in persons) + def test_listing_global_nodes(self, cognite_client: CogniteClient) -> None: + from cognite.client.data_classes.data_modeling.cdm.v1 import CogniteUnit + + # Space must be explicitly specified or nothing will be returned: + no_nodes = cognite_client.data_modeling.instances.list(sources=CogniteUnit.get_source()) + assert len(no_nodes) == 0 + + nodes = cognite_client.data_modeling.instances.list( + space="cdf_cdm_units", sources=CogniteUnit.get_source(), limit=5 + ) + assert len(nodes) == 5 + class TestInstancesSync: def test_sync_movies_released_in_1994(self, cognite_client: CogniteClient, movie_view: View) -> None: diff --git a/tests/tests_unit/test_data_classes/test_data_models/test_filters.py b/tests/tests_unit/test_data_classes/test_data_models/test_filters.py index d201428c9..6bd50012a 100644 --- a/tests/tests_unit/test_data_classes/test_data_models/test_filters.py +++ b/tests/tests_unit/test_data_classes/test_data_models/test_filters.py @@ -255,25 +255,33 @@ def test_user_given_metadata_keys_are_not_camel_cased(property_cls: type) -> Non class TestSpaceFilter: @pytest.mark.parametrize( - "inst_type, space, expected_spaces", + "inst_type, space, expected", ( - ("node", "myspace", ["myspace"]), - ("edge", ["myspace"], ["myspace"]), - ("node", ["myspace", "another"], ["myspace", "another"]), + ("node", "myspace", {"equals": {"property": ["node", "space"], "value": "myspace"}}), + (None, ["myspace"], {"equals": {"property": ["node", "space"], "value": "myspace"}}), + ("edge", ["myspace"], {"equals": {"property": ["edge", "space"], "value": "myspace"}}), + ("node", ["myspace", "another"], {"in": {"property": ["node", "space"], "values": ["myspace", "another"]}}), + ("node", ("myspace", "another"), {"in": {"property": ["node", "space"], "values": ["myspace", "another"]}}), ), ) def test_space_filter( - self, inst_type: Literal["node", "edge"], space: str | list[str], expected_spaces: list[str] + self, inst_type: Literal["node", "edge"], space: str | list[str], expected: dict[str, Any] ) -> None: - space_filter = f.SpaceFilter(space, inst_type) - expected = {"in": {"property": [inst_type, "space"], "values": expected_spaces}} + space_filter = f.SpaceFilter(space, inst_type) if inst_type else f.SpaceFilter(space) assert expected == space_filter.dump() def test_space_filter_passes_isinstance_checks(self) -> None: space_filter = f.SpaceFilter("myspace", "edge") assert isinstance(space_filter, Filter) - def test_space_filter_passes_verification(self, cognite_client: CogniteClient) -> None: - space_filter = f.SpaceFilter("myspace", "edge") + @pytest.mark.parametrize( + "space_filter", + [ + f.SpaceFilter("s1", "edge"), + f.SpaceFilter(["s1"], "edge"), + f.SpaceFilter(["s1", "s2"], "edge"), + ], + ) + def test_space_filter_passes_verification(self, cognite_client: CogniteClient, space_filter: f.SpaceFilter) -> None: cognite_client.data_modeling.instances._validate_filter(space_filter) assert True