From 9e745e7549dd810024bf985be492d8bcf09fd6ea Mon Sep 17 00:00:00 2001 From: Auto Impl Date: Wed, 18 Mar 2026 08:50:32 +0000 Subject: [PATCH] feat(gooddata-sdk): [AUTO] add CatalogDataSourceAiLakehouse data source type Adds CatalogDataSourceAiLakehouse class following the existing typed subclass pattern (CatalogDataSourceGdStorage) for data sources that do not expose connection credentials. The backend strips url, token, schema, and parameters for AI Lakehouse data sources, so the wrapper omits those fields by defaulting schema to empty string and using _NoCredentials. Exports the new class through gooddata_sdk/__init__.py. Adds unit tests verifying construction and serialization behavior. Co-Authored-By: Claude Sonnet 4.6 --- .../gooddata-sdk/src/gooddata_sdk/__init__.py | 1 + .../data_source/entity_model/data_source.py | 14 ++++++++++ .../tests/catalog/test_catalog_data_source.py | 28 +++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/packages/gooddata-sdk/src/gooddata_sdk/__init__.py b/packages/gooddata-sdk/src/gooddata_sdk/__init__.py index d268f9ebf..0e07ac5de 100644 --- a/packages/gooddata-sdk/src/gooddata_sdk/__init__.py +++ b/packages/gooddata-sdk/src/gooddata_sdk/__init__.py @@ -36,6 +36,7 @@ ) from gooddata_sdk.catalog.data_source.entity_model.data_source import ( CatalogDataSource, + CatalogDataSourceAiLakehouse, CatalogDataSourceBigQuery, CatalogDataSourceDatabricks, CatalogDataSourceGdStorage, diff --git a/packages/gooddata-sdk/src/gooddata_sdk/catalog/data_source/entity_model/data_source.py b/packages/gooddata-sdk/src/gooddata_sdk/catalog/data_source/entity_model/data_source.py index d3a92a038..5b46d8748 100644 --- a/packages/gooddata-sdk/src/gooddata_sdk/catalog/data_source/entity_model/data_source.py +++ b/packages/gooddata-sdk/src/gooddata_sdk/catalog/data_source/entity_model/data_source.py @@ -318,3 +318,17 @@ class CatalogDataSourceGdStorage(CatalogDataSource): type: str = "GDSTORAGE" schema: str = "" credentials: Credentials = field(factory=_NoCredentials, repr=False) + + +@define(kw_only=True, eq=False) +class CatalogDataSourceAiLakehouse(CatalogDataSource): + """AI Lakehouse data source. + + Note: The backend does not expose connection details (url, token, schema, parameters) + for AI Lakehouse data sources — these fields are stripped on the server side. + Only id, name, type, cache_strategy, and permissions are preserved. + """ + + type: str = "AILAKEHOUSE" + schema: str = "" + credentials: Credentials = field(factory=_NoCredentials, repr=False) diff --git a/packages/gooddata-sdk/tests/catalog/test_catalog_data_source.py b/packages/gooddata-sdk/tests/catalog/test_catalog_data_source.py index e6586450d..08ff9fec6 100644 --- a/packages/gooddata-sdk/tests/catalog/test_catalog_data_source.py +++ b/packages/gooddata-sdk/tests/catalog/test_catalog_data_source.py @@ -11,6 +11,7 @@ from gooddata_sdk import ( BasicCredentials, CatalogDataSource, + CatalogDataSourceAiLakehouse, CatalogDataSourceBigQuery, CatalogDataSourceDatabricks, CatalogDataSourceMariaDb, @@ -892,3 +893,30 @@ def test_jdbc_urls_creation( ), ) assert data_source.url == url + + +def test_ai_lakehouse_data_source_construction(): + """CatalogDataSourceAiLakehouse can be constructed with only id and name. + + The backend strips url, token, schema, and parameters for AI Lakehouse data sources, + so the wrapper class does not require those fields. + """ + ds = CatalogDataSourceAiLakehouse(id="ailakehouse-ds", name="AI Lakehouse") + assert ds.type == "AILAKEHOUSE" + assert ds.id == "ailakehouse-ds" + assert ds.name == "AI Lakehouse" + assert ds.schema == "" + assert ds.url is None + assert ds.parameters is None + + +def test_ai_lakehouse_data_source_to_api(): + """CatalogDataSourceAiLakehouse serializes correctly — no credential fields leaked.""" + ds = CatalogDataSourceAiLakehouse(id="ailakehouse-ds", name="AI Lakehouse") + api_doc = ds.to_api() + attrs = api_doc.data.attributes + assert attrs.type == "AILAKEHOUSE" + assert attrs.name == "AI Lakehouse" + # url and schema are empty/None — not set on the API model + assert not getattr(attrs, "url", None) + assert not getattr(attrs, "token", None)