Skip to content

Commit 03c1579

Browse files
committed
model.Extension: Change refers_to to be of type Set[Reference]
Currently, `Extension.refers_to` is declared as a `Iterable[Reference]`. This implies, that we can not necessarily check, whether or not the attribute is empty or not. This creates a problem with the XML serialization, since the `<aas.refersTo>` element should only appear if there is at least one `Reference` inside. This commit changes the `Extension.refers_to` to be a set of `Reference`s, as well as adapting a more clear check whether or not the attribute is empty in `adapter.xml.xml_serialization`.
1 parent 1ada11f commit 03c1579

4 files changed

Lines changed: 9 additions & 8 deletions

File tree

basyx/aas/adapter/xml/xml_deserialization.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -692,10 +692,11 @@ def construct_extension(cls, element: etree.Element, object_class=model.Extensio
692692
value = _get_text_or_none(element.find(NS_AAS + "value"))
693693
if value is not None:
694694
extension.value = model.datatypes.from_xsd(value, extension.value_type)
695-
extension.refers_to = _failsafe_construct_multiple(
696-
element.find(NS_AAS + "refersTo").findall(NS_AAS + "reference"),
697-
cls._construct_referable_reference, cls.failsafe
698-
)
695+
refers_to = element.find(NS_AAS + "refersTo")
696+
if refers_to is not None:
697+
for ref in _child_construct_multiple(refers_to, NS_AAS + "reference", cls._construct_referable_reference,
698+
cls.failsafe):
699+
extension.refers_to.add(ref)
699700
cls._amend_abstract_attributes(extension, element)
700701
return extension
701702

basyx/aas/adapter/xml/xml_serialization.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ def extension_to_xml(obj: model.Extension, tag: str = NS_AAS+"extension") -> etr
277277
text=model.datatypes.XSD_TYPE_NAMES[obj.value_type]))
278278
if obj.value:
279279
et_extension.append(_value_to_xml(obj.value, obj.value_type)) # type: ignore # (value_type could be None)
280-
if obj.refers_to:
280+
if len(obj.refers_to) > 0:
281281
refers_to = _generate_element(NS_AAS+"refersTo")
282282
for reference in obj.refers_to:
283283
refers_to.append(reference_to_xml(reference, NS_AAS+"reference"))

basyx/aas/examples/data/example_aas.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,9 @@ def create_example_asset_identification_submodel() -> model.Submodel:
101101
name='ExampleExtension',
102102
value_type=model.datatypes.String,
103103
value="ExampleExtensionValue",
104-
refers_to=(model.ModelReference((model.Key(type_=model.KeyTypes.ASSET_ADMINISTRATION_SHELL,
104+
refers_to=[model.ModelReference((model.Key(type_=model.KeyTypes.ASSET_ADMINISTRATION_SHELL,
105105
value='http://acplt.org/RefersTo/ExampleRefersTo'),),
106-
model.AssetAdministrationShell),))
106+
model.AssetAdministrationShell)],)
107107

108108
# Property-Element conform to 'Verwaltungssschale in der Praxis' page 41 ManufacturerName:
109109
# https://www.plattform-i40.de/PI40/Redaktion/DE/Downloads/Publikation/2019-verwaltungsschale-in-der-praxis.html

basyx/aas/model/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1468,7 +1468,7 @@ def __init__(self,
14681468
self.value_type: Optional[DataTypeDefXsd] = value_type
14691469
self._value: Optional[ValueDataType]
14701470
self.value = value
1471-
self.refers_to: Iterable[ModelReference] = refers_to
1471+
self.refers_to: Set[ModelReference] = set(refers_to)
14721472
self.semantic_id: Optional[Reference] = semantic_id
14731473
self.supplemental_semantic_id: ConstrainedList[Reference] = ConstrainedList(supplemental_semantic_id)
14741474

0 commit comments

Comments
 (0)