Skip to content

Commit 8642428

Browse files
authored
Merge pull request #50 from bci-oss/add-human-readable-representation
Add human-readable object representation
2 parents f6924d5 + 8048706 commit 8642428

40 files changed

+486
-0
lines changed

core/esmf-aspect-meta-model-python/esmf_aspect_meta_model_python/base/base.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,7 @@ def parent_elements(self, elements: list["Base"]) -> None:
3434
@abstractmethod
3535
def append_parent_element(self, element: "Base") -> None:
3636
"""Add parent element."""
37+
38+
def __repr__(self):
39+
"""Object representation."""
40+
return f"{self.__class__.__name__}({self.name})"

core/esmf-aspect-meta-model-python/esmf_aspect_meta_model_python/base/data_types/data_type.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,6 @@ def is_scalar(self) -> bool:
3030
def is_complex(self) -> bool:
3131
"""Is complex flag."""
3232
return not self.is_scalar
33+
34+
def __repr__(self):
35+
return f"{self.__class__.__name__}({self.urn})"

core/esmf-aspect-meta-model-python/esmf_aspect_meta_model_python/base/data_types/scalar.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,6 @@ class Scalar(DataType, ABC):
2525
def is_scalar(self) -> bool:
2626
"""Is scalar flag."""
2727
return True
28+
29+
def __repr__(self):
30+
return f"{self.__class__.__name__}({self.urn})"

core/esmf-aspect-meta-model-python/esmf_aspect_meta_model_python/impl/base_impl.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,16 @@
1414
from typing import Dict, List, Optional
1515

1616
from esmf_aspect_meta_model_python.base.base import Base
17+
from esmf_aspect_meta_model_python.base.is_described import IsDescribed
1718
from esmf_aspect_meta_model_python.loader.meta_model_base_attributes import MetaModelBaseAttributes
1819

1920

2021
class BaseImpl(Base, metaclass=abc.ABCMeta):
2122
"""Base Implemented class."""
2223

24+
SCALAR_ATTR_NAMES = ["meta_model_version", "urn", "preferred_names", "descriptions"]
25+
LIST_ATTR_NAMES = ["see"]
26+
2327
def __init__(self, meta_model_base_attributes: MetaModelBaseAttributes):
2428
self._meta_model_version = meta_model_base_attributes.meta_model_version
2529
self._urn = meta_model_base_attributes.urn
@@ -75,3 +79,67 @@ def urn(self) -> Optional[str]:
7579
def name(self) -> str:
7680
"""Name."""
7781
return self._name
82+
83+
def _get_base_message(self):
84+
"""Get base string message."""
85+
message = self.__class__.__name__
86+
message = message.replace("Default", "")
87+
message = f"({message}){self.name}"
88+
89+
return message
90+
91+
@staticmethod
92+
def _prepare_attr_message(name, value):
93+
"""Prepare a message with scalar attribute value."""
94+
message = f"{name}: "
95+
if isinstance(value, dict):
96+
for k, v in value.items():
97+
message += f"\n\t\t{k.upper()}: {v}"
98+
else:
99+
if isinstance(value, BaseImpl):
100+
message += repr(value)
101+
else:
102+
value_str = str(value)
103+
message += value_str.replace("\t", "\t\t")
104+
105+
return message
106+
107+
def _get_scalar_attr_info(self):
108+
"""Get info about all scalar attributes."""
109+
message = ""
110+
for attr_name in self.SCALAR_ATTR_NAMES:
111+
attr_value = getattr(self, attr_name, None)
112+
if attr_value:
113+
message += f"\n\t{self._prepare_attr_message(attr_name, attr_value)}"
114+
115+
return message
116+
117+
@staticmethod
118+
def _prepare_list_attr_message(name, value):
119+
"""Prepare a message for the list data type attribute value."""
120+
message = f"{name}:"
121+
for elem in value:
122+
if isinstance(elem, IsDescribed):
123+
message += f"\n\t\t{elem.name}"
124+
else:
125+
message += f"\n\t\t{elem}"
126+
127+
return message
128+
129+
def _get_list_attr_info(self):
130+
"""Get info about all list data type attributes."""
131+
message = ""
132+
for attr_name in self.LIST_ATTR_NAMES:
133+
attr_value = getattr(self, attr_name, [])
134+
if attr_value:
135+
message += f"\n\t{self._prepare_list_attr_message(attr_name, attr_value)}"
136+
137+
return message
138+
139+
def __str__(self):
140+
"""String representation."""
141+
message = self._get_base_message()
142+
message += self._get_scalar_attr_info()
143+
message += self._get_list_attr_info()
144+
145+
return message

core/esmf-aspect-meta-model-python/esmf_aspect_meta_model_python/impl/characteristics/collection/default_collection.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
class DefaultCollection(DefaultCharacteristic, Collection):
2222
"""Default Collection class."""
2323

24+
SCALAR_ATTR_NAMES = DefaultCharacteristic.SCALAR_ATTR_NAMES + ["element_characteristic"]
25+
2426
def __init__(
2527
self,
2628
meta_model_base_attributes: MetaModelBaseAttributes,

core/esmf-aspect-meta-model-python/esmf_aspect_meta_model_python/impl/characteristics/default_characteristic.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
class DefaultCharacteristic(BaseImpl, Characteristic):
2020
"""Default Characteristic class."""
2121

22+
SCALAR_ATTR_NAMES = BaseImpl.SCALAR_ATTR_NAMES + ["data_type"]
23+
2224
def __init__(self, meta_model_base_attributes: MetaModelBaseAttributes, data_type: DataType):
2325
super().__init__(meta_model_base_attributes)
2426
self._data_type = data_type

core/esmf-aspect-meta-model-python/esmf_aspect_meta_model_python/impl/characteristics/default_enumeration.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
class DefaultEnumeration(DefaultCharacteristic, Enumeration):
2121
"""Default Enumeration class."""
2222

23+
LIST_ATTR_NAMES = DefaultCharacteristic.LIST_ATTR_NAMES + ["values"]
24+
2325
def __init__(
2426
self,
2527
meta_model_base_attributes: MetaModelBaseAttributes,

core/esmf-aspect-meta-model-python/esmf_aspect_meta_model_python/impl/characteristics/default_state.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
class DefaultState(DefaultEnumeration, State):
2121
"""Default State class."""
2222

23+
SCALAR_ATTR_NAMES = DefaultEnumeration.SCALAR_ATTR_NAMES + ["default_value"]
24+
2325
def __init__(
2426
self,
2527
meta_model_base_attributes: MetaModelBaseAttributes,

core/esmf-aspect-meta-model-python/esmf_aspect_meta_model_python/impl/characteristics/default_structured_value.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
class DefaultStructuredValue(DefaultCharacteristic, StructuredValue):
2121
"""Default Structured Value class"""
2222

23+
SCALAR_ATTR_NAMES = DefaultCharacteristic.SCALAR_ATTR_NAMES + ["deconstruction_rule"]
24+
LIST_ATTR_NAMES = DefaultCharacteristic.LIST_ATTR_NAMES + ["elements"]
25+
2326
def __init__(
2427
self,
2528
meta_model_base_attributes: MetaModelBaseAttributes,

core/esmf-aspect-meta-model-python/esmf_aspect_meta_model_python/impl/characteristics/default_trait.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
class DefaultTrait(DefaultCharacteristic, Trait):
2222
"""Default Trait class."""
2323

24+
SCALAR_ATTR_NAMES = DefaultCharacteristic.SCALAR_ATTR_NAMES + ["base_characteristic"]
25+
LIST_ATTR_NAMES = DefaultCharacteristic.LIST_ATTR_NAMES + ["constraints"]
26+
2427
def __init__(
2528
self,
2629
meta_model_base_attributes: MetaModelBaseAttributes,

0 commit comments

Comments
 (0)