odxtools 9.7.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 (193) hide show
  1. odxtools/additionalaudience.py +7 -7
  2. odxtools/admindata.py +14 -13
  3. odxtools/audience.py +17 -17
  4. odxtools/basecomparam.py +9 -8
  5. odxtools/basevariantpattern.py +9 -10
  6. odxtools/basicstructure.py +15 -15
  7. odxtools/cli/_print_utils.py +34 -22
  8. odxtools/cli/browse.py +8 -8
  9. odxtools/cli/compare.py +24 -24
  10. odxtools/cli/decode.py +3 -4
  11. odxtools/cli/find.py +4 -5
  12. odxtools/cli/list.py +6 -6
  13. odxtools/cli/main.py +2 -2
  14. odxtools/cli/snoop.py +3 -3
  15. odxtools/codec.py +3 -3
  16. odxtools/commrelation.py +18 -17
  17. odxtools/companydata.py +13 -13
  18. odxtools/companydocinfo.py +15 -17
  19. odxtools/companyrevisioninfo.py +9 -9
  20. odxtools/companyspecificinfo.py +11 -13
  21. odxtools/comparam.py +8 -7
  22. odxtools/comparaminstance.py +14 -14
  23. odxtools/comparamspec.py +10 -11
  24. odxtools/comparamsubset.py +17 -25
  25. odxtools/complexcomparam.py +14 -14
  26. odxtools/complexdop.py +1 -1
  27. odxtools/compositecodec.py +8 -8
  28. odxtools/compumethods/compucodecompumethod.py +7 -7
  29. odxtools/compumethods/compuconst.py +5 -6
  30. odxtools/compumethods/compudefaultvalue.py +2 -3
  31. odxtools/compumethods/compuinternaltophys.py +13 -12
  32. odxtools/compumethods/compumethod.py +10 -9
  33. odxtools/compumethods/compuphystointernal.py +13 -12
  34. odxtools/compumethods/compurationalcoeffs.py +7 -7
  35. odxtools/compumethods/compuscale.py +15 -16
  36. odxtools/compumethods/createanycompumethod.py +12 -13
  37. odxtools/compumethods/identicalcompumethod.py +4 -5
  38. odxtools/compumethods/limit.py +14 -14
  39. odxtools/compumethods/linearcompumethod.py +5 -5
  40. odxtools/compumethods/linearsegment.py +10 -11
  41. odxtools/compumethods/ratfunccompumethod.py +6 -6
  42. odxtools/compumethods/ratfuncsegment.py +7 -8
  43. odxtools/compumethods/scalelinearcompumethod.py +9 -9
  44. odxtools/compumethods/scaleratfunccompumethod.py +7 -7
  45. odxtools/compumethods/tabintpcompumethod.py +10 -13
  46. odxtools/compumethods/texttablecompumethod.py +6 -6
  47. odxtools/createanycomparam.py +5 -7
  48. odxtools/createanydiagcodedtype.py +7 -8
  49. odxtools/database.py +34 -31
  50. odxtools/dataobjectproperty.py +19 -20
  51. odxtools/decodestate.py +5 -5
  52. odxtools/description.py +9 -9
  53. odxtools/determinenumberofitems.py +8 -7
  54. odxtools/diagcodedtype.py +10 -10
  55. odxtools/diagcomm.py +29 -30
  56. odxtools/diagdatadictionaryspec.py +36 -36
  57. odxtools/diaglayercontainer.py +35 -34
  58. odxtools/diaglayers/basevariant.py +14 -12
  59. odxtools/diaglayers/basevariantraw.py +22 -23
  60. odxtools/diaglayers/diaglayer.py +24 -22
  61. odxtools/diaglayers/diaglayerraw.py +43 -52
  62. odxtools/diaglayers/diaglayertype.py +1 -2
  63. odxtools/diaglayers/ecushareddata.py +9 -9
  64. odxtools/diaglayers/ecushareddataraw.py +15 -16
  65. odxtools/diaglayers/ecuvariant.py +15 -13
  66. odxtools/diaglayers/ecuvariantraw.py +21 -22
  67. odxtools/diaglayers/functionalgroup.py +12 -11
  68. odxtools/diaglayers/functionalgroupraw.py +17 -18
  69. odxtools/diaglayers/hierarchyelement.py +48 -54
  70. odxtools/diaglayers/hierarchyelementraw.py +10 -11
  71. odxtools/diaglayers/protocol.py +7 -7
  72. odxtools/diaglayers/protocolraw.py +13 -14
  73. odxtools/diagnostictroublecode.py +15 -17
  74. odxtools/diagservice.py +28 -27
  75. odxtools/diagvariable.py +24 -25
  76. odxtools/docrevision.py +18 -17
  77. odxtools/dopbase.py +13 -14
  78. odxtools/dtcconnector.py +8 -7
  79. odxtools/dtcdop.py +24 -20
  80. odxtools/dynamicendmarkerfield.py +10 -9
  81. odxtools/dynamiclengthfield.py +10 -9
  82. odxtools/dyndefinedspec.py +10 -10
  83. odxtools/dynenddopref.py +9 -9
  84. odxtools/dyniddefmodeinfo.py +21 -21
  85. odxtools/ecuvariantpattern.py +8 -10
  86. odxtools/element.py +12 -13
  87. odxtools/encodestate.py +11 -11
  88. odxtools/encoding.py +2 -3
  89. odxtools/endofpdufield.py +9 -10
  90. odxtools/envdataconnector.py +8 -8
  91. odxtools/environmentdata.py +7 -9
  92. odxtools/environmentdatadescription.py +18 -17
  93. odxtools/exceptions.py +5 -5
  94. odxtools/externalaccessmethod.py +4 -6
  95. odxtools/externaldoc.py +6 -6
  96. odxtools/field.py +15 -15
  97. odxtools/functionalclass.py +9 -9
  98. odxtools/inputparam.py +11 -10
  99. odxtools/internalconstr.py +10 -11
  100. odxtools/isotp_state_machine.py +12 -11
  101. odxtools/leadinglengthinfotype.py +4 -6
  102. odxtools/library.py +9 -8
  103. odxtools/linkeddtcdop.py +9 -8
  104. odxtools/loadfile.py +5 -6
  105. odxtools/matchingbasevariantparameter.py +5 -6
  106. odxtools/matchingparameter.py +10 -10
  107. odxtools/message.py +1 -1
  108. odxtools/minmaxlengthtype.py +6 -7
  109. odxtools/modification.py +7 -6
  110. odxtools/multiplexer.py +54 -18
  111. odxtools/multiplexercase.py +13 -13
  112. odxtools/multiplexerdefaultcase.py +11 -10
  113. odxtools/multiplexerswitchkey.py +8 -8
  114. odxtools/nameditemlist.py +13 -13
  115. odxtools/negoutputparam.py +8 -8
  116. odxtools/obd.py +1 -2
  117. odxtools/odxcategory.py +14 -26
  118. odxtools/odxdoccontext.py +16 -0
  119. odxtools/odxlink.py +23 -25
  120. odxtools/odxtypes.py +18 -15
  121. odxtools/outputparam.py +9 -8
  122. odxtools/parameterinfo.py +1 -1
  123. odxtools/parameters/codedconstparameter.py +10 -10
  124. odxtools/parameters/createanyparameter.py +15 -16
  125. odxtools/parameters/dynamicparameter.py +5 -7
  126. odxtools/parameters/lengthkeyparameter.py +10 -10
  127. odxtools/parameters/matchingrequestparameter.py +6 -7
  128. odxtools/parameters/nrcconstparameter.py +13 -13
  129. odxtools/parameters/parameter.py +17 -18
  130. odxtools/parameters/parameterwithdop.py +13 -13
  131. odxtools/parameters/physicalconstantparameter.py +8 -7
  132. odxtools/parameters/reservedparameter.py +6 -8
  133. odxtools/parameters/systemparameter.py +5 -7
  134. odxtools/parameters/tableentryparameter.py +8 -8
  135. odxtools/parameters/tablekeyparameter.py +17 -17
  136. odxtools/parameters/tablestructparameter.py +11 -11
  137. odxtools/parameters/valueparameter.py +11 -11
  138. odxtools/paramlengthinfotype.py +10 -9
  139. odxtools/parentref.py +15 -13
  140. odxtools/physicaldimension.py +15 -15
  141. odxtools/physicaltype.py +5 -6
  142. odxtools/posresponsesuppressible.py +11 -12
  143. odxtools/preconditionstateref.py +11 -11
  144. odxtools/progcode.py +11 -10
  145. odxtools/protstack.py +10 -9
  146. odxtools/relateddiagcommref.py +5 -6
  147. odxtools/relateddoc.py +11 -10
  148. odxtools/request.py +18 -19
  149. odxtools/response.py +19 -20
  150. odxtools/scaleconstr.py +8 -9
  151. odxtools/servicebinner.py +5 -5
  152. odxtools/singleecujob.py +16 -15
  153. odxtools/snrefcontext.py +3 -3
  154. odxtools/specialdata.py +8 -7
  155. odxtools/specialdatagroup.py +17 -17
  156. odxtools/specialdatagroupcaption.py +7 -6
  157. odxtools/standardlengthtype.py +14 -22
  158. odxtools/state.py +7 -6
  159. odxtools/statechart.py +12 -11
  160. odxtools/statemachine.py +4 -3
  161. odxtools/statetransition.py +9 -9
  162. odxtools/statetransitionref.py +19 -19
  163. odxtools/staticfield.py +9 -7
  164. odxtools/structure.py +5 -6
  165. odxtools/subcomponent.py +20 -18
  166. odxtools/subcomponentparamconnector.py +10 -9
  167. odxtools/subcomponentpattern.py +9 -9
  168. odxtools/swvariable.py +6 -7
  169. odxtools/table.py +25 -26
  170. odxtools/tablediagcommconnector.py +9 -8
  171. odxtools/tablerow.py +64 -43
  172. odxtools/tablerowconnector.py +8 -8
  173. odxtools/teammember.py +16 -15
  174. odxtools/templates/macros/printParentRef.xml.jinja2 +3 -1
  175. odxtools/text.py +4 -5
  176. odxtools/uds.py +2 -3
  177. odxtools/unit.py +14 -13
  178. odxtools/unitgroup.py +11 -10
  179. odxtools/unitspec.py +18 -19
  180. odxtools/utils.py +3 -3
  181. odxtools/variablegroup.py +5 -6
  182. odxtools/variantmatcher.py +10 -10
  183. odxtools/variantpattern.py +5 -6
  184. odxtools/version.py +2 -2
  185. odxtools/writepdxfile.py +5 -24
  186. odxtools/xdoc.py +13 -12
  187. {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/METADATA +4 -5
  188. odxtools-10.1.0.dist-info/RECORD +265 -0
  189. {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/WHEEL +1 -1
  190. odxtools-9.7.0.dist-info/RECORD +0 -264
  191. {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/entry_points.txt +0 -0
  192. {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/licenses/LICENSE +0 -0
  193. {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import Any, Dict, List, Optional
3
+ from typing import Any
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from typing_extensions import final, override
@@ -8,14 +8,15 @@ from typing_extensions import final, override
8
8
  from ..decodestate import DecodeState
9
9
  from ..encodestate import EncodeState
10
10
  from ..exceptions import EncodeError, odxraise, odxrequire
11
- from ..odxlink import OdxDocFragment, OdxLinkId
11
+ from ..odxdoccontext import OdxDocContext
12
+ from ..odxlink import OdxLinkId
12
13
  from ..odxtypes import ParameterValue
13
14
  from ..utils import dataclass_fields_asdict
14
15
  from .parameter import ParameterType
15
16
  from .parameterwithdop import ParameterWithDOP
16
17
 
17
18
 
18
- @dataclass
19
+ @dataclass(kw_only=True)
19
20
  class LengthKeyParameter(ParameterWithDOP):
20
21
  """Length Keys specify the bit (!) length of another parameter.
21
22
 
@@ -48,17 +49,16 @@ class LengthKeyParameter(ParameterWithDOP):
48
49
 
49
50
  @staticmethod
50
51
  @override
51
- def from_et(et_element: ElementTree.Element,
52
- doc_frags: List[OdxDocFragment]) -> "LengthKeyParameter":
52
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "LengthKeyParameter":
53
53
 
54
- kwargs = dataclass_fields_asdict(ParameterWithDOP.from_et(et_element, doc_frags))
54
+ kwargs = dataclass_fields_asdict(ParameterWithDOP.from_et(et_element, context))
55
55
 
56
- odx_id = odxrequire(OdxLinkId.from_et(et_element, doc_frags))
56
+ odx_id = odxrequire(OdxLinkId.from_et(et_element, context))
57
57
 
58
58
  return LengthKeyParameter(odx_id=odx_id, **kwargs)
59
59
 
60
60
  @override
61
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
61
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
62
62
  result = super()._build_odxlinks()
63
63
 
64
64
  result[self.odx_id] = self
@@ -67,7 +67,7 @@ class LengthKeyParameter(ParameterWithDOP):
67
67
 
68
68
  @override
69
69
  @final
70
- def _encode_positioned_into_pdu(self, physical_value: Optional[ParameterValue],
70
+ def _encode_positioned_into_pdu(self, physical_value: ParameterValue | None,
71
71
  encode_state: EncodeState) -> None:
72
72
  # if you get this exception, you ought to use
73
73
  # `.encode_placeholder_into_pdu()` followed by (after the
@@ -75,7 +75,7 @@ class LengthKeyParameter(ParameterWithDOP):
75
75
  # `.encode_value_into_pdu()`.
76
76
  raise RuntimeError("_encode_positioned_into_pdu() cannot be called for length keys.")
77
77
 
78
- def encode_placeholder_into_pdu(self, physical_value: Optional[ParameterValue],
78
+ def encode_placeholder_into_pdu(self, physical_value: ParameterValue | None,
79
79
  encode_state: EncodeState) -> None:
80
80
 
81
81
  if physical_value is not None:
@@ -1,6 +1,5 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import List, Optional
4
3
  from xml.etree import ElementTree
5
4
 
6
5
  from typing_extensions import override
@@ -8,13 +7,13 @@ from typing_extensions import override
8
7
  from ..decodestate import DecodeState
9
8
  from ..encodestate import EncodeState
10
9
  from ..exceptions import EncodeError, odxraise, odxrequire
11
- from ..odxlink import OdxDocFragment
10
+ from ..odxdoccontext import OdxDocContext
12
11
  from ..odxtypes import DataType, ParameterValue
13
12
  from ..utils import dataclass_fields_asdict
14
13
  from .parameter import Parameter, ParameterType
15
14
 
16
15
 
17
- @dataclass
16
+ @dataclass(kw_only=True)
18
17
  class MatchingRequestParameter(Parameter):
19
18
  request_byte_position: int
20
19
  byte_length: int
@@ -37,9 +36,9 @@ class MatchingRequestParameter(Parameter):
37
36
  @staticmethod
38
37
  @override
39
38
  def from_et(et_element: ElementTree.Element,
40
- doc_frags: List[OdxDocFragment]) -> "MatchingRequestParameter":
39
+ context: OdxDocContext) -> "MatchingRequestParameter":
41
40
 
42
- kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, doc_frags))
41
+ kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, context))
43
42
 
44
43
  request_byte_position = int(odxrequire(et_element.findtext("REQUEST-BYTE-POS")))
45
44
  byte_length = int(odxrequire(et_element.findtext("BYTE-LENGTH")))
@@ -48,11 +47,11 @@ class MatchingRequestParameter(Parameter):
48
47
  request_byte_position=request_byte_position, byte_length=byte_length, **kwargs)
49
48
 
50
49
  @override
51
- def get_static_bit_length(self) -> Optional[int]:
50
+ def get_static_bit_length(self) -> int | None:
52
51
  return 8 * self.byte_length
53
52
 
54
53
  @override
55
- def _encode_positioned_into_pdu(self, physical_value: Optional[ParameterValue],
54
+ def _encode_positioned_into_pdu(self, physical_value: ParameterValue | None,
56
55
  encode_state: EncodeState) -> None:
57
56
  if encode_state.triggering_request is None:
58
57
  odxraise(
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
- from dataclasses import dataclass
3
- from typing import Any, Dict, List, Optional
2
+ from dataclasses import dataclass, field
3
+ from typing import Any
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from typing_extensions import override
@@ -10,13 +10,14 @@ from ..decodestate import DecodeState
10
10
  from ..diagcodedtype import DiagCodedType
11
11
  from ..encodestate import EncodeState
12
12
  from ..exceptions import DecodeMismatch, EncodeError, odxraise, odxrequire
13
- from ..odxlink import OdxDocFragment, OdxLinkId
13
+ from ..odxdoccontext import OdxDocContext
14
+ from ..odxlink import OdxLinkId
14
15
  from ..odxtypes import AtomicOdxType, DataType, ParameterValue
15
16
  from ..utils import dataclass_fields_asdict
16
17
  from .parameter import Parameter, ParameterType
17
18
 
18
19
 
19
- @dataclass
20
+ @dataclass(kw_only=True)
20
21
  class NrcConstParameter(Parameter):
21
22
  """A parameter of type NRC-CONST defines a set of values to be
22
23
  matched for a negative response object to apply
@@ -34,7 +35,7 @@ class NrcConstParameter(Parameter):
34
35
 
35
36
  """
36
37
 
37
- coded_values_raw: List[str]
38
+ coded_values_raw: list[str] = field(default_factory=list)
38
39
  diag_coded_type: DiagCodedType
39
40
 
40
41
  @property
@@ -57,21 +58,20 @@ class NrcConstParameter(Parameter):
57
58
  return self.diag_coded_type.base_data_type
58
59
 
59
60
  @property
60
- def coded_values(self) -> List[AtomicOdxType]:
61
+ def coded_values(self) -> list[AtomicOdxType]:
61
62
  return self._coded_values
62
63
 
63
64
  @staticmethod
64
65
  @override
65
- def from_et(et_element: ElementTree.Element,
66
- doc_frags: List[OdxDocFragment]) -> "NrcConstParameter":
66
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "NrcConstParameter":
67
67
 
68
- kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, doc_frags))
68
+ kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, context))
69
69
 
70
70
  coded_values_raw = [
71
71
  odxrequire(x.text) for x in et_element.iterfind("CODED-VALUES/CODED-VALUE")
72
72
  ]
73
73
  dct_elem = odxrequire(et_element.find("DIAG-CODED-TYPE"))
74
- diag_coded_type = create_any_diag_coded_type_from_et(dct_elem, doc_frags)
74
+ diag_coded_type = create_any_diag_coded_type_from_et(dct_elem, context)
75
75
 
76
76
  return NrcConstParameter(
77
77
  coded_values_raw=coded_values_raw, diag_coded_type=diag_coded_type, **kwargs)
@@ -82,7 +82,7 @@ class NrcConstParameter(Parameter):
82
82
  ]
83
83
 
84
84
  @override
85
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
85
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
86
86
  result = super()._build_odxlinks()
87
87
 
88
88
  result.update(self.diag_coded_type._build_odxlinks())
@@ -90,11 +90,11 @@ class NrcConstParameter(Parameter):
90
90
  return result
91
91
 
92
92
  @override
93
- def get_static_bit_length(self) -> Optional[int]:
93
+ def get_static_bit_length(self) -> int | None:
94
94
  return self.diag_coded_type.get_static_bit_length()
95
95
 
96
96
  @override
97
- def _encode_positioned_into_pdu(self, physical_value: Optional[ParameterValue],
97
+ def _encode_positioned_into_pdu(self, physical_value: ParameterValue | None,
98
98
  encode_state: EncodeState) -> None:
99
99
  # NRC-CONST parameters are not encoding any value on its
100
100
  # own. instead, it is supposed to overlap with a value
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
- from dataclasses import dataclass
3
- from typing import Any, Dict, List, Literal, Optional
2
+ from dataclasses import dataclass, field
3
+ from typing import Any, Literal
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from typing_extensions import final, override
@@ -8,7 +8,8 @@ from typing_extensions import final, override
8
8
  from ..decodestate import DecodeState
9
9
  from ..element import NamedElement
10
10
  from ..encodestate import EncodeState
11
- from ..odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId
11
+ from ..odxdoccontext import OdxDocContext
12
+ from ..odxlink import OdxLinkDatabase, OdxLinkId
12
13
  from ..odxtypes import ParameterValue
13
14
  from ..snrefcontext import SnRefContext
14
15
  from ..specialdatagroup import SpecialDataGroup
@@ -30,7 +31,7 @@ ParameterType = Literal[
30
31
  ]
31
32
 
32
33
 
33
- @dataclass
34
+ @dataclass(kw_only=True)
34
35
  class Parameter(NamedElement):
35
36
  """This class corresponds to POSITIONABLE-PARAM in the ODX
36
37
  specification
@@ -42,11 +43,11 @@ class Parameter(NamedElement):
42
43
  non-positionable parameter types.
43
44
 
44
45
  """
45
- sdgs: List[SpecialDataGroup]
46
- semantic: Optional[str]
47
- oid: Optional[str]
48
- byte_position: Optional[int]
49
- bit_position: Optional[int]
46
+ sdgs: list[SpecialDataGroup] = field(default_factory=list)
47
+ semantic: str | None = None
48
+ oid: str | None = None
49
+ byte_position: int | None = None
50
+ bit_position: int | None = None
50
51
 
51
52
  @property
52
53
  def parameter_type(self) -> ParameterType:
@@ -78,13 +79,11 @@ class Parameter(NamedElement):
78
79
 
79
80
  @staticmethod
80
81
  @override
81
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "Parameter":
82
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "Parameter":
82
83
 
83
- kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, doc_frags))
84
+ kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, context))
84
85
 
85
- sdgs = [
86
- SpecialDataGroup.from_et(sdge, doc_frags) for sdge in et_element.iterfind("SDGS/SDG")
87
- ]
86
+ sdgs = [SpecialDataGroup.from_et(sdge, context) for sdge in et_element.iterfind("SDGS/SDG")]
88
87
  semantic = et_element.attrib.get("SEMANTIC")
89
88
  oid = et_element.attrib.get("OID")
90
89
  byte_position_str = et_element.findtext("BYTE-POSITION")
@@ -100,7 +99,7 @@ class Parameter(NamedElement):
100
99
  bit_position=bit_position,
101
100
  **kwargs)
102
101
 
103
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
102
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
104
103
  result = {}
105
104
 
106
105
  for sdg in self.sdgs:
@@ -116,11 +115,11 @@ class Parameter(NamedElement):
116
115
  for sdg in self.sdgs:
117
116
  sdg._resolve_snrefs(context)
118
117
 
119
- def get_static_bit_length(self) -> Optional[int]:
118
+ def get_static_bit_length(self) -> int | None:
120
119
  return None
121
120
 
122
121
  @final
123
- def encode_into_pdu(self, physical_value: Optional[ParameterValue],
122
+ def encode_into_pdu(self, physical_value: ParameterValue | None,
124
123
  encode_state: EncodeState) -> None:
125
124
  """Convert a physical value into its encoded form and place it
126
125
  into the PDU
@@ -140,7 +139,7 @@ class Parameter(NamedElement):
140
139
 
141
140
  encode_state.cursor_bit_position = 0
142
141
 
143
- def _encode_positioned_into_pdu(self, physical_value: Optional[ParameterValue],
142
+ def _encode_positioned_into_pdu(self, physical_value: ParameterValue | None,
144
143
  encode_state: EncodeState) -> None:
145
144
  """Method which actually encodes the parameter
146
145
 
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import Any, Dict, List, Optional, cast
3
+ from typing import Any, cast
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from typing_extensions import override
@@ -11,7 +11,8 @@ from ..dopbase import DopBase
11
11
  from ..dtcdop import DtcDop
12
12
  from ..encodestate import EncodeState
13
13
  from ..exceptions import odxassert, odxrequire
14
- from ..odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef, resolve_snref
14
+ from ..odxdoccontext import OdxDocContext
15
+ from ..odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef, resolve_snref
15
16
  from ..odxtypes import AtomicOdxType, ParameterValue
16
17
  from ..physicaltype import PhysicalType
17
18
  from ..snrefcontext import SnRefContext
@@ -19,10 +20,10 @@ from ..utils import dataclass_fields_asdict
19
20
  from .parameter import Parameter
20
21
 
21
22
 
22
- @dataclass
23
+ @dataclass(kw_only=True)
23
24
  class ParameterWithDOP(Parameter):
24
- dop_ref: Optional[OdxLinkRef]
25
- dop_snref: Optional[str]
25
+ dop_ref: OdxLinkRef | None = None
26
+ dop_snref: str | None = None
26
27
 
27
28
  @property
28
29
  def dop(self) -> DopBase:
@@ -32,12 +33,11 @@ class ParameterWithDOP(Parameter):
32
33
 
33
34
  @staticmethod
34
35
  @override
35
- def from_et(et_element: ElementTree.Element,
36
- doc_frags: List[OdxDocFragment]) -> "ParameterWithDOP":
36
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "ParameterWithDOP":
37
37
 
38
- kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, doc_frags))
38
+ kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, context))
39
39
 
40
- dop_ref = OdxLinkRef.from_et(et_element.find("DOP-REF"), doc_frags)
40
+ dop_ref = OdxLinkRef.from_et(et_element.find("DOP-REF"), context)
41
41
  dop_snref = None
42
42
  if (dop_snref_elem := et_element.find("DOP-SNREF")) is not None:
43
43
  dop_snref = odxrequire(dop_snref_elem.get("SHORT-NAME"))
@@ -50,7 +50,7 @@ class ParameterWithDOP(Parameter):
50
50
  self._dop: DopBase
51
51
 
52
52
  @override
53
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
53
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
54
54
  return super()._build_odxlinks()
55
55
 
56
56
  @override
@@ -70,21 +70,21 @@ class ParameterWithDOP(Parameter):
70
70
  self._dop = resolve_snref(self.dop_snref, ddds.all_data_object_properties, DopBase)
71
71
 
72
72
  @override
73
- def get_static_bit_length(self) -> Optional[int]:
73
+ def get_static_bit_length(self) -> int | None:
74
74
  if self._dop is not None:
75
75
  return self._dop.get_static_bit_length()
76
76
  else:
77
77
  return None
78
78
 
79
79
  @property
80
- def physical_type(self) -> Optional[PhysicalType]:
80
+ def physical_type(self) -> PhysicalType | None:
81
81
  if isinstance(self.dop, (DataObjectProperty, DtcDop)):
82
82
  return self.dop.physical_type
83
83
  else:
84
84
  return None
85
85
 
86
86
  @override
87
- def _encode_positioned_into_pdu(self, physical_value: Optional[ParameterValue],
87
+ def _encode_positioned_into_pdu(self, physical_value: ParameterValue | None,
88
88
  encode_state: EncodeState) -> None:
89
89
  self.dop.encode_into_pdu(cast(AtomicOdxType, physical_value), encode_state)
90
90
 
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import Any, Dict, List, Optional
3
+ from typing import Any
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from typing_extensions import override
@@ -9,7 +9,8 @@ from ..dataobjectproperty import DataObjectProperty
9
9
  from ..decodestate import DecodeState
10
10
  from ..encodestate import EncodeState
11
11
  from ..exceptions import DecodeError, EncodeError, odxraise, odxrequire
12
- from ..odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId
12
+ from ..odxdoccontext import OdxDocContext
13
+ from ..odxlink import OdxLinkDatabase, OdxLinkId
13
14
  from ..odxtypes import ParameterValue
14
15
  from ..snrefcontext import SnRefContext
15
16
  from ..utils import dataclass_fields_asdict
@@ -17,7 +18,7 @@ from .parameter import ParameterType
17
18
  from .parameterwithdop import ParameterWithDOP
18
19
 
19
20
 
20
- @dataclass
21
+ @dataclass(kw_only=True)
21
22
  class PhysicalConstantParameter(ParameterWithDOP):
22
23
  physical_constant_value_raw: str
23
24
 
@@ -43,9 +44,9 @@ class PhysicalConstantParameter(ParameterWithDOP):
43
44
  @staticmethod
44
45
  @override
45
46
  def from_et(et_element: ElementTree.Element,
46
- doc_frags: List[OdxDocFragment]) -> "PhysicalConstantParameter":
47
+ context: OdxDocContext) -> "PhysicalConstantParameter":
47
48
 
48
- kwargs = dataclass_fields_asdict(ParameterWithDOP.from_et(et_element, doc_frags))
49
+ kwargs = dataclass_fields_asdict(ParameterWithDOP.from_et(et_element, context))
49
50
 
50
51
  physical_constant_value_raw = odxrequire(et_element.findtext("PHYS-CONSTANT-VALUE"))
51
52
 
@@ -53,7 +54,7 @@ class PhysicalConstantParameter(ParameterWithDOP):
53
54
  physical_constant_value_raw=physical_constant_value_raw, **kwargs)
54
55
 
55
56
  @override
56
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
57
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
57
58
  return super()._build_odxlinks()
58
59
 
59
60
  @override
@@ -72,7 +73,7 @@ class PhysicalConstantParameter(ParameterWithDOP):
72
73
  self._physical_constant_value = base_data_type.from_string(self.physical_constant_value_raw)
73
74
 
74
75
  @override
75
- def _encode_positioned_into_pdu(self, physical_value: Optional[ParameterValue],
76
+ def _encode_positioned_into_pdu(self, physical_value: ParameterValue | None,
76
77
  encode_state: EncodeState) -> None:
77
78
  if physical_value is not None and physical_value != self.physical_constant_value:
78
79
  odxraise(
@@ -1,6 +1,5 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import List, Optional
4
3
  from xml.etree import ElementTree
5
4
 
6
5
  from typing_extensions import override
@@ -8,13 +7,13 @@ from typing_extensions import override
8
7
  from ..decodestate import DecodeState
9
8
  from ..encodestate import EncodeState
10
9
  from ..exceptions import odxrequire
11
- from ..odxlink import OdxDocFragment
10
+ from ..odxdoccontext import OdxDocContext
12
11
  from ..odxtypes import DataType, ParameterValue
13
12
  from ..utils import dataclass_fields_asdict
14
13
  from .parameter import Parameter, ParameterType
15
14
 
16
15
 
17
- @dataclass
16
+ @dataclass(kw_only=True)
18
17
  class ReservedParameter(Parameter):
19
18
  bit_length: int
20
19
 
@@ -35,20 +34,19 @@ class ReservedParameter(Parameter):
35
34
 
36
35
  @staticmethod
37
36
  @override
38
- def from_et(et_element: ElementTree.Element,
39
- doc_frags: List[OdxDocFragment]) -> "ReservedParameter":
40
- kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, doc_frags))
37
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "ReservedParameter":
38
+ kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, context))
41
39
 
42
40
  bit_length = int(odxrequire(et_element.findtext("BIT-LENGTH")))
43
41
 
44
42
  return ReservedParameter(bit_length=bit_length, **kwargs)
45
43
 
46
44
  @override
47
- def get_static_bit_length(self) -> Optional[int]:
45
+ def get_static_bit_length(self) -> int | None:
48
46
  return self.bit_length
49
47
 
50
48
  @override
51
- def _encode_positioned_into_pdu(self, physical_value: Optional[ParameterValue],
49
+ def _encode_positioned_into_pdu(self, physical_value: ParameterValue | None,
52
50
  encode_state: EncodeState) -> None:
53
51
  encode_state.cursor_byte_position += (encode_state.cursor_bit_position + self.bit_length +
54
52
  7) // 8
@@ -2,14 +2,13 @@
2
2
  import getpass
3
3
  from dataclasses import dataclass
4
4
  from datetime import datetime
5
- from typing import List, Optional
6
5
  from xml.etree import ElementTree
7
6
 
8
7
  from typing_extensions import override
9
8
 
10
9
  from ..encodestate import EncodeState
11
10
  from ..exceptions import odxraise, odxrequire
12
- from ..odxlink import OdxDocFragment
11
+ from ..odxdoccontext import OdxDocContext
13
12
  from ..odxtypes import ParameterValue
14
13
  from ..utils import dataclass_fields_asdict
15
14
  from .parameter import ParameterType
@@ -25,7 +24,7 @@ PREDEFINED_SYSPARAM_VALUES = [
25
24
  ]
26
25
 
27
26
 
28
- @dataclass
27
+ @dataclass(kw_only=True)
29
28
  class SystemParameter(ParameterWithDOP):
30
29
  sysparam: str
31
30
 
@@ -49,16 +48,15 @@ class SystemParameter(ParameterWithDOP):
49
48
 
50
49
  @staticmethod
51
50
  @override
52
- def from_et(et_element: ElementTree.Element,
53
- doc_frags: List[OdxDocFragment]) -> "SystemParameter":
54
- kwargs = dataclass_fields_asdict(ParameterWithDOP.from_et(et_element, doc_frags))
51
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "SystemParameter":
52
+ kwargs = dataclass_fields_asdict(ParameterWithDOP.from_et(et_element, context))
55
53
 
56
54
  sysparam = odxrequire(et_element.get("SYSPARAM"))
57
55
 
58
56
  return SystemParameter(sysparam=sysparam, **kwargs)
59
57
 
60
58
  @override
61
- def _encode_positioned_into_pdu(self, physical_value: Optional[ParameterValue],
59
+ def _encode_positioned_into_pdu(self, physical_value: ParameterValue | None,
62
60
  encode_state: EncodeState) -> None:
63
61
  if physical_value is None:
64
62
  # determine the value to be encoded automatically
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import TYPE_CHECKING, List, Optional, cast
3
+ from typing import TYPE_CHECKING, cast
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from typing_extensions import override
@@ -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 odxraise, odxrequire
11
- from ..odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkRef
11
+ from ..odxdoccontext import OdxDocContext
12
+ from ..odxlink import OdxLinkDatabase, OdxLinkRef
12
13
  from ..odxtypes import ParameterValue
13
14
  from ..utils import dataclass_fields_asdict
14
15
  from .parameter import Parameter, ParameterType
@@ -18,7 +19,7 @@ if TYPE_CHECKING:
18
19
  from ..tablerow import TableRow
19
20
 
20
21
 
21
- @dataclass
22
+ @dataclass(kw_only=True)
22
23
  class TableEntryParameter(Parameter):
23
24
  target: RowFragment
24
25
  table_row_ref: OdxLinkRef
@@ -44,9 +45,8 @@ class TableEntryParameter(Parameter):
44
45
 
45
46
  @staticmethod
46
47
  @override
47
- def from_et(et_element: ElementTree.Element,
48
- doc_frags: List[OdxDocFragment]) -> "TableEntryParameter":
49
- kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, doc_frags))
48
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "TableEntryParameter":
49
+ kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, context))
50
50
 
51
51
  target_str = odxrequire(et_element.findtext("TARGET"))
52
52
  try:
@@ -54,7 +54,7 @@ class TableEntryParameter(Parameter):
54
54
  except ValueError:
55
55
  odxraise(f"Encountered unknown target '{target_str}'")
56
56
  target = cast(RowFragment, None)
57
- table_row_ref = odxrequire(OdxLinkRef.from_et(et_element.find("TABLE-ROW-REF"), doc_frags))
57
+ table_row_ref = odxrequire(OdxLinkRef.from_et(et_element.find("TABLE-ROW-REF"), context))
58
58
 
59
59
  return TableEntryParameter(target=target, table_row_ref=table_row_ref, **kwargs)
60
60
 
@@ -68,7 +68,7 @@ class TableEntryParameter(Parameter):
68
68
  self._table_row = odxlinks.resolve(self.table_row_ref)
69
69
 
70
70
  @override
71
- def _encode_positioned_into_pdu(self, physical_value: Optional[ParameterValue],
71
+ def _encode_positioned_into_pdu(self, physical_value: ParameterValue | None,
72
72
  encode_state: EncodeState) -> None:
73
73
  raise NotImplementedError("Encoding a TableEntryParameter is not implemented yet.")
74
74
 
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import TYPE_CHECKING, Any, Dict, List, Optional
3
+ from typing import TYPE_CHECKING, Any, Optional
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from typing_extensions import final, override
@@ -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: Optional[OdxLinkRef]
30
- table_snref: Optional[str]
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: Optional[OdxLinkRef]
35
- table_row_snref: Optional[str]
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"))
@@ -62,7 +62,7 @@ class TableKeyParameter(Parameter):
62
62
 
63
63
  def __post_init__(self) -> None:
64
64
  self._table: Table
65
- self._table_row: Optional[TableRow] = None
65
+ self._table_row: TableRow | None = None
66
66
 
67
67
  @property
68
68
  @override
@@ -70,7 +70,7 @@ class TableKeyParameter(Parameter):
70
70
  return "TABLE-KEY"
71
71
 
72
72
  @override
73
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
73
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
74
74
  result = super()._build_odxlinks()
75
75
 
76
76
  result[self.odx_id] = self
@@ -143,7 +143,7 @@ class TableKeyParameter(Parameter):
143
143
 
144
144
  @override
145
145
  @final
146
- def _encode_positioned_into_pdu(self, physical_value: Optional[ParameterValue],
146
+ def _encode_positioned_into_pdu(self, physical_value: ParameterValue | None,
147
147
  encode_state: EncodeState) -> None:
148
148
  # if you get this exception, you ought to use
149
149
  # `.encode_placeholder_into_pdu()` followed by (after the
@@ -151,7 +151,7 @@ class TableKeyParameter(Parameter):
151
151
  # `.encode_value_into_pdu()`.
152
152
  raise RuntimeError("_encode_positioned_into_pdu() cannot be called for table keys.")
153
153
 
154
- def encode_placeholder_into_pdu(self, physical_value: Optional[ParameterValue],
154
+ def encode_placeholder_into_pdu(self, physical_value: ParameterValue | None,
155
155
  encode_state: EncodeState) -> None:
156
156
 
157
157
  if physical_value is not None: