Skip to content

Commit 527831c

Browse files
committed
feat(enums): add deprecated Phosphor icon names to AtlanIcon [BLDX-1096]
Add 11 deprecated Phosphor icon values that customers may have persisted in tag/CM definitions. Without these, SDK deserialization fails when encountering old icon names like PhCircleWavyWarning, breaking tag resolution for the entire export. Each deprecated entry has a comment pointing to its replacement. Includes 46 unit tests covering existence, deserialization, and replacement mapping.
1 parent d32c766 commit 527831c

2 files changed

Lines changed: 95 additions & 0 deletions

File tree

pyatlan/model/enums.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,7 @@ class AtlanDeleteType(str, Enum):
413413

414414
class AtlanIcon(str, Enum):
415415
ACORN = "PhAcorn"
416+
ACTIVITY = "PhActivity" # Deprecated: use PULSE
416417
ADDRESS_BOOK = "PhAddressBook"
417418
ADDRESS_BOOK_TABS = "PhAddressBookTabs"
418419
AIRPLANE = "PhAirplane"
@@ -791,6 +792,10 @@ class AtlanIcon(str, Enum):
791792
CIRCLE_HALF = "PhCircleHalf"
792793
CIRCLE_HALF_TILT = "PhCircleHalfTilt"
793794
CIRCLE_NOTCH = "PhCircleNotch"
795+
CIRCLE_WAVY = "PhCircleWavy" # Deprecated: use SEAL
796+
CIRCLE_WAVY_CHECK = "PhCircleWavyCheck" # Deprecated: use SEAL_CHECK
797+
CIRCLE_WAVY_QUESTION = "PhCircleWavyQuestion" # Deprecated: use SEAL_QUESTION
798+
CIRCLE_WAVY_WARNING = "PhCircleWavyWarning" # Deprecated: use SEAL_WARNING
794799
CIRCUITRY = "PhCircuitry"
795800
CITY = "PhCity"
796801
CLIPBOARD = "PhClipboard"
@@ -996,6 +1001,7 @@ class AtlanIcon(str, Enum):
9961001
FILE_CSV = "PhFileCsv"
9971002
FILE_C_SHARP = "PhFileCSharp"
9981003
FILE_DASHED = "PhFileDashed"
1004+
FILE_DOTTED = "PhFileDotted" # Deprecated: use FILE_DASHED
9991005
FILE_DOC = "PhFileDoc"
10001006
FILE_HTML = "PhFileHtml"
10011007
FILE_IMAGE = "PhFileImage"
@@ -1005,6 +1011,7 @@ class AtlanIcon(str, Enum):
10051011
FILE_JSX = "PhFileJsx"
10061012
FILE_LOCK = "PhFileLock"
10071013
FILE_MAGNIFYING_GLASS = "PhFileMagnifyingGlass"
1014+
FILE_SEARCH = "PhFileSearch" # Deprecated: use FILE_MAGNIFYING_GLASS
10081015
FILE_MD = "PhFileMd"
10091016
FILE_MINUS = "PhFileMinus"
10101017
FILE_PDF = "PhFilePdf"
@@ -1059,6 +1066,7 @@ class AtlanIcon(str, Enum):
10591066
FOLDER = "PhFolder"
10601067
FOLDERS = "PhFolders"
10611068
FOLDER_DASHED = "PhFolderDashed"
1069+
FOLDER_DOTTED = "PhFolderDotted" # Deprecated: use FOLDER_DASHED
10621070
FOLDER_LOCK = "PhFolderLock"
10631071
FOLDER_MINUS = "PhFolderMinus"
10641072
FOLDER_NOTCH = "PhFolderNotch"
@@ -1069,6 +1077,7 @@ class AtlanIcon(str, Enum):
10691077
FOLDER_PLUS = "PhFolderPlus"
10701078
FOLDER_SIMPLE = "PhFolderSimple"
10711079
FOLDER_SIMPLE_DASHED = "PhFolderSimpleDashed"
1080+
FOLDER_SIMPLE_DOTTED = "PhFolderSimpleDotted" # Deprecated: use FOLDER_SIMPLE_DASHED
10721081
FOLDER_SIMPLE_LOCK = "PhFolderSimpleLock"
10731082
FOLDER_SIMPLE_MINUS = "PhFolderSimpleMinus"
10741083
FOLDER_SIMPLE_PLUS = "PhFolderSimplePlus"
@@ -1462,6 +1471,7 @@ class AtlanIcon(str, Enum):
14621471
PEN_NIB_STRAIGHT = "PhPenNibStraight"
14631472
PEPPER = "PhPepper"
14641473
PERCENT = "PhPercent"
1474+
PEDESTRIAN = "PhPedestrian" # Deprecated: use PERSON
14651475
PERSON = "PhPerson"
14661476
PERSON_ARMS_SPREAD = "PhPersonArmsSpread"
14671477
PERSON_SIMPLE = "PhPersonSimple"
@@ -1770,6 +1780,7 @@ class AtlanIcon(str, Enum):
17701780
TEXT_ALIGN_RIGHT = "PhTextAlignRight"
17711781
TEXT_A_UNDERLINE = "PhTextAUnderline"
17721782
TEXT_B = "PhTextB"
1783+
TEXT_BOLDER = "PhTextBolder" # Deprecated: use TEXT_B
17731784
TEXT_COLUMNS = "PhTextColumns"
17741785
TEXT_H = "PhTextH"
17751786
TEXT_H_FIVE = "PhTextHFive"

tests/unit/model/icon_enum_test.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
"""Tests for AtlanIcon enum — deprecated Phosphor icon backward compat (BLDX-1096)."""
2+
3+
import pytest
4+
5+
from pyatlan.model.enums import AtlanIcon
6+
7+
8+
# Mapping of deprecated enum names to their string values
9+
DEPRECATED_ICONS = {
10+
"ACTIVITY": "PhActivity",
11+
"CIRCLE_WAVY": "PhCircleWavy",
12+
"CIRCLE_WAVY_CHECK": "PhCircleWavyCheck",
13+
"CIRCLE_WAVY_QUESTION": "PhCircleWavyQuestion",
14+
"CIRCLE_WAVY_WARNING": "PhCircleWavyWarning",
15+
"FILE_DOTTED": "PhFileDotted",
16+
"FILE_SEARCH": "PhFileSearch",
17+
"FOLDER_DOTTED": "PhFolderDotted",
18+
"FOLDER_SIMPLE_DOTTED": "PhFolderSimpleDotted",
19+
"PEDESTRIAN": "PhPedestrian",
20+
"TEXT_BOLDER": "PhTextBolder",
21+
}
22+
23+
# Mapping of deprecated → replacement enum names
24+
REPLACEMENT_MAP = {
25+
"ACTIVITY": "PULSE",
26+
"CIRCLE_WAVY": "SEAL",
27+
"CIRCLE_WAVY_CHECK": "SEAL_CHECK",
28+
"CIRCLE_WAVY_QUESTION": "SEAL_QUESTION",
29+
"CIRCLE_WAVY_WARNING": "SEAL_WARNING",
30+
"FILE_DOTTED": "FILE_DASHED",
31+
"FILE_SEARCH": "FILE_MAGNIFYING_GLASS",
32+
"FOLDER_DOTTED": "FOLDER_DASHED",
33+
"FOLDER_SIMPLE_DOTTED": "FOLDER_SIMPLE_DASHED",
34+
"PEDESTRIAN": "PERSON",
35+
"TEXT_BOLDER": "TEXT_B",
36+
}
37+
38+
39+
class TestDeprecatedIconsExist:
40+
"""All deprecated Phosphor icon names must be valid AtlanIcon enum members."""
41+
42+
@pytest.mark.parametrize("name,value", DEPRECATED_ICONS.items())
43+
def test_deprecated_icon_exists_in_enum(self, name, value):
44+
icon = AtlanIcon[name]
45+
assert icon.value == value
46+
47+
@pytest.mark.parametrize("name,value", DEPRECATED_ICONS.items())
48+
def test_deprecated_icon_deserializes_from_value(self, name, value):
49+
"""Simulates deserialization — looking up by string value."""
50+
icon = AtlanIcon(value)
51+
assert icon.name == name
52+
53+
54+
class TestReplacementIconsExist:
55+
"""Each deprecated icon has a valid replacement in the enum."""
56+
57+
@pytest.mark.parametrize(
58+
"deprecated,replacement", REPLACEMENT_MAP.items()
59+
)
60+
def test_replacement_exists(self, deprecated, replacement):
61+
assert replacement in AtlanIcon.__members__
62+
63+
@pytest.mark.parametrize(
64+
"deprecated,replacement", REPLACEMENT_MAP.items()
65+
)
66+
def test_deprecated_and_replacement_are_different_values(
67+
self, deprecated, replacement
68+
):
69+
"""Deprecated and replacement icons have different string values."""
70+
assert AtlanIcon[deprecated].value != AtlanIcon[replacement].value
71+
72+
73+
class TestIconEnumIntegrity:
74+
"""General enum health checks."""
75+
76+
def test_no_duplicate_values(self):
77+
"""All enum values must be unique."""
78+
values = [icon.value for icon in AtlanIcon]
79+
assert len(values) == len(set(values)), "Duplicate values found in AtlanIcon"
80+
81+
def test_all_values_are_non_empty(self):
82+
"""All AtlanIcon values must be non-empty strings."""
83+
for icon in AtlanIcon:
84+
assert icon.value, f"{icon.name} has empty value"

0 commit comments

Comments
 (0)