Skip to content

Commit 8c26eda

Browse files
authored
Merge pull request #629 from atlanhq/APP-6571
APP-6571: Simplified `AtlasGlossaryCategory/Term.creator()` methods
2 parents 80d320b + 688ff24 commit 8c26eda

File tree

9 files changed

+166
-48
lines changed

9 files changed

+166
-48
lines changed

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,19 @@
2828
cls,
2929
*,
3030
name: StrictStr,
31-
anchor: AtlasGlossary,
31+
anchor: Optional[AtlasGlossary] = None,
32+
glossary_qualified_name: Optional[StrictStr] = None,
33+
glossary_guid: Optional[StrictStr] = None,
3234
parent_category: Optional[AtlasGlossaryCategory] = None,
3335
) -> AtlasGlossaryCategory:
34-
validate_required_fields(["name", "anchor"], [name, anchor])
36+
validate_required_fields(["name"], [name])
3537
return cls(
3638
attributes=AtlasGlossaryCategory.Attributes.create(
37-
name=name, anchor=anchor, parent_category=parent_category
39+
name=name,
40+
anchor=anchor,
41+
glossary_qualified_name=glossary_qualified_name,
42+
glossary_guid=glossary_guid,
43+
parent_category=parent_category,
3844
)
3945
)
4046

pyatlan/generator/templates/methods/attribute/atlas_glossary_category.jinja2

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,30 @@
55
cls,
66
*,
77
name: StrictStr,
8-
anchor: AtlasGlossary,
8+
anchor: Optional[AtlasGlossary] = None,
9+
glossary_qualified_name: Optional[StrictStr] = None,
10+
glossary_guid: Optional[StrictStr] = None,
911
parent_category: Optional[AtlasGlossaryCategory] = None,
1012
) -> AtlasGlossaryCategory.Attributes:
11-
validate_required_fields(["name", "anchor"], [name, anchor])
13+
validate_required_fields(["name"], [name])
14+
validate_single_required_field(
15+
["anchor", "glossary_qualified_name", "glossary_guid"],
16+
[anchor, glossary_qualified_name, glossary_guid],
17+
)
18+
19+
ref_anchor = None
20+
if anchor:
21+
ref_anchor = anchor.trim_to_reference()
22+
elif glossary_qualified_name:
23+
ref_anchor = AtlasGlossary.ref_by_qualified_name(
24+
qualified_name=glossary_qualified_name
25+
)
26+
elif glossary_guid:
27+
ref_anchor = AtlasGlossary.ref_by_guid(guid=glossary_guid)
28+
1229
return AtlasGlossaryCategory.Attributes(
13-
name=name, anchor=anchor, parent_category=parent_category, qualified_name=next_id()
30+
name=name,
31+
anchor=ref_anchor,
32+
parent_category=parent_category and parent_category.trim_to_reference(),
33+
qualified_name=next_id(),
1434
)

pyatlan/generator/templates/methods/attribute/atlas_glossary_term.jinja2

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,20 @@
1515
["anchor", "glossary_qualified_name", "glossary_guid"],
1616
[anchor, glossary_qualified_name, glossary_guid],
1717
)
18-
if glossary_qualified_name:
19-
anchor = AtlasGlossary()
20-
anchor.unique_attributes = {"qualifiedName": glossary_qualified_name}
21-
if glossary_guid:
22-
anchor = AtlasGlossary()
23-
anchor.guid = glossary_guid
18+
19+
ref_anchor = None
20+
if anchor:
21+
ref_anchor = anchor.trim_to_reference()
22+
elif glossary_qualified_name:
23+
ref_anchor = AtlasGlossary.ref_by_qualified_name(
24+
qualified_name=glossary_qualified_name
25+
)
26+
elif glossary_guid:
27+
ref_anchor = AtlasGlossary.ref_by_guid(guid=glossary_guid)
28+
2429
return AtlasGlossaryTerm.Attributes(
2530
name=name,
26-
anchor=anchor,
31+
anchor=ref_anchor,
2732
categories=categories,
2833
qualified_name=next_id(),
2934
)

pyatlan/model/assets/core/atlas_glossary_category.py

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

1212
from pyatlan.model.enums import AtlasGlossaryCategoryType
1313
from pyatlan.model.fields.atlan_fields import KeywordField, RelationField, TextField
14-
from pyatlan.utils import init_guid, next_id, validate_required_fields
14+
from pyatlan.utils import (
15+
init_guid,
16+
next_id,
17+
validate_required_fields,
18+
validate_single_required_field,
19+
)
1520

1621
from .asset import Asset, SelfAsset
1722

@@ -48,13 +53,19 @@ def creator(
4853
cls,
4954
*,
5055
name: StrictStr,
51-
anchor: AtlasGlossary,
56+
anchor: Optional[AtlasGlossary] = None,
57+
glossary_qualified_name: Optional[StrictStr] = None,
58+
glossary_guid: Optional[StrictStr] = None,
5259
parent_category: Optional[AtlasGlossaryCategory] = None,
5360
) -> AtlasGlossaryCategory:
54-
validate_required_fields(["name", "anchor"], [name, anchor])
61+
validate_required_fields(["name"], [name])
5562
return cls(
5663
attributes=AtlasGlossaryCategory.Attributes.create(
57-
name=name, anchor=anchor, parent_category=parent_category
64+
name=name,
65+
anchor=anchor,
66+
glossary_qualified_name=glossary_qualified_name,
67+
glossary_guid=glossary_guid,
68+
parent_category=parent_category,
5869
)
5970
)
6071

@@ -304,14 +315,31 @@ def create(
304315
cls,
305316
*,
306317
name: StrictStr,
307-
anchor: AtlasGlossary,
318+
anchor: Optional[AtlasGlossary] = None,
319+
glossary_qualified_name: Optional[StrictStr] = None,
320+
glossary_guid: Optional[StrictStr] = None,
308321
parent_category: Optional[AtlasGlossaryCategory] = None,
309322
) -> AtlasGlossaryCategory.Attributes:
310-
validate_required_fields(["name", "anchor"], [name, anchor])
323+
validate_required_fields(["name"], [name])
324+
validate_single_required_field(
325+
["anchor", "glossary_qualified_name", "glossary_guid"],
326+
[anchor, glossary_qualified_name, glossary_guid],
327+
)
328+
329+
ref_anchor = None
330+
if anchor:
331+
ref_anchor = anchor.trim_to_reference()
332+
elif glossary_qualified_name:
333+
ref_anchor = AtlasGlossary.ref_by_qualified_name(
334+
qualified_name=glossary_qualified_name
335+
)
336+
elif glossary_guid:
337+
ref_anchor = AtlasGlossary.ref_by_guid(guid=glossary_guid)
338+
311339
return AtlasGlossaryCategory.Attributes(
312340
name=name,
313-
anchor=anchor,
314-
parent_category=parent_category,
341+
anchor=ref_anchor,
342+
parent_category=parent_category and parent_category.trim_to_reference(),
315343
qualified_name=next_id(),
316344
)
317345

pyatlan/model/assets/core/atlas_glossary_term.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -580,15 +580,20 @@ def create(
580580
["anchor", "glossary_qualified_name", "glossary_guid"],
581581
[anchor, glossary_qualified_name, glossary_guid],
582582
)
583-
if glossary_qualified_name:
584-
anchor = AtlasGlossary()
585-
anchor.unique_attributes = {"qualifiedName": glossary_qualified_name}
586-
if glossary_guid:
587-
anchor = AtlasGlossary()
588-
anchor.guid = glossary_guid
583+
584+
ref_anchor = None
585+
if anchor:
586+
ref_anchor = anchor.trim_to_reference()
587+
elif glossary_qualified_name:
588+
ref_anchor = AtlasGlossary.ref_by_qualified_name(
589+
qualified_name=glossary_qualified_name
590+
)
591+
elif glossary_guid:
592+
ref_anchor = AtlasGlossary.ref_by_guid(guid=glossary_guid)
593+
589594
return AtlasGlossaryTerm.Attributes(
590595
name=name,
591-
anchor=anchor,
596+
anchor=ref_anchor,
592597
categories=categories,
593598
qualified_name=next_id(),
594599
)

tests/integration/glossary_test.py

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -37,26 +37,50 @@ def create_glossary(client: AtlanClient, name: str) -> AtlasGlossary:
3737
def create_category(
3838
client: AtlanClient,
3939
name: str,
40-
glossary: AtlasGlossary,
40+
glossary: Optional[AtlasGlossary] = None,
41+
glossary_guid: Optional[str] = None,
42+
glossary_qualified_name: Optional[str] = None,
4143
parent: Optional[AtlasGlossaryCategory] = None,
4244
) -> AtlasGlossaryCategory:
43-
c = AtlasGlossaryCategory.create(
44-
name=name, anchor=glossary, parent_category=parent or None
45-
)
45+
if glossary:
46+
c = AtlasGlossaryCategory.creator(
47+
name=name, anchor=glossary, parent_category=parent or None
48+
)
49+
elif glossary_guid:
50+
c = AtlasGlossaryCategory.creator(
51+
name=name, glossary_guid=glossary_guid, parent_category=parent or None
52+
)
53+
elif glossary_qualified_name:
54+
c = AtlasGlossaryCategory.creator(
55+
name=name,
56+
glossary_qualified_name=glossary_qualified_name,
57+
parent_category=parent or None,
58+
)
4659
return client.asset.save(c).assets_created(AtlasGlossaryCategory)[0]
4760

4861

4962
def create_term(
5063
client: AtlanClient,
5164
name: str,
52-
glossary_guid: str,
65+
glossary: Optional[AtlasGlossary] = None,
66+
glossary_guid: Optional[str] = None,
67+
glossary_qualified_name: Optional[str] = None,
5368
categories: Optional[List[AtlasGlossaryCategory]] = None,
5469
) -> AtlasGlossaryTerm:
55-
t = AtlasGlossaryTerm.create(
56-
name=StrictStr(name),
57-
glossary_guid=StrictStr(glossary_guid),
58-
categories=categories,
59-
)
70+
if glossary:
71+
t = AtlasGlossaryTerm.creator(name=name, anchor=glossary, categories=categories)
72+
elif glossary_guid:
73+
t = AtlasGlossaryTerm.creator(
74+
name=name,
75+
glossary_guid=glossary_guid,
76+
categories=categories,
77+
)
78+
elif glossary_qualified_name:
79+
t = AtlasGlossaryTerm.creator(
80+
name=name,
81+
glossary_qualified_name=glossary_qualified_name,
82+
categories=categories,
83+
)
6084
r = client.asset.save(t)
6185
return r.assets_created(AtlasGlossaryTerm)[0]
6286

@@ -144,8 +168,12 @@ def leaf1aa_category(
144168
hierarchy_glossary: AtlasGlossary,
145169
mid1a_category: AtlasGlossaryCategory,
146170
) -> Generator[AtlasGlossaryCategory, None, None]:
171+
assert hierarchy_glossary and hierarchy_glossary.guid
147172
c = create_category(
148-
client, TestId.make_unique("leaf1aa"), hierarchy_glossary, parent=mid1a_category
173+
client,
174+
TestId.make_unique("leaf1aa"),
175+
glossary_guid=hierarchy_glossary.guid,
176+
parent=mid1a_category,
149177
)
150178
yield c
151179
delete_asset(client, guid=c.guid, asset_type=AtlasGlossaryCategory)
@@ -158,7 +186,10 @@ def leaf1ab_category(
158186
mid1a_category: AtlasGlossaryCategory,
159187
) -> Generator[AtlasGlossaryCategory, None, None]:
160188
c = create_category(
161-
client, TestId.make_unique("leaf1ab"), hierarchy_glossary, parent=mid1a_category
189+
client,
190+
TestId.make_unique("leaf1ab"),
191+
glossary_qualified_name=hierarchy_glossary.qualified_name,
192+
parent=mid1a_category,
162193
)
163194
yield c
164195
delete_asset(client, guid=c.guid, asset_type=AtlasGlossaryCategory)
@@ -283,7 +314,7 @@ def test_category(
283314
def term1(
284315
client: AtlanClient, glossary: AtlasGlossary
285316
) -> Generator[AtlasGlossaryTerm, None, None]:
286-
t = create_term(client, name=TERM_NAME1, glossary_guid=glossary.guid)
317+
t = create_term(client, name=TERM_NAME1, glossary=glossary)
287318
yield t
288319
delete_asset(client, guid=t.guid, asset_type=AtlasGlossaryTerm)
289320

@@ -353,7 +384,9 @@ def test_term2(
353384
def term3(
354385
client: AtlanClient, glossary: AtlasGlossary
355386
) -> Generator[AtlasGlossaryTerm, None, None]:
356-
t = create_term(client, name=TERM_NAME3, glossary_guid=glossary.guid)
387+
t = create_term(
388+
client, name=TERM_NAME3, glossary_qualified_name=glossary.qualified_name
389+
)
357390
yield t
358391
delete_asset(client, guid=t.guid, asset_type=AtlasGlossaryTerm)
359392

tests/unit/model/glossary_category_test.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,16 @@ def test_create(
5858
anchor=anchor,
5959
parent_category=parent_category,
6060
)
61-
6261
assert sut.name == GLOSSARY_CATEGORY_NAME
6362
assert sut.qualified_name
64-
assert sut.parent_category == parent_category
65-
assert sut.anchor == anchor
63+
64+
expected_parent = (
65+
parent_category.trim_to_reference() if sut.parent_category else parent_category
66+
)
67+
assert sut.parent_category == expected_parent
68+
69+
expected_anchor = anchor.trim_to_reference() if sut.anchor else anchor
70+
assert sut.anchor == expected_anchor
6671

6772

6873
@pytest.mark.parametrize(

tests/unit/model/glossary_term_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ def test_create(
122122
assert sut.qualified_name
123123
assert sut.categories == categories
124124
assert (
125-
(anchor and sut.anchor == anchor)
125+
(anchor and sut.anchor == anchor.trim_to_reference())
126126
or (
127127
glossary_qualified_name
128128
and sut.anchor is not None

tests/unit/test_glossary_term.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,15 @@ def test_create_atttributes_without_required_parameters_raises_value_error(
5252
@pytest.mark.parametrize(
5353
"name, anchor, glossary_qualified_name, glossary_guid",
5454
[
55-
("Glossary", AtlasGlossary(), None, None),
55+
("Glossary", AtlasGlossary.ref_by_guid(guid="123"), None, None),
56+
(
57+
"Glossary",
58+
AtlasGlossary.ref_by_qualified_name(
59+
qualified_name="glossary/qualifiedName"
60+
),
61+
None,
62+
None,
63+
),
5664
("Glossary", None, "glossary/qualifiedName", None),
5765
("Glossary", None, None, "123"),
5866
],
@@ -126,7 +134,15 @@ def test_create_without_required_parameters_raises_value_error(
126134
@pytest.mark.parametrize(
127135
"name, anchor, glossary_qualified_name, glossary_guid",
128136
[
129-
("Glossary", AtlasGlossary(), None, None),
137+
("Glossary", AtlasGlossary.ref_by_guid(guid="123"), None, None),
138+
(
139+
"Glossary",
140+
AtlasGlossary.ref_by_qualified_name(
141+
qualified_name="glossary/qualifiedName"
142+
),
143+
None,
144+
None,
145+
),
130146
("Glossary", None, "glossary/qualifiedName", None),
131147
("Glossary", None, None, "123"),
132148
],

0 commit comments

Comments
 (0)