Skip to content

Commit 3400e3f

Browse files
author
Conny Gustafsson
committed
Implement PortDefinedArgumentValue
1 parent e87de97 commit 3400e3f

File tree

7 files changed

+120
-9
lines changed

7 files changed

+120
-9
lines changed

run_examples.sh

100644100755
File mode changed.

run_flake.sh

100644100755
File mode changed.

run_tests.sh

100644100755
File mode changed.

src/autosar/xml/element.py

+26
Original file line numberDiff line numberDiff line change
@@ -6202,6 +6202,32 @@ def __init__(self,
62026202
self._assign_optional_strict("trigger", trigger, PTriggerInAtomicSwcTypeInstanceRef)
62036203

62046204

6205+
class PortDefinedArgumentValue(ARObject):
6206+
"""
6207+
Complex type AR:PORT-DEFINED-ARGUMENT-VALUE
6208+
Tag variantS: 'PORT-DEFINED-ARGUMENT-VALUE'
6209+
"""
6210+
6211+
def __init__(self,
6212+
value: ValueSpecificationElement | None = None,
6213+
value_type: ImplementationDataTypeRef | str | None = None) -> None:
6214+
super().__init__()
6215+
# .VALUE
6216+
self.value: ValueSpecificationElement | None = None
6217+
# .VALUE-TYPE-TREF
6218+
self.value_type: ImplementationDataTypeRef | None = None
6219+
6220+
self._assign_optional_strict("value", value, ValueSpecification)
6221+
self._assign_optional("value_type", value_type, ImplementationDataTypeRef)
6222+
6223+
6224+
class PortAPIOption(ARObject):
6225+
"""
6226+
Complex type AR:PORT-API-OPTION
6227+
Tag variants: 'PORT-API-OPTION'
6228+
"""
6229+
6230+
62056231
class InternalBehavior(Identifiable):
62066232
"""
62076233
Group AR:INTERNAL-BEHAVIOR

src/autosar/xml/reader.py

+25-1
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ def __init__(self,
317317
'SWC-MODE-SWITCH-EVENT': self._read_swc_mode_switch_event,
318318
'TIMING-EVENT': self._read_timing_event,
319319
'TRANSFORMER-HARD-ERROR-EVENT': self._read_transformer_hard_error_event,
320+
'PORT-DEFINED-ARGUMENT-VALUE': self._read_port_defined_argument_value,
320321
}
321322
self.switcher_all = {}
322323
self.switcher_all.update(self.switcher_collectable)
@@ -5047,7 +5048,7 @@ def _read_transformer_hard_error_event(self,
50475048
xml_element: ElementTree.Element
50485049
) -> ar_element.TransformerHardErrorEvent:
50495050
"""
5050-
Writes complex type AR:TRANSFORMER-HARD-ERROR-EVENT
5051+
Reads complex type AR:TRANSFORMER-HARD-ERROR-EVENT
50515052
Tag variants: 'TRANSFORMER-HARD-ERROR-EVENT'
50525053
"""
50535054
data = {}
@@ -5074,6 +5075,29 @@ def _read_transformer_hard_error_event_group(self, child_elements: ChildElementM
50745075
if xml_child is not None:
50755076
data["trigger"] = self._read_p_trigger_in_atomic_swc_instance_ref(xml_child)
50765077

5078+
def _read_port_defined_argument_value(self,
5079+
xml_element: ElementTree.Element
5080+
) -> ar_element.PortDefinedArgumentValue:
5081+
"""
5082+
Reads complex type AR:PORT-DEFINED-ARGUMENT-VALUE
5083+
Tag variants: 'PORT-DEFINED-ARGUMENT-VALUE'
5084+
"""
5085+
data = {}
5086+
child_elements = ChildElementMap(xml_element)
5087+
xml_child = child_elements.get("VALUE")
5088+
if xml_child is not None:
5089+
try:
5090+
xml_grand_child = xml_child.find("./*")
5091+
if xml_grand_child is not None:
5092+
data["value"] = self._read_value_specification_element(xml_grand_child)
5093+
except KeyError:
5094+
pass
5095+
xml_child = child_elements.get("VALUE-TYPE-TREF")
5096+
if xml_child is not None:
5097+
data["value_type"] = self._read_impl_data_type_ref(xml_child)
5098+
self._report_unprocessed_elements(child_elements)
5099+
return ar_element.PortDefinedArgumentValue(**data)
5100+
50775101
def _read_swc_internal_behavior(self, xml_element: ElementTree.Element) -> ar_element.SwcInternalBehavior:
50785102
"""
50795103
Reads complex type AR:SWC-INTERNAL-BEHAVIOR

src/autosar/xml/writer.py

+27-8
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,7 @@ def __init__(self,
372372
'SwcModeSwitchEvent': self._write_swc_mode_switch_event,
373373
'TimingEvent': self._write_timing_event,
374374
'TransformerHardErrorEvent': self._write_transformer_hard_error_event,
375+
'PortDefinedArgumentValue': self._write_port_defined_argument_value,
375376
}
376377
self.switcher_all = {} # All concrete elements (used for unit testing)
377378
self.switcher_all.update(self.switcher_collectable)
@@ -1467,7 +1468,7 @@ def _write_sw_data_def_props_content(self, elem: ar_element.SwDataDefPropsCondit
14671468
if elem.data_constraint_ref is not None:
14681469
self._write_data_constraint_ref(elem.data_constraint_ref)
14691470
if elem.impl_data_type_ref is not None:
1470-
self._write_impl_data_type_ref(elem.impl_data_type_ref)
1471+
self._write_impl_data_type_ref(elem.impl_data_type_ref, "IMPLEMENTATION-DATA-TYPE-REF")
14711472
if elem.impl_policy is not None:
14721473
self._add_content('SW-IMPL-POLICY',
14731474
ar_enum.enum_to_xml(elem.impl_policy))
@@ -1792,7 +1793,7 @@ def _write_data_type_map(self, elem: ar_element.DataTypeMap) -> None:
17921793
if elem.appl_data_type_ref is not None:
17931794
self._write_application_data_type_ref(elem.appl_data_type_ref, "APPLICATION-DATA-TYPE-REF")
17941795
if elem.impl_data_type_ref is not None:
1795-
self._write_impl_data_type_ref(elem.impl_data_type_ref)
1796+
self._write_impl_data_type_ref(elem.impl_data_type_ref, "IMPLEMENTATION-DATA-TYPE-REF")
17961797
self._leave_child()
17971798

17981799
def _write_data_type_mapping_set(self, elem: ar_element.DataTypeMappingSet) -> None:
@@ -1986,19 +1987,18 @@ def _write_function_ptr_signature_ref(self, elem: ar_element.FunctionPtrSignatur
19861987
self._collect_base_ref_attr(elem, attr)
19871988
self._add_content('FUNCTION-POINTER-SIGNATURE-REF', elem.value, attr)
19881989

1989-
def _write_impl_data_type_ref(self, elem: ar_element.ImplementationDataTypeRef) -> None:
1990+
def _write_impl_data_type_ref(self, elem: ar_element.ImplementationDataTypeRef, tag: str) -> None:
19901991
"""
1991-
Writes complex type AR:IMPLEMENTATION-DATA-TYPE-REF
1992-
Type: Concrete
1993-
Tag variants: 'IMPLEMENTATION-DATA-TYPE-REF'
1992+
Writes reference to AR:IMPLEMENTATION-DATA-TYPE-REF
1993+
Tag variants: 'IMPLEMENTATION-DATA-TYPE-REF' | 'VALUE-TYPE-TREF'
19941994
19951995
Note: The name of the complex-type is anonymous in the XML schema.
19961996
19971997
"""
19981998
assert isinstance(elem, ar_element.ImplementationDataTypeRef)
19991999
attr: TupleList = []
20002000
self._collect_base_ref_attr(elem, attr)
2001-
self._add_content('IMPLEMENTATION-DATA-TYPE-REF', elem.value, attr)
2001+
self._add_content(tag, elem.value, attr)
20022002

20032003
def _write_sw_base_type_ref(self, elem: ar_element.SwBaseTypeRef) -> None:
20042004
"""
@@ -2016,7 +2016,7 @@ def _write_sw_base_type_ref(self, elem: ar_element.SwBaseTypeRef) -> None:
20162016

20172017
def _write_sw_addr_method_ref(self, elem: ar_element.SwAddrMethodRef) -> None:
20182018
"""
2019-
Writes references to AR:SW-ADDR-METHOD--SUBTYPES-ENUM
2019+
Writes reference to AR:SW-ADDR-METHOD--SUBTYPES-ENUM
20202020
Tag variants: 'SW-ADDR-METHOD-REF'
20212021
"""
20222022
assert isinstance(elem, ar_element.SwAddrMethodRef)
@@ -4351,6 +4351,25 @@ def _write_transformer_hard_error_event_group(self, elem: ar_element.Transformer
43514351
if elem.trigger is not None:
43524352
self._write_p_trigger_in_atomic_swc_instance_ref(elem.trigger, "TRIGGER-IREF")
43534353

4354+
def _write_port_defined_argument_value(self, elem: ar_element.PortDefinedArgumentValue) -> None:
4355+
"""
4356+
Writes complex type AR:PORT-DEFINED-ARGUMENT-VALUE
4357+
Tag variants: 'PORT-DEFINED-ARGUMENT-VALUE'
4358+
"""
4359+
assert isinstance(elem, ar_element.PortDefinedArgumentValue)
4360+
tag = "PORT-DEFINED-ARGUMENT-VALUE"
4361+
if elem.is_empty:
4362+
self._add_content(tag)
4363+
else:
4364+
self._add_child(tag)
4365+
if elem.value is not None:
4366+
self._add_child("VALUE")
4367+
self._write_value_specification_element(elem.value)
4368+
self._leave_child()
4369+
if elem.value_type is not None:
4370+
self._write_impl_data_type_ref(elem.value_type, "VALUE-TYPE-TREF")
4371+
self._leave_child()
4372+
43544373
def _write_swc_internal_behavior(self, elem: ar_element.SwcInternalBehavior) -> None:
43554374
"""
43564375
Writes complex type AR:SWC-INTERNAL-BEHAVIOR

tests/xml/test_swc_internal_behavior.py

+42
Original file line numberDiff line numberDiff line change
@@ -1664,6 +1664,48 @@ def test_trigger(self):
16641664
self.assertEqual(str(inner.target_trigger), target_trigger_ref_str)
16651665

16661666

1667+
class TestPortDefinedArgumentValue(unittest.TestCase):
1668+
def test_empty(self):
1669+
element = ar_element.PortDefinedArgumentValue()
1670+
writer = autosar.xml.Writer()
1671+
xml = writer.write_str_elem(element)
1672+
self.assertEqual(xml, '<PORT-DEFINED-ARGUMENT-VALUE/>')
1673+
reader = autosar.xml.Reader()
1674+
elem: ar_element.PortDefinedArgumentValue = reader.read_str_elem(xml)
1675+
self.assertIsInstance(elem, ar_element.PortDefinedArgumentValue)
1676+
1677+
def test_value(self):
1678+
value = ar_element.NumericalValueSpecification(value=10)
1679+
element = ar_element.PortDefinedArgumentValue(value=value)
1680+
writer = autosar.xml.Writer()
1681+
xml = '''<PORT-DEFINED-ARGUMENT-VALUE>
1682+
<VALUE>
1683+
<NUMERICAL-VALUE-SPECIFICATION>
1684+
<VALUE>10</VALUE>
1685+
</NUMERICAL-VALUE-SPECIFICATION>
1686+
</VALUE>
1687+
</PORT-DEFINED-ARGUMENT-VALUE>'''
1688+
self.assertEqual(writer.write_str_elem(element), xml)
1689+
reader = autosar.xml.Reader()
1690+
elem: ar_element.PortDefinedArgumentValue = reader.read_str_elem(xml)
1691+
self.assertIsInstance(elem.value, ar_element.NumericalValueSpecification)
1692+
self.assertEqual(elem.value.value, 10)
1693+
1694+
def test_value_type(self):
1695+
ref_str = "/DataTypes/TypeName"
1696+
impl_type_ref = ar_element.ImplementationDataTypeRef(ref_str)
1697+
element = ar_element.PortDefinedArgumentValue(value_type=impl_type_ref)
1698+
writer = autosar.xml.Writer()
1699+
xml = f'''<PORT-DEFINED-ARGUMENT-VALUE>
1700+
<VALUE-TYPE-TREF DEST="IMPLEMENTATION-DATA-TYPE">{ref_str}</VALUE-TYPE-TREF>
1701+
</PORT-DEFINED-ARGUMENT-VALUE>'''
1702+
self.assertEqual(writer.write_str_elem(element), xml)
1703+
reader = autosar.xml.Reader()
1704+
elem: ar_element.PortDefinedArgumentValue = reader.read_str_elem(xml)
1705+
self.assertIsInstance(elem.value_type, ar_element.ImplementationDataTypeRef)
1706+
self.assertEqual(str(elem.value_type), ref_str)
1707+
1708+
16671709
class TestSwcInternalBehavior(unittest.TestCase):
16681710
"""
16691711
Most elements are not implemented yet

0 commit comments

Comments
 (0)