Skip to content

Commit 0885097

Browse files
vaibhavatlanAryamanz29
authored andcommitted
improved error handling for get_assets() method
1 parent d44d087 commit 0885097

File tree

5 files changed

+58
-6
lines changed

5 files changed

+58
-6
lines changed

pyatlan/errors.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,13 @@ class ErrorCode(Enum):
629629
"Set `test` to `True` or remove `username` and `password`.",
630630
InvalidRequestError,
631631
)
632+
MISSING_DP_Asset_DSL = (
633+
400,
634+
"ATLAN-PYTHON-400-072",
635+
"No DataProduct Aseet DSL was found.",
636+
"You must provide a DataProduct asset DSL when retrieving DataProduct assets.",
637+
NotFoundError,
638+
)
632639
AUTHENTICATION_PASSTHROUGH = (
633640
401,
634641
"ATLAN-PYTHON-401-000",

pyatlan/generator/templates/methods/asset/data_product.jinja2

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191

9292
:param client: connectivity to an Atlan tenant (optional). If not provided, the default client will be used.
9393

94+
:raises NotFoundError: if DataProduct asset DSL cannot be found (does not exist) in Atlan
9495
:raises AtlanError: if there is an issue interacting with the API
9596
:returns: instance of `IndexSearchResults` with list of all assets linked to the provided data product
9697

@@ -99,7 +100,10 @@
99100

100101
client = AtlanClient.get_current_client() if not client else client
101102
dp_dsl = self.data_product_assets_d_s_l
102-
json_object = json.loads(dp_dsl) if dp_dsl else {}
103-
request = IndexSearchRequest(**json_object.get("query", {}))
104-
response = client.asset.search(request)
103+
if dp_dsl:
104+
json_object = json.loads(dp_dsl) if dp_dsl else {}
105+
request = IndexSearchRequest(**json_object.get("query", {}))
106+
response = client.asset.search(request)
107+
else:
108+
raise ErrorCode.MISSING_DP_Asset_DSL.exception_with_parameters()
105109
return response

pyatlan/model/assets/core/data_product.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
from pydantic.v1 import Field, StrictStr, validator
1313

14+
from pyatlan.errors import ErrorCode
1415
from pyatlan.model.data_mesh import DataProductsAssetsDSL
1516
from pyatlan.model.enums import (
1617
DataProductCriticality,
@@ -129,6 +130,7 @@ def get_assets(self, client: Optional[AtlanClient] = None):
129130
130131
:param client: connectivity to an Atlan tenant (optional). If not provided, the default client will be used.
131132
133+
:raises NotFoundError: if DataProduct asset DSL cannot be found (does not exist) in Atlan
132134
:raises AtlanError: if there is an issue interacting with the API
133135
:returns: instance of `IndexSearchResults` with list of all assets linked to the provided data product
134136
@@ -137,9 +139,12 @@ def get_assets(self, client: Optional[AtlanClient] = None):
137139

138140
client = AtlanClient.get_current_client() if not client else client
139141
dp_dsl = self.data_product_assets_d_s_l
140-
json_object = json.loads(dp_dsl) if dp_dsl else {}
141-
request = IndexSearchRequest(**json_object.get("query", {}))
142-
response = client.asset.search(request)
142+
if dp_dsl:
143+
json_object = json.loads(dp_dsl) if dp_dsl else {}
144+
request = IndexSearchRequest(**json_object.get("query", {}))
145+
response = client.asset.search(request)
146+
else:
147+
raise ErrorCode.MISSING_DP_Asset_DSL.exception_with_parameters()
143148
return response
144149

145150
type_name: str = Field(default="DataProduct", allow_mutation=False)

tests/integration/data_mesh_test.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from pyatlan.client.asset import IndexSearchResults
88
from pyatlan.client.atlan import AtlanClient
9+
from pyatlan.errors import NotFoundError
910
from pyatlan.model.assets import (
1011
Asset,
1112
AtlasGlossary,
@@ -502,6 +503,26 @@ def test_product_get_assets(client: AtlanClient, product: DataProduct):
502503
assert isinstance(asset_list, IndexSearchResults)
503504

504505

506+
@pytest.mark.order(after="test_retrieve_product")
507+
def test_dp_dsl_missing(client: AtlanClient, product: DataProduct):
508+
assert product.guid
509+
test_product = (
510+
FluentSearch.select()
511+
.where(Asset.GUID.eq(product.guid))
512+
.where(Asset.TYPE_NAME.eq("DataProduct"))
513+
.to_request()
514+
)
515+
retrieved_dp = client.asset.search(test_product).current_page()[0]
516+
assert retrieved_dp
517+
assert retrieved_dp.data_product_assets_d_s_l is None # type: ignore
518+
519+
with pytest.raises(
520+
NotFoundError,
521+
match="No DataProduct Aseet DSL was found. Suggestion: You must provide a DataProduct asset DSL when retrieving DataProduct assets.",
522+
):
523+
retrieved_dp.get_assets(client) # type: ignore
524+
525+
505526
@pytest.mark.order(after="test_retrieve_contract")
506527
def test_delete_contract(client: AtlanClient, contract: DataContract):
507528
response = client.asset.purge_by_guid(contract.guid)

tests/unit/model/data_product_test.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
import pytest
55

6+
from pyatlan.client.atlan import AtlanClient
7+
from pyatlan.errors import NotFoundError
68
from pyatlan.model.assets import AtlasGlossary, DataProduct
79
from pyatlan.model.enums import CertificateStatus, DataProductStatus
810
from pyatlan.model.fluent_search import CompoundQuery, FluentSearch
@@ -144,6 +146,19 @@ def test_create_for_modification():
144146
_assert_product(test_product)
145147

146148

149+
def test_get_assets_with_missing_dp_asset_dsl_raise_not_found_error():
150+
data_product = DataProduct()
151+
client = AtlanClient()
152+
data_product.attributes.name = DATA_PRODUCT_NAME
153+
data_product.parent_domain_qualified_name = DATA_PRODUCT_QUALIFIED_NAME
154+
data_product.data_product_assets_d_s_l = None
155+
with pytest.raises(
156+
NotFoundError,
157+
match="No DataProduct Aseet DSL was found. Suggestion: You must provide a DataProduct asset DSL when retrieving DataProduct assets.",
158+
):
159+
data_product.get_assets(client)
160+
161+
147162
def test_trim_to_required():
148163
test_product = DataProduct.create_for_modification(
149164
qualified_name=DATA_PRODUCT_QUALIFIED_NAME,

0 commit comments

Comments
 (0)