Skip to content

Commit e9e3892

Browse files
Auto Implementationclaude
andcommitted
feat(gooddata-sdk): [AUTO] add certification and graph relation to SDK wrappers
- Add 'relation' field to CatalogDependentEntitiesRequest for DEPENDENTS/DEPENDENCIES graph traversal direction - Add certification fields (certification, certification_message, certified_at, certified_by) to CatalogDeclarativeAnalyticalDashboard, CatalogDeclarativeMetric, CatalogDeclarativeVisualizationObject - Add set_certification() service method to CatalogWorkspaceContentService - Add unit tests for new relation field and set_certification method Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 4dc3f87 commit e9e3892

4 files changed

Lines changed: 97 additions & 1 deletion

File tree

packages/gooddata-sdk/src/gooddata_sdk/catalog/workspace/content_service.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44
import copy
55
import functools
66
from pathlib import Path
7-
from typing import Literal, Union, cast
7+
from typing import Any, Literal, Union, cast
88

99
import gooddata_api_client.models as afm_models
1010
from gooddata_api_client.model.elements_request import ElementsRequest
11+
from gooddata_api_client.model.set_certification_request import SetCertificationRequest
1112

1213
from gooddata_sdk.catalog.catalog_service_base import CatalogServiceBase
1314
from gooddata_sdk.catalog.data_source.validation.data_source import DataSourceValidator
@@ -249,6 +250,43 @@ def get_dependent_entities_graph_from_entry_points(
249250
)
250251
)
251252

253+
def set_certification(
254+
self,
255+
workspace_id: str,
256+
entity_id: str,
257+
entity_type: str,
258+
certification: str | None = None,
259+
certification_message: str | None = None,
260+
) -> None:
261+
"""Set certification status for an analytics entity (metric, visualization object, or analytical dashboard).
262+
263+
Args:
264+
workspace_id (str):
265+
Workspace identification string e.g. "demo"
266+
entity_id (str):
267+
ID of the entity to certify.
268+
entity_type (str):
269+
Type of the entity. One of: "metric", "visualizationObject", "analyticalDashboard"
270+
certification (str | None):
271+
Certification status. Use "CERTIFIED" to certify, or None to remove certification.
272+
certification_message (str | None):
273+
Optional message to attach to the certification.
274+
275+
Returns:
276+
None
277+
"""
278+
kwargs: dict[str, Any] = {}
279+
if certification is not None:
280+
kwargs["status"] = certification
281+
if certification_message is not None:
282+
kwargs["message"] = certification_message
283+
request = SetCertificationRequest(id=entity_id, type=entity_type, _check_type=False, **kwargs)
284+
self._actions_api.set_certification(
285+
workspace_id=workspace_id,
286+
set_certification_request=request,
287+
_check_return_type=False,
288+
)
289+
252290
# Declarative methods for logical data model
253291

254292
def get_declarative_ldm(self, workspace_id: str) -> CatalogDeclarativeModel:

packages/gooddata-sdk/src/gooddata_sdk/catalog/workspace/declarative_model/workspace/analytics_model/analytics_model.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,10 @@ class CatalogDeclarativeAnalyticalDashboard(CatalogAnalyticsBase):
264264
]
265265
| None
266266
) = None
267+
certification: str | None = None
268+
certification_message: str | None = None
269+
certified_at: str | None = None
270+
certified_by: str | None = None
267271

268272
@staticmethod
269273
def client_class() -> type[DeclarativeAnalyticalDashboard]:
@@ -314,13 +318,23 @@ def client_class() -> type[DeclarativeFilterContext]:
314318

315319
@define(kw_only=True)
316320
class CatalogDeclarativeMetric(CatalogAnalyticsBase):
321+
certification: str | None = None
322+
certification_message: str | None = None
323+
certified_at: str | None = None
324+
certified_by: str | None = None
325+
317326
@staticmethod
318327
def client_class() -> type[DeclarativeMetric]:
319328
return DeclarativeMetric
320329

321330

322331
@define(kw_only=True)
323332
class CatalogDeclarativeVisualizationObject(CatalogAnalyticsBase):
333+
certification: str | None = None
334+
certification_message: str | None = None
335+
certified_at: str | None = None
336+
certified_by: str | None = None
337+
324338
@staticmethod
325339
def client_class() -> type[DeclarativeVisualizationObject]:
326340
return DeclarativeVisualizationObject

packages/gooddata-sdk/src/gooddata_sdk/catalog/workspace/entity_model/graph_objects/graph.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
@define(kw_only=True)
1717
class CatalogDependentEntitiesRequest(Base):
1818
identifiers: list[CatalogEntityIdentifier] = field(factory=list)
19+
relation: str | None = None
1920

2021
@staticmethod
2122
def client_class() -> builtins.type[DependentEntitiesRequest]:

packages/gooddata-sdk/tests/catalog/test_catalog_workspace_content.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,49 @@ def test_get_dependent_entities_graph_from_entry_points(test_config):
362362
assert len(response.graph.nodes) == 3
363363

364364

365+
def test_dependent_entities_request_relation_field():
366+
"""Unit test verifying that CatalogDependentEntitiesRequest serializes the relation field correctly."""
367+
request_with_relation = CatalogDependentEntitiesRequest(
368+
identifiers=[CatalogEntityIdentifier(id="my_metric", type="metric")],
369+
relation="DEPENDENCIES",
370+
)
371+
assert request_with_relation.relation == "DEPENDENCIES"
372+
api_dict = request_with_relation.to_api().to_dict()
373+
assert api_dict.get("relation") == "DEPENDENCIES"
374+
375+
request_default = CatalogDependentEntitiesRequest(
376+
identifiers=[CatalogEntityIdentifier(id="my_metric", type="metric")],
377+
)
378+
assert request_default.relation is None
379+
api_dict_default = request_default.to_api().to_dict()
380+
assert "relation" not in api_dict_default
381+
382+
383+
def test_set_certification_calls_api():
384+
"""Unit test verifying that set_certification forwards parameters to the actions API."""
385+
from gooddata_sdk.catalog.workspace.content_service import CatalogWorkspaceContentService
386+
387+
mock_actions_api = MagicMock()
388+
service = MagicMock(spec=CatalogWorkspaceContentService)
389+
service._actions_api = mock_actions_api
390+
CatalogWorkspaceContentService.set_certification(
391+
service,
392+
workspace_id="demo",
393+
entity_id="my_metric",
394+
entity_type="metric",
395+
certification="CERTIFIED",
396+
certification_message="Approved",
397+
)
398+
mock_actions_api.set_certification.assert_called_once()
399+
call_kwargs = mock_actions_api.set_certification.call_args
400+
assert call_kwargs.kwargs["workspace_id"] == "demo"
401+
request = call_kwargs.kwargs["set_certification_request"]
402+
assert request["id"] == "my_metric"
403+
assert request["type"] == "metric"
404+
assert request["status"] == "CERTIFIED"
405+
assert request["message"] == "Approved"
406+
407+
365408
@gd_vcr.use_cassette(str(_fixtures_dir / "ldm_store_load.yaml"))
366409
def test_ldm_store_load(test_config):
367410
sdk = GoodDataSdk.create(host_=test_config["host"], token_=test_config["token"])

0 commit comments

Comments
 (0)