Skip to content

Commit f9528de

Browse files
authored
Merge pull request #142 from atlanhq/AM-364
Am 364 - Tags sent in a purpose are not translated
2 parents 3aaed94 + f5aa8fb commit f9528de

6 files changed

Lines changed: 28 additions & 12 deletions

File tree

HISTORY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
## 1.3.0 (October 5, 2023)
22

3+
* Correct issue with incorrect type on purpose_atlan_tags of Purpose
34
* Added support for searching audit logs
45
* Fixed bug preventing creation of locked custom metadata
56
* Fully-validate connection parameters on save

pyatlan/generator/class_generator.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,11 @@ def set_entity_defs(cls, entity_defs: list[EntityDef]):
324324
entity_defs = sorted(entity_defs, key=lambda e: ",".join(e.super_types or []))
325325
for entity_def in entity_defs:
326326
name = entity_def.name
327+
if name == "Purpose" and entity_def.attribute_defs:
328+
for attribute in entity_def.attribute_defs:
329+
if attribute["name"] == "purposeClassifications":
330+
attribute["typeName"] = "array<AtlanTagName>"
331+
327332
if (not entity_def.super_types and name != REFERENCEABLE) or any(
328333
super_type in cls.super_type_names_to_ignore
329334
for super_type in (entity_def.super_types or [])

pyatlan/generator/templates/imports.jinja2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ from urllib.parse import quote, unquote
1010

1111
from pydantic import Field, PrivateAttr, StrictStr, root_validator, validator
1212

13-
from pyatlan.model.core import Announcement, AtlanObject, AtlanTag, Meaning
13+
from pyatlan.model.core import Announcement, AtlanObject, AtlanTag, AtlanTagName, Meaning
1414
from pyatlan.model.custom_metadata import CustomMetadataDict, CustomMetadataProxy
1515
from pyatlan.model.enums import (
1616
ADLSAccessTier,

pyatlan/model/assets/asset13.py

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

99
from pydantic import Field, validator
1010

11+
from pyatlan.model.core import AtlanTagName
1112
from pyatlan.model.enums import (
1213
AuthPolicyCategory,
1314
AuthPolicyResourceCategory,
@@ -195,17 +196,17 @@ def __setattr__(self, name, value):
195196
]
196197

197198
@property
198-
def purpose_atlan_tags(self) -> Optional[set[str]]:
199+
def purpose_atlan_tags(self) -> Optional[list[AtlanTagName]]:
199200
return None if self.attributes is None else self.attributes.purpose_atlan_tags
200201

201202
@purpose_atlan_tags.setter
202-
def purpose_atlan_tags(self, purpose_atlan_tags: Optional[set[str]]):
203+
def purpose_atlan_tags(self, purpose_atlan_tags: Optional[list[AtlanTagName]]):
203204
if self.attributes is None:
204205
self.attributes = self.Attributes()
205206
self.attributes.purpose_atlan_tags = purpose_atlan_tags
206207

207208
class Attributes(AccessControl.Attributes):
208-
purpose_atlan_tags: Optional[set[str]] = Field(
209+
purpose_atlan_tags: Optional[list[AtlanTagName]] = Field(
209210
None, description="", alias="purposeClassifications"
210211
)
211212

tests/integration/purpose_test.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from pyatlan.client.atlan import AtlanClient
99
from pyatlan.model.assets import AuthPolicy, Purpose
10+
from pyatlan.model.core import AtlanTagName
1011
from pyatlan.model.enums import (
1112
AssetSidebarTab,
1213
AtlanTagColor,
@@ -22,7 +23,7 @@
2223

2324

2425
@pytest.fixture(scope="module")
25-
def atlan_tag(
26+
def atlan_tag_def(
2627
client: AtlanClient,
2728
) -> Generator[AtlanTagDef, None, None]:
2829
atlan_tag_def = AtlanTagDef.create(name=MODULE_NAME, color=AtlanTagColor.GREEN)
@@ -31,28 +32,33 @@ def atlan_tag(
3132
client.purge_typedef(MODULE_NAME, typedef_type=AtlanTagDef)
3233

3334

35+
@pytest.fixture(scope="module")
36+
def atlan_tag_name(atlan_tag_def):
37+
return AtlanTagName(atlan_tag_def.display_name)
38+
39+
3440
@pytest.fixture(scope="module")
3541
def purpose(
3642
client: AtlanClient,
37-
atlan_tag: AtlanTagDef,
43+
atlan_tag_name,
3844
) -> Generator[Purpose, None, None]:
39-
to_create = Purpose.create(name=MODULE_NAME, atlan_tags=[atlan_tag.display_name])
45+
to_create = Purpose.create(name=MODULE_NAME, atlan_tags=[atlan_tag_name])
4046
response = client.save(to_create)
4147
p = response.assets_created(asset_type=Purpose)[0]
4248
yield p
4349
delete_asset(client, guid=p.guid, asset_type=Purpose)
4450

4551

46-
def test_purpose(
47-
client: AtlanClient,
48-
purpose: Purpose,
49-
):
52+
def test_purpose(client: AtlanClient, purpose: Purpose, atlan_tag_name: AtlanTagName):
5053
assert purpose
5154
assert purpose.guid
5255
assert purpose.qualified_name
5356
assert purpose.name == MODULE_NAME
5457
assert purpose.display_name == MODULE_NAME
5558
assert purpose.qualified_name != MODULE_NAME
59+
purpose = client.get_asset_by_guid(guid=purpose.guid, asset_type=Purpose)
60+
assert purpose.purpose_atlan_tags
61+
assert [atlan_tag_name] == purpose.purpose_atlan_tags
5662

5763

5864
@pytest.mark.order(after="test_purpose")
@@ -88,7 +94,9 @@ def test_find_purpose_by_name(
8894
client: AtlanClient,
8995
purpose: Purpose,
9096
):
91-
result = client.find_purposes_by_name(MODULE_NAME)
97+
result = client.find_purposes_by_name(
98+
MODULE_NAME, attributes=["purposeClassifications"]
99+
)
92100
count = 0
93101
# TODO: replace with exponential back-off and jitter
94102
while not result and count < 10:

tests/unit/test_model.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,7 @@
488488
"Optional[list[MatillionJob]]": [MatillionJob()],
489489
"Optional[MatillionJob]": MatillionJob(),
490490
"Optional[list[LookerFolder]]": [LookerFolder()],
491+
"Optional[list[AtlanTagName]]": [],
491492
}
492493

493494

0 commit comments

Comments
 (0)