odxtools 10.0.0__py3-none-any.whl → 10.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. odxtools/additionalaudience.py +5 -5
  2. odxtools/admindata.py +10 -9
  3. odxtools/audience.py +15 -15
  4. odxtools/basecomparam.py +7 -6
  5. odxtools/basevariantpattern.py +7 -7
  6. odxtools/basicstructure.py +9 -9
  7. odxtools/cli/_print_utils.py +1 -1
  8. odxtools/cli/browse.py +1 -1
  9. odxtools/cli/list.py +1 -1
  10. odxtools/commrelation.py +14 -13
  11. odxtools/companydata.py +11 -11
  12. odxtools/companydocinfo.py +11 -13
  13. odxtools/companyrevisioninfo.py +7 -7
  14. odxtools/companyspecificinfo.py +9 -11
  15. odxtools/comparam.py +6 -5
  16. odxtools/comparaminstance.py +10 -10
  17. odxtools/comparamspec.py +8 -9
  18. odxtools/comparamsubset.py +14 -22
  19. odxtools/complexcomparam.py +10 -10
  20. odxtools/complexdop.py +1 -1
  21. odxtools/compositecodec.py +3 -3
  22. odxtools/compumethods/compucodecompumethod.py +4 -4
  23. odxtools/compumethods/compuconst.py +3 -3
  24. odxtools/compumethods/compudefaultvalue.py +2 -2
  25. odxtools/compumethods/compuinternaltophys.py +11 -10
  26. odxtools/compumethods/compumethod.py +8 -7
  27. odxtools/compumethods/compuphystointernal.py +11 -10
  28. odxtools/compumethods/compurationalcoeffs.py +6 -6
  29. odxtools/compumethods/compuscale.py +14 -14
  30. odxtools/compumethods/createanycompumethod.py +12 -12
  31. odxtools/compumethods/identicalcompumethod.py +4 -4
  32. odxtools/compumethods/limit.py +8 -8
  33. odxtools/compumethods/linearcompumethod.py +4 -4
  34. odxtools/compumethods/linearsegment.py +8 -8
  35. odxtools/compumethods/ratfunccompumethod.py +4 -4
  36. odxtools/compumethods/ratfuncsegment.py +8 -8
  37. odxtools/compumethods/scalelinearcompumethod.py +5 -5
  38. odxtools/compumethods/scaleratfunccompumethod.py +4 -4
  39. odxtools/compumethods/tabintpcompumethod.py +12 -12
  40. odxtools/compumethods/texttablecompumethod.py +4 -4
  41. odxtools/createanycomparam.py +4 -4
  42. odxtools/createanydiagcodedtype.py +7 -7
  43. odxtools/database.py +28 -26
  44. odxtools/dataobjectproperty.py +15 -16
  45. odxtools/description.py +7 -7
  46. odxtools/determinenumberofitems.py +6 -5
  47. odxtools/diagcodedtype.py +6 -6
  48. odxtools/diagcomm.py +26 -27
  49. odxtools/diagdatadictionaryspec.py +34 -34
  50. odxtools/diaglayercontainer.py +32 -31
  51. odxtools/diaglayers/basevariant.py +5 -4
  52. odxtools/diaglayers/basevariantraw.py +18 -19
  53. odxtools/diaglayers/diaglayer.py +5 -4
  54. odxtools/diaglayers/diaglayerraw.py +39 -48
  55. odxtools/diaglayers/ecushareddata.py +6 -6
  56. odxtools/diaglayers/ecushareddataraw.py +11 -12
  57. odxtools/diaglayers/ecuvariant.py +5 -4
  58. odxtools/diaglayers/ecuvariantraw.py +17 -18
  59. odxtools/diaglayers/functionalgroup.py +5 -5
  60. odxtools/diaglayers/functionalgroupraw.py +13 -14
  61. odxtools/diaglayers/hierarchyelement.py +9 -9
  62. odxtools/diaglayers/hierarchyelementraw.py +8 -9
  63. odxtools/diaglayers/protocol.py +4 -4
  64. odxtools/diaglayers/protocolraw.py +10 -11
  65. odxtools/diagnostictroublecode.py +12 -14
  66. odxtools/diagservice.py +19 -18
  67. odxtools/diagvariable.py +19 -20
  68. odxtools/docrevision.py +14 -13
  69. odxtools/dopbase.py +10 -11
  70. odxtools/dtcconnector.py +6 -5
  71. odxtools/dtcdop.py +15 -15
  72. odxtools/dynamicendmarkerfield.py +6 -6
  73. odxtools/dynamiclengthfield.py +6 -6
  74. odxtools/dyndefinedspec.py +7 -7
  75. odxtools/dynenddopref.py +7 -7
  76. odxtools/dyniddefmodeinfo.py +17 -17
  77. odxtools/ecuvariantpattern.py +6 -7
  78. odxtools/element.py +12 -12
  79. odxtools/endofpdufield.py +6 -7
  80. odxtools/envdataconnector.py +6 -6
  81. odxtools/environmentdata.py +7 -8
  82. odxtools/environmentdatadescription.py +13 -12
  83. odxtools/externalaccessmethod.py +4 -5
  84. odxtools/externaldoc.py +4 -4
  85. odxtools/field.py +12 -11
  86. odxtools/functionalclass.py +7 -7
  87. odxtools/inputparam.py +9 -8
  88. odxtools/internalconstr.py +10 -10
  89. odxtools/leadinglengthinfotype.py +5 -6
  90. odxtools/library.py +7 -6
  91. odxtools/linkeddtcdop.py +7 -6
  92. odxtools/matchingbasevariantparameter.py +5 -5
  93. odxtools/matchingparameter.py +6 -6
  94. odxtools/message.py +1 -1
  95. odxtools/minmaxlengthtype.py +6 -7
  96. odxtools/modification.py +5 -4
  97. odxtools/multiplexer.py +48 -12
  98. odxtools/multiplexercase.py +10 -10
  99. odxtools/multiplexerdefaultcase.py +8 -7
  100. odxtools/multiplexerswitchkey.py +6 -6
  101. odxtools/nameditemlist.py +1 -1
  102. odxtools/negoutputparam.py +6 -6
  103. odxtools/odxcategory.py +12 -24
  104. odxtools/odxdoccontext.py +16 -0
  105. odxtools/odxlink.py +11 -12
  106. odxtools/odxtypes.py +3 -3
  107. odxtools/outputparam.py +7 -6
  108. odxtools/parameters/codedconstparameter.py +6 -6
  109. odxtools/parameters/createanyparameter.py +15 -15
  110. odxtools/parameters/dynamicparameter.py +4 -5
  111. odxtools/parameters/lengthkeyparameter.py +6 -6
  112. odxtools/parameters/matchingrequestparameter.py +4 -4
  113. odxtools/parameters/nrcconstparameter.py +8 -8
  114. odxtools/parameters/parameter.py +12 -13
  115. odxtools/parameters/parameterwithdop.py +9 -9
  116. odxtools/parameters/physicalconstantparameter.py +5 -4
  117. odxtools/parameters/reservedparameter.py +4 -5
  118. odxtools/parameters/systemparameter.py +4 -5
  119. odxtools/parameters/tableentryparameter.py +6 -6
  120. odxtools/parameters/tablekeyparameter.py +12 -12
  121. odxtools/parameters/tablestructparameter.py +9 -9
  122. odxtools/parameters/valueparameter.py +6 -6
  123. odxtools/paramlengthinfotype.py +6 -7
  124. odxtools/parentref.py +12 -10
  125. odxtools/physicaldimension.py +12 -12
  126. odxtools/physicaltype.py +5 -5
  127. odxtools/posresponsesuppressible.py +11 -11
  128. odxtools/preconditionstateref.py +8 -8
  129. odxtools/progcode.py +9 -8
  130. odxtools/protstack.py +8 -7
  131. odxtools/relateddiagcommref.py +5 -5
  132. odxtools/relateddoc.py +8 -7
  133. odxtools/request.py +12 -13
  134. odxtools/response.py +12 -13
  135. odxtools/scaleconstr.py +8 -8
  136. odxtools/singleecujob.py +14 -13
  137. odxtools/snrefcontext.py +1 -1
  138. odxtools/specialdata.py +6 -5
  139. odxtools/specialdatagroup.py +13 -13
  140. odxtools/specialdatagroupcaption.py +5 -4
  141. odxtools/standardlengthtype.py +5 -13
  142. odxtools/state.py +5 -4
  143. odxtools/statechart.py +10 -9
  144. odxtools/statemachine.py +2 -2
  145. odxtools/statetransition.py +7 -7
  146. odxtools/statetransitionref.py +11 -11
  147. odxtools/staticfield.py +5 -4
  148. odxtools/structure.py +5 -5
  149. odxtools/subcomponent.py +18 -16
  150. odxtools/subcomponentparamconnector.py +8 -7
  151. odxtools/subcomponentpattern.py +7 -7
  152. odxtools/swvariable.py +6 -6
  153. odxtools/table.py +20 -21
  154. odxtools/tablediagcommconnector.py +7 -6
  155. odxtools/tablerow.py +57 -36
  156. odxtools/tablerowconnector.py +6 -6
  157. odxtools/teammember.py +14 -13
  158. odxtools/templates/macros/printParentRef.xml.jinja2 +3 -1
  159. odxtools/text.py +4 -4
  160. odxtools/unit.py +9 -8
  161. odxtools/unitgroup.py +9 -8
  162. odxtools/unitspec.py +15 -16
  163. odxtools/variablegroup.py +4 -5
  164. odxtools/variantpattern.py +3 -4
  165. odxtools/version.py +2 -2
  166. odxtools/writepdxfile.py +0 -19
  167. odxtools/xdoc.py +11 -10
  168. {odxtools-10.0.0.dist-info → odxtools-10.1.0.dist-info}/METADATA +1 -1
  169. odxtools-10.1.0.dist-info/RECORD +265 -0
  170. {odxtools-10.0.0.dist-info → odxtools-10.1.0.dist-info}/WHEEL +1 -1
  171. odxtools-10.0.0.dist-info/RECORD +0 -264
  172. {odxtools-10.0.0.dist-info → odxtools-10.1.0.dist-info}/entry_points.txt +0 -0
  173. {odxtools-10.0.0.dist-info → odxtools-10.1.0.dist-info}/licenses/LICENSE +0 -0
  174. {odxtools-10.0.0.dist-info → odxtools-10.1.0.dist-info}/top_level.txt +0 -0
@@ -8,7 +8,8 @@ from typing_extensions import final, override
8
8
  from ..decodestate import DecodeState
9
9
  from ..encodestate import EncodeState
10
10
  from ..exceptions import DecodeError, EncodeError, odxraise, odxrequire
11
- from ..odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef, resolve_snref
11
+ from ..odxdoccontext import OdxDocContext
12
+ from ..odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef, resolve_snref
12
13
  from ..odxtypes import ParameterValue
13
14
  from ..snrefcontext import SnRefContext
14
15
  from ..utils import dataclass_fields_asdict
@@ -19,35 +20,34 @@ if TYPE_CHECKING:
19
20
  from ..tablerow import TableRow
20
21
 
21
22
 
22
- @dataclass
23
+ @dataclass(kw_only=True)
23
24
  class TableKeyParameter(Parameter):
24
25
 
25
26
  odx_id: OdxLinkId
26
27
 
27
28
  # the spec mandates that exactly one of the two attributes must
28
29
  # be non-None
29
- table_ref: OdxLinkRef | None
30
- table_snref: str | None
30
+ table_ref: OdxLinkRef | None = None
31
+ table_snref: str | None = None
31
32
 
32
33
  # the spec mandates that exactly one of the two attributes must
33
34
  # be non-None
34
- table_row_ref: OdxLinkRef | None
35
- table_row_snref: str | None
35
+ table_row_ref: OdxLinkRef | None = None
36
+ table_row_snref: str | None = None
36
37
 
37
38
  @staticmethod
38
39
  @override
39
- def from_et(et_element: ElementTree.Element,
40
- doc_frags: list[OdxDocFragment]) -> "TableKeyParameter":
41
- kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, doc_frags))
40
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "TableKeyParameter":
41
+ kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, context))
42
42
 
43
- odx_id = odxrequire(OdxLinkId.from_et(et_element, doc_frags))
43
+ odx_id = odxrequire(OdxLinkId.from_et(et_element, context))
44
44
 
45
- table_ref = OdxLinkRef.from_et(et_element.find("TABLE-REF"), doc_frags)
45
+ table_ref = OdxLinkRef.from_et(et_element.find("TABLE-REF"), context)
46
46
  table_snref = None
47
47
  if (table_snref_elem := et_element.find("TABLE-SNREF")) is not None:
48
48
  table_snref = odxrequire(table_snref_elem.get("SHORT-NAME"))
49
49
 
50
- table_row_ref = OdxLinkRef.from_et(et_element.find("TABLE-ROW-REF"), doc_frags)
50
+ table_row_ref = OdxLinkRef.from_et(et_element.find("TABLE-ROW-REF"), context)
51
51
  table_row_snref = None
52
52
  if (table_row_snref_elem := et_element.find("TABLE-ROW-SNREF")) is not None:
53
53
  table_row_snref = odxrequire(table_row_snref_elem.get("SHORT-NAME"))
@@ -8,7 +8,8 @@ from typing_extensions import override
8
8
  from ..decodestate import DecodeState
9
9
  from ..encodestate import EncodeState
10
10
  from ..exceptions import DecodeError, EncodeError, odxraise, odxrequire
11
- from ..odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef, resolve_snref
11
+ from ..odxdoccontext import OdxDocContext
12
+ from ..odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef, resolve_snref
12
13
  from ..odxtypes import ParameterValue
13
14
  from ..snrefcontext import SnRefContext
14
15
  from ..utils import dataclass_fields_asdict
@@ -19,10 +20,10 @@ if TYPE_CHECKING:
19
20
  from ..table import Table
20
21
 
21
22
 
22
- @dataclass
23
+ @dataclass(kw_only=True)
23
24
  class TableStructParameter(Parameter):
24
- table_key_ref: OdxLinkRef | None
25
- table_key_snref: str | None
25
+ table_key_ref: OdxLinkRef | None = None
26
+ table_key_snref: str | None = None
26
27
 
27
28
  @property
28
29
  @override
@@ -49,12 +50,11 @@ class TableStructParameter(Parameter):
49
50
 
50
51
  @staticmethod
51
52
  @override
52
- def from_et(et_element: ElementTree.Element,
53
- doc_frags: list[OdxDocFragment]) -> "TableStructParameter":
53
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "TableStructParameter":
54
54
 
55
- kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, doc_frags))
55
+ kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, context))
56
56
 
57
- table_key_ref = OdxLinkRef.from_et(et_element.find("TABLE-KEY-REF"), doc_frags)
57
+ table_key_ref = OdxLinkRef.from_et(et_element.find("TABLE-KEY-REF"), context)
58
58
  table_key_snref = None
59
59
  if (table_key_snref_elem := et_element.find("TABLE-KEY-SNREF")) is not None:
60
60
  table_key_snref = odxrequire(table_key_snref_elem.get("SHORT-NAME"))
@@ -89,7 +89,7 @@ class TableStructParameter(Parameter):
89
89
  def _encode_positioned_into_pdu(self, physical_value: ParameterValue | None,
90
90
  encode_state: EncodeState) -> None:
91
91
 
92
- if not isinstance(physical_value, tuple|list) or \
92
+ if not isinstance(physical_value, (tuple, list)) or \
93
93
  len(physical_value) != 2 or \
94
94
  not isinstance(physical_value[0], str):
95
95
  odxraise(
@@ -8,7 +8,8 @@ from typing_extensions import override
8
8
  from ..dataobjectproperty import DataObjectProperty
9
9
  from ..encodestate import EncodeState
10
10
  from ..exceptions import EncodeError, odxraise, odxrequire
11
- from ..odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId
11
+ from ..odxdoccontext import OdxDocContext
12
+ from ..odxlink import OdxLinkDatabase, OdxLinkId
12
13
  from ..odxtypes import AtomicOdxType, ParameterValue
13
14
  from ..snrefcontext import SnRefContext
14
15
  from ..utils import dataclass_fields_asdict
@@ -16,9 +17,9 @@ from .parameter import ParameterType
16
17
  from .parameterwithdop import ParameterWithDOP
17
18
 
18
19
 
19
- @dataclass
20
+ @dataclass(kw_only=True)
20
21
  class ValueParameter(ParameterWithDOP):
21
- physical_default_value_raw: str | None
22
+ physical_default_value_raw: str | None = None
22
23
 
23
24
  @property
24
25
  @override
@@ -41,10 +42,9 @@ class ValueParameter(ParameterWithDOP):
41
42
 
42
43
  @staticmethod
43
44
  @override
44
- def from_et(et_element: ElementTree.Element,
45
- doc_frags: list[OdxDocFragment]) -> "ValueParameter":
45
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "ValueParameter":
46
46
 
47
- kwargs = dataclass_fields_asdict(ParameterWithDOP.from_et(et_element, doc_frags))
47
+ kwargs = dataclass_fields_asdict(ParameterWithDOP.from_et(et_element, context))
48
48
 
49
49
  physical_default_value_raw = et_element.findtext("PHYSICAL-DEFAULT-VALUE")
50
50
 
@@ -9,7 +9,8 @@ from .decodestate import DecodeState
9
9
  from .diagcodedtype import DctType, DiagCodedType
10
10
  from .encodestate import EncodeState
11
11
  from .exceptions import EncodeError, odxraise, odxrequire
12
- from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
12
+ from .odxdoccontext import OdxDocContext
13
+ from .odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
13
14
  from .odxtypes import AtomicOdxType, DataType
14
15
  from .snrefcontext import SnRefContext
15
16
  from .utils import dataclass_fields_asdict
@@ -18,7 +19,7 @@ if TYPE_CHECKING:
18
19
  from .parameters.lengthkeyparameter import LengthKeyParameter
19
20
 
20
21
 
21
- @dataclass
22
+ @dataclass(kw_only=True)
22
23
  class ParamLengthInfoType(DiagCodedType):
23
24
  length_key_ref: OdxLinkRef
24
25
 
@@ -32,12 +33,10 @@ class ParamLengthInfoType(DiagCodedType):
32
33
 
33
34
  @staticmethod
34
35
  @override
35
- def from_et(et_element: ElementTree.Element,
36
- doc_frags: list[OdxDocFragment]) -> "ParamLengthInfoType":
37
- kwargs = dataclass_fields_asdict(DiagCodedType.from_et(et_element, doc_frags))
36
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "ParamLengthInfoType":
37
+ kwargs = dataclass_fields_asdict(DiagCodedType.from_et(et_element, context))
38
38
 
39
- length_key_ref = odxrequire(
40
- OdxLinkRef.from_et(et_element.find("LENGTH-KEY-REF"), doc_frags))
39
+ length_key_ref = odxrequire(OdxLinkRef.from_et(et_element.find("LENGTH-KEY-REF"), context))
41
40
 
42
41
  return ParamLengthInfoType(length_key_ref=length_key_ref, **kwargs)
43
42
 
odxtools/parentref.py CHANGED
@@ -1,11 +1,12 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from copy import deepcopy
3
- from dataclasses import dataclass
3
+ from dataclasses import dataclass, field
4
4
  from typing import TYPE_CHECKING, Any
5
5
  from xml.etree import ElementTree
6
6
 
7
7
  from .exceptions import odxrequire
8
- from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
8
+ from .odxdoccontext import OdxDocContext
9
+ from .odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
9
10
  from .snrefcontext import SnRefContext
10
11
  from .utils import dataclass_fields_asdict
11
12
 
@@ -13,23 +14,24 @@ if TYPE_CHECKING:
13
14
  from .diaglayers.diaglayer import DiagLayer
14
15
 
15
16
 
16
- @dataclass
17
+ @dataclass(kw_only=True)
17
18
  class ParentRef:
18
19
  layer_ref: OdxLinkRef
19
- not_inherited_diag_comms: list[str] # short_name references
20
- not_inherited_variables: list[str] # short_name references
21
- not_inherited_dops: list[str] # short_name references
22
- not_inherited_tables: list[str] # short_name references
23
- not_inherited_global_neg_responses: list[str] # short_name references
20
+ not_inherited_diag_comms: list[str] = field(default_factory=list) # short_name references
21
+ not_inherited_variables: list[str] = field(default_factory=list) # short_name references
22
+ not_inherited_dops: list[str] = field(default_factory=list) # short_name references
23
+ not_inherited_tables: list[str] = field(default_factory=list) # short_name references
24
+ not_inherited_global_neg_responses: list[str] = field(
25
+ default_factory=list) # short_name references
24
26
 
25
27
  @property
26
28
  def layer(self) -> "DiagLayer":
27
29
  return self._layer
28
30
 
29
31
  @staticmethod
30
- def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "ParentRef":
32
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "ParentRef":
31
33
 
32
- layer_ref = odxrequire(OdxLinkRef.from_et(et_element, doc_frags))
34
+ layer_ref = odxrequire(OdxLinkRef.from_et(et_element, context))
33
35
 
34
36
  not_inherited_diag_comms = [
35
37
  odxrequire(el.get("SHORT-NAME"))
@@ -4,12 +4,13 @@ from typing import Any
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .element import IdentifiableElement
7
- from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId
7
+ from .odxdoccontext import OdxDocContext
8
+ from .odxlink import OdxLinkDatabase, OdxLinkId
8
9
  from .snrefcontext import SnRefContext
9
10
  from .utils import dataclass_fields_asdict
10
11
 
11
12
 
12
- @dataclass
13
+ @dataclass(kw_only=True)
13
14
  class PhysicalDimension(IdentifiableElement):
14
15
  """A physical dimension is a formal definition of a unit.
15
16
 
@@ -41,18 +42,17 @@ class PhysicalDimension(IdentifiableElement):
41
42
  )
42
43
  ```
43
44
  """
44
- length_exp: int | None
45
- mass_exp: int | None
46
- time_exp: int | None
47
- current_exp: int | None
48
- temperature_exp: int | None
49
- molar_amount_exp: int | None
50
- luminous_intensity_exp: int | None
45
+ length_exp: int | None = None
46
+ mass_exp: int | None = None
47
+ time_exp: int | None = None
48
+ current_exp: int | None = None
49
+ temperature_exp: int | None = None
50
+ molar_amount_exp: int | None = None
51
+ luminous_intensity_exp: int | None = None
51
52
 
52
53
  @staticmethod
53
- def from_et(et_element: ElementTree.Element,
54
- doc_frags: list[OdxDocFragment]) -> "PhysicalDimension":
55
- kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
54
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "PhysicalDimension":
55
+ kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, context))
56
56
 
57
57
  def read_optional_int(element: ElementTree.Element, name: str) -> int | None:
58
58
  if (val_str := element.findtext(name)) is not None:
odxtools/physicaltype.py CHANGED
@@ -3,12 +3,12 @@ from dataclasses import dataclass
3
3
  from xml.etree import ElementTree
4
4
 
5
5
  from .exceptions import odxraise
6
- from .odxlink import OdxDocFragment
6
+ from .odxdoccontext import OdxDocContext
7
7
  from .odxtypes import DataType
8
8
  from .radix import Radix
9
9
 
10
10
 
11
- @dataclass
11
+ @dataclass(kw_only=True)
12
12
  class PhysicalType:
13
13
  """The physical type describes the base data type of a parameter.
14
14
 
@@ -31,20 +31,20 @@ class PhysicalType:
31
31
  PhysicalType(DataType.A_FLOAT64, precision=2)
32
32
  """
33
33
 
34
- precision: int | None
34
+ precision: int | None = None
35
35
  """Number of digits after the decimal point to display to the user
36
36
  The precision is only applicable if the base data type is A_FLOAT32 or A_FLOAT64.
37
37
  """
38
38
 
39
39
  base_data_type: DataType
40
40
 
41
- display_radix: Radix | None
41
+ display_radix: Radix | None = None
42
42
  """The display radix defines how integers are displayed to the user.
43
43
  The display radix is only applicable if the base data type is A_UINT32.
44
44
  """
45
45
 
46
46
  @staticmethod
47
- def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "PhysicalType":
47
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "PhysicalType":
48
48
  precision_str = et_element.findtext("PRECISION")
49
49
  precision = int(precision_str) if precision_str is not None else None
50
50
 
@@ -3,31 +3,31 @@ from dataclasses import dataclass
3
3
  from xml.etree import ElementTree
4
4
 
5
5
  from .exceptions import odxrequire
6
- from .odxlink import OdxDocFragment
6
+ from .odxdoccontext import OdxDocContext
7
7
  from .utils import read_hex_binary
8
8
 
9
9
 
10
10
  # note that the spec has a typo here: it calls the corresponding
11
11
  # XML tag POS-RESPONSE-SUPPRESSABLE...
12
- @dataclass
12
+ @dataclass(kw_only=True)
13
13
  class PosResponseSuppressible:
14
14
  bit_mask: int
15
15
 
16
- coded_const_snref: str | None
17
- coded_const_snpathref: str | None
16
+ coded_const_snref: str | None = None
17
+ coded_const_snpathref: str | None = None
18
18
 
19
- value_snref: str | None
20
- value_snpathref: str | None
19
+ value_snref: str | None = None
20
+ value_snpathref: str | None = None
21
21
 
22
- phys_const_snref: str | None
23
- phys_const_snpathref: str | None
22
+ phys_const_snref: str | None = None
23
+ phys_const_snpathref: str | None = None
24
24
 
25
- table_key_snref: str | None
26
- table_key_snpathref: str | None
25
+ table_key_snref: str | None = None
26
+ table_key_snpathref: str | None = None
27
27
 
28
28
  @staticmethod
29
29
  def from_et(et_element: ElementTree.Element,
30
- doc_frags: list[OdxDocFragment]) -> "PosResponseSuppressible":
30
+ context: OdxDocContext) -> "PosResponseSuppressible":
31
31
 
32
32
  bit_mask = odxrequire(read_hex_binary(et_element.find("BIT-MASK")))
33
33
 
@@ -4,7 +4,8 @@ from typing import TYPE_CHECKING, Any
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .exceptions import odxassert, odxrequire
7
- from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
7
+ from .odxdoccontext import OdxDocContext
8
+ from .odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
8
9
  from .odxtypes import ParameterValueDict
9
10
  from .parameters.parameter import Parameter
10
11
  from .snrefcontext import SnRefContext
@@ -16,15 +17,15 @@ if TYPE_CHECKING:
16
17
  from .statemachine import StateMachine
17
18
 
18
19
 
19
- @dataclass
20
+ @dataclass(kw_only=True)
20
21
  class PreConditionStateRef(OdxLinkRef):
21
22
  """
22
23
  This class represents the PRE-CONDITION-STATE-REF XML tag.
23
24
  """
24
- value: str | None
25
+ value: str | None = None
25
26
 
26
- in_param_if_snref: str | None
27
- in_param_if_snpathref: str | None
27
+ in_param_if_snref: str | None = None
28
+ in_param_if_snpathref: str | None = None
28
29
 
29
30
  @property
30
31
  def state(self) -> "State":
@@ -32,9 +33,8 @@ class PreConditionStateRef(OdxLinkRef):
32
33
 
33
34
  @staticmethod
34
35
  def from_et( # type: ignore[override]
35
- et_element: ElementTree.Element,
36
- doc_frags: list[OdxDocFragment]) -> "PreConditionStateRef":
37
- kwargs = dataclass_fields_asdict(OdxLinkRef.from_et(et_element, doc_frags))
36
+ et_element: ElementTree.Element, context: OdxDocContext) -> "PreConditionStateRef":
37
+ kwargs = dataclass_fields_asdict(OdxLinkRef.from_et(et_element, context))
38
38
 
39
39
  value = et_element.findtext("VALUE")
40
40
 
odxtools/progcode.py CHANGED
@@ -1,24 +1,25 @@
1
1
  # SPDX-License-Identifier: MIT
2
- from dataclasses import dataclass
2
+ from dataclasses import dataclass, field
3
3
  from typing import Any, cast
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .exceptions import odxraise, odxrequire
7
7
  from .library import Library
8
8
  from .nameditemlist import NamedItemList
9
- from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
9
+ from .odxdoccontext import OdxDocContext
10
+ from .odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
10
11
  from .snrefcontext import SnRefContext
11
12
 
12
13
 
13
- @dataclass
14
+ @dataclass(kw_only=True)
14
15
  class ProgCode:
15
16
  """A reference to code that is executed by a single ECU job"""
16
17
  code_file: str
17
- encryption: str | None
18
+ encryption: str | None = None
18
19
  syntax: str
19
20
  revision: str
20
- entrypoint: str | None
21
- library_refs: list[OdxLinkRef]
21
+ entrypoint: str | None = None
22
+ library_refs: list[OdxLinkRef] = field(default_factory=list)
22
23
 
23
24
  @property
24
25
  def code(self) -> bytes:
@@ -29,7 +30,7 @@ class ProgCode:
29
30
  return self._libraries
30
31
 
31
32
  @staticmethod
32
- def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "ProgCode":
33
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "ProgCode":
33
34
  code_file = odxrequire(et_element.findtext("CODE-FILE"))
34
35
  encryption = et_element.findtext("ENCRYPTION")
35
36
  syntax = odxrequire(et_element.findtext("SYNTAX"))
@@ -37,7 +38,7 @@ class ProgCode:
37
38
  entrypoint = et_element.findtext("ENTRYPOINT")
38
39
 
39
40
  library_refs = [
40
- odxrequire(OdxLinkRef.from_et(el, doc_frags))
41
+ odxrequire(OdxLinkRef.from_et(el, context))
41
42
  for el in et_element.iterfind("LIBRARY-REFS/LIBRARY-REF")
42
43
  ]
43
44
 
odxtools/protstack.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # SPDX-License-Identifier: MIT
2
- from dataclasses import dataclass
2
+ from dataclasses import dataclass, field
3
3
  from typing import Any
4
4
  from xml.etree import ElementTree
5
5
 
@@ -7,30 +7,31 @@ from .comparamsubset import ComparamSubset
7
7
  from .element import IdentifiableElement
8
8
  from .exceptions import odxrequire
9
9
  from .nameditemlist import NamedItemList
10
- from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
10
+ from .odxdoccontext import OdxDocContext
11
+ from .odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
11
12
  from .snrefcontext import SnRefContext
12
13
  from .utils import dataclass_fields_asdict
13
14
 
14
15
 
15
- @dataclass
16
+ @dataclass(kw_only=True)
16
17
  class ProtStack(IdentifiableElement):
17
18
  # mandatory in ODX 2.2, but non existent in ODX 2.0
18
19
  pdu_protocol_type: str
19
20
  physical_link_type: str
20
- comparam_subset_refs: list[OdxLinkRef]
21
+ comparam_subset_refs: list[OdxLinkRef] = field(default_factory=list)
21
22
 
22
23
  @property
23
24
  def comparam_subsets(self) -> NamedItemList[ComparamSubset]:
24
25
  return self._comparam_subsets
25
26
 
26
27
  @staticmethod
27
- def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "ProtStack":
28
- kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
28
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "ProtStack":
29
+ kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, context))
29
30
 
30
31
  pdu_protocol_type = odxrequire(et_element.findtext("PDU-PROTOCOL-TYPE"))
31
32
  physical_link_type = odxrequire(et_element.findtext("PHYSICAL-LINK-TYPE"))
32
33
  comparam_subset_refs = [
33
- OdxLinkRef.from_et(csr_element, doc_frags)
34
+ OdxLinkRef.from_et(csr_element, context)
34
35
  for csr_element in et_element.iterfind("COMPARAM-SUBSET-REFS/"
35
36
  "COMPARAM-SUBSET-REF")
36
37
  ]
@@ -3,19 +3,19 @@ from dataclasses import dataclass
3
3
  from xml.etree import ElementTree
4
4
 
5
5
  from .exceptions import odxrequire
6
- from .odxlink import OdxDocFragment, OdxLinkRef
6
+ from .odxdoccontext import OdxDocContext
7
+ from .odxlink import OdxLinkRef
7
8
  from .utils import dataclass_fields_asdict
8
9
 
9
10
 
10
- @dataclass
11
+ @dataclass(kw_only=True)
11
12
  class RelatedDiagCommRef(OdxLinkRef):
12
13
  relation_type: str
13
14
 
14
15
  @staticmethod
15
16
  def from_et( # type: ignore[override]
16
- et_element: ElementTree.Element,
17
- doc_frags: list[OdxDocFragment]) -> "RelatedDiagCommRef":
18
- kwargs = dataclass_fields_asdict(odxrequire(OdxLinkRef.from_et(et_element, doc_frags)))
17
+ et_element: ElementTree.Element, context: OdxDocContext) -> "RelatedDiagCommRef":
18
+ kwargs = dataclass_fields_asdict(odxrequire(OdxLinkRef.from_et(et_element, context)))
19
19
 
20
20
  relation_type = odxrequire(et_element.findtext("RELATION-TYPE"))
21
21
 
odxtools/relateddoc.py CHANGED
@@ -4,22 +4,23 @@ from typing import Any
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .description import Description
7
- from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId
7
+ from .odxdoccontext import OdxDocContext
8
+ from .odxlink import OdxLinkDatabase, OdxLinkId
8
9
  from .snrefcontext import SnRefContext
9
10
  from .xdoc import XDoc
10
11
 
11
12
 
12
- @dataclass
13
+ @dataclass(kw_only=True)
13
14
  class RelatedDoc:
14
- xdoc: XDoc | None
15
- description: Description | None
15
+ xdoc: XDoc | None = None
16
+ description: Description | None = None
16
17
 
17
18
  @staticmethod
18
- def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "RelatedDoc":
19
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "RelatedDoc":
19
20
  xdoc: XDoc | None = None
20
21
  if (xdoc_elem := et_element.find("XDOC")) is not None:
21
- xdoc = XDoc.from_et(xdoc_elem, doc_frags)
22
- description = Description.from_et(et_element.find("DESC"), doc_frags)
22
+ xdoc = XDoc.from_et(xdoc_elem, context)
23
+ description = Description.from_et(et_element.find("DESC"), context)
23
24
 
24
25
  return RelatedDoc(
25
26
  xdoc=xdoc,
odxtools/request.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # SPDX-License-Identifier: MIT
2
- from dataclasses import dataclass
2
+ from dataclasses import dataclass, field
3
3
  from typing import Any, cast
4
4
  from xml.etree import ElementTree
5
5
 
@@ -14,7 +14,8 @@ from .element import IdentifiableElement
14
14
  from .encodestate import EncodeState
15
15
  from .exceptions import odxraise
16
16
  from .nameditemlist import NamedItemList
17
- from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId
17
+ from .odxdoccontext import OdxDocContext
18
+ from .odxlink import OdxLinkDatabase, OdxLinkId
18
19
  from .odxtypes import ParameterValue, ParameterValueDict
19
20
  from .parameters.createanyparameter import create_any_parameter_from_et
20
21
  from .parameters.parameter import Parameter
@@ -23,15 +24,15 @@ from .specialdatagroup import SpecialDataGroup
23
24
  from .utils import dataclass_fields_asdict
24
25
 
25
26
 
26
- @dataclass
27
+ @dataclass(kw_only=True)
27
28
  class Request(IdentifiableElement):
28
29
  """Represents all information related to an UDS request
29
30
 
30
31
  This class implements the `CompositeCodec` interface.
31
32
  """
32
- admin_data: AdminData | None
33
- parameters: NamedItemList[Parameter]
34
- sdgs: list[SpecialDataGroup]
33
+ admin_data: AdminData | None = None
34
+ parameters: NamedItemList[Parameter] = field(default_factory=NamedItemList)
35
+ sdgs: list[SpecialDataGroup] = field(default_factory=list)
35
36
 
36
37
  @property
37
38
  def required_parameters(self) -> list[Parameter]:
@@ -42,17 +43,15 @@ class Request(IdentifiableElement):
42
43
  return composite_codec_get_free_parameters(self)
43
44
 
44
45
  @staticmethod
45
- def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "Request":
46
- kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
46
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "Request":
47
+ kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, context))
47
48
 
48
- admin_data = AdminData.from_et(et_element.find("ADMIN-DATA"), doc_frags)
49
+ admin_data = AdminData.from_et(et_element.find("ADMIN-DATA"), context)
49
50
  parameters = NamedItemList([
50
- create_any_parameter_from_et(et_parameter, doc_frags)
51
+ create_any_parameter_from_et(et_parameter, context)
51
52
  for et_parameter in et_element.iterfind("PARAMS/PARAM")
52
53
  ])
53
- sdgs = [
54
- SpecialDataGroup.from_et(sdge, doc_frags) for sdge in et_element.iterfind("SDGS/SDG")
55
- ]
54
+ sdgs = [SpecialDataGroup.from_et(sdge, context) for sdge in et_element.iterfind("SDGS/SDG")]
56
55
 
57
56
  return Request(admin_data=admin_data, parameters=parameters, sdgs=sdgs, **kwargs)
58
57