odxtools 9.6.1__py3-none-any.whl → 10.0.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 (203) hide show
  1. odxtools/additionalaudience.py +3 -3
  2. odxtools/addressing.py +8 -0
  3. odxtools/admindata.py +8 -8
  4. odxtools/audience.py +10 -10
  5. odxtools/basecomparam.py +7 -20
  6. odxtools/basevariantpattern.py +4 -5
  7. odxtools/basicstructure.py +12 -11
  8. odxtools/cli/_print_utils.py +35 -23
  9. odxtools/cli/browse.py +9 -9
  10. odxtools/cli/compare.py +24 -24
  11. odxtools/cli/decode.py +3 -4
  12. odxtools/cli/find.py +4 -5
  13. odxtools/cli/list.py +7 -7
  14. odxtools/cli/main.py +2 -2
  15. odxtools/cli/snoop.py +3 -3
  16. odxtools/codec.py +3 -186
  17. odxtools/commrelation.py +12 -19
  18. odxtools/commrelationvaluetype.py +9 -0
  19. odxtools/companydata.py +5 -5
  20. odxtools/companydocinfo.py +8 -8
  21. odxtools/companyrevisioninfo.py +5 -5
  22. odxtools/companyspecificinfo.py +5 -5
  23. odxtools/comparam.py +3 -3
  24. odxtools/comparaminstance.py +10 -10
  25. odxtools/comparamspec.py +3 -3
  26. odxtools/comparamsubset.py +5 -5
  27. odxtools/complexcomparam.py +7 -7
  28. odxtools/compositecodec.py +191 -0
  29. odxtools/compumethods/compucategory.py +13 -0
  30. odxtools/compumethods/compucodecompumethod.py +6 -5
  31. odxtools/compumethods/compuconst.py +4 -5
  32. odxtools/compumethods/compudefaultvalue.py +1 -2
  33. odxtools/compumethods/compuinternaltophys.py +6 -6
  34. odxtools/compumethods/compumethod.py +6 -17
  35. odxtools/compumethods/compuphystointernal.py +6 -6
  36. odxtools/compumethods/compurationalcoeffs.py +4 -4
  37. odxtools/compumethods/compuscale.py +9 -10
  38. odxtools/compumethods/createanycompumethod.py +1 -2
  39. odxtools/compumethods/identicalcompumethod.py +1 -2
  40. odxtools/compumethods/intervaltype.py +8 -0
  41. odxtools/compumethods/limit.py +13 -19
  42. odxtools/compumethods/linearcompumethod.py +4 -3
  43. odxtools/compumethods/linearsegment.py +14 -15
  44. odxtools/compumethods/ratfunccompumethod.py +5 -4
  45. odxtools/compumethods/ratfuncsegment.py +7 -8
  46. odxtools/compumethods/scalelinearcompumethod.py +10 -9
  47. odxtools/compumethods/scaleratfunccompumethod.py +6 -5
  48. odxtools/compumethods/tabintpcompumethod.py +19 -20
  49. odxtools/compumethods/texttablecompumethod.py +5 -4
  50. odxtools/createanycomparam.py +2 -4
  51. odxtools/createanydiagcodedtype.py +1 -2
  52. odxtools/database.py +9 -8
  53. odxtools/dataobjectproperty.py +10 -10
  54. odxtools/decodestate.py +5 -5
  55. odxtools/description.py +6 -22
  56. odxtools/determinenumberofitems.py +4 -4
  57. odxtools/diagclasstype.py +11 -0
  58. odxtools/diagcodedtype.py +7 -7
  59. odxtools/diagcomm.py +19 -42
  60. odxtools/diagdatadictionaryspec.py +6 -6
  61. odxtools/diaglayercontainer.py +4 -4
  62. odxtools/diaglayers/basevariant.py +10 -9
  63. odxtools/diaglayers/basevariantraw.py +9 -9
  64. odxtools/diaglayers/diaglayer.py +20 -19
  65. odxtools/diaglayers/diaglayerraw.py +10 -10
  66. odxtools/diaglayers/diaglayertype.py +1 -2
  67. odxtools/diaglayers/ecushareddata.py +4 -4
  68. odxtools/diaglayers/ecushareddataraw.py +6 -6
  69. odxtools/diaglayers/ecuvariant.py +11 -10
  70. odxtools/diaglayers/ecuvariantraw.py +9 -9
  71. odxtools/diaglayers/functionalgroup.py +8 -7
  72. odxtools/diaglayers/functionalgroupraw.py +7 -7
  73. odxtools/diaglayers/hierarchyelement.py +43 -49
  74. odxtools/diaglayers/hierarchyelementraw.py +4 -4
  75. odxtools/diaglayers/protocol.py +4 -4
  76. odxtools/diaglayers/protocolraw.py +6 -6
  77. odxtools/diagnostictroublecode.py +8 -8
  78. odxtools/diagservice.py +21 -97
  79. odxtools/diagvariable.py +14 -14
  80. odxtools/docrevision.py +11 -11
  81. odxtools/dopbase.py +6 -6
  82. odxtools/dtcconnector.py +45 -0
  83. odxtools/dtcdop.py +15 -56
  84. odxtools/dynamicendmarkerfield.py +5 -4
  85. odxtools/dynamiclengthfield.py +5 -4
  86. odxtools/dyndefinedspec.py +7 -159
  87. odxtools/dynenddopref.py +5 -5
  88. odxtools/dyniddefmodeinfo.py +161 -0
  89. odxtools/ecuvariantpattern.py +4 -5
  90. odxtools/element.py +5 -6
  91. odxtools/encodestate.py +11 -11
  92. odxtools/encoding.py +2 -3
  93. odxtools/endofpdufield.py +6 -6
  94. odxtools/envdataconnector.py +49 -0
  95. odxtools/environmentdata.py +3 -4
  96. odxtools/environmentdatadescription.py +11 -11
  97. odxtools/exceptions.py +5 -5
  98. odxtools/externalaccessmethod.py +22 -0
  99. odxtools/externaldoc.py +23 -0
  100. odxtools/field.py +9 -10
  101. odxtools/functionalclass.py +4 -4
  102. odxtools/inputparam.py +6 -6
  103. odxtools/internalconstr.py +4 -5
  104. odxtools/isotp_state_machine.py +12 -11
  105. odxtools/leadinglengthinfotype.py +2 -3
  106. odxtools/library.py +5 -5
  107. odxtools/linkeddtcdop.py +62 -0
  108. odxtools/loadfile.py +5 -6
  109. odxtools/matchingbasevariantparameter.py +2 -3
  110. odxtools/matchingparameter.py +7 -7
  111. odxtools/minmaxlengthtype.py +5 -11
  112. odxtools/modification.py +4 -4
  113. odxtools/multiplexer.py +11 -11
  114. odxtools/multiplexercase.py +6 -6
  115. odxtools/multiplexerdefaultcase.py +6 -6
  116. odxtools/multiplexerswitchkey.py +4 -4
  117. odxtools/nameditemlist.py +14 -14
  118. odxtools/negoutputparam.py +3 -3
  119. odxtools/obd.py +1 -2
  120. odxtools/odxcategory.py +6 -6
  121. odxtools/odxlink.py +19 -20
  122. odxtools/odxtypes.py +21 -18
  123. odxtools/outputparam.py +4 -4
  124. odxtools/parameterinfo.py +2 -2
  125. odxtools/parameters/codedconstparameter.py +5 -5
  126. odxtools/parameters/createanyparameter.py +1 -2
  127. odxtools/parameters/dynamicparameter.py +2 -3
  128. odxtools/parameters/lengthkeyparameter.py +5 -5
  129. odxtools/parameters/matchingrequestparameter.py +3 -4
  130. odxtools/parameters/nrcconstparameter.py +7 -7
  131. odxtools/parameters/parameter.py +11 -11
  132. odxtools/parameters/parameterwithdop.py +9 -9
  133. odxtools/parameters/physicalconstantparameter.py +4 -4
  134. odxtools/parameters/reservedparameter.py +3 -4
  135. odxtools/parameters/rowfragment.py +7 -0
  136. odxtools/parameters/systemparameter.py +2 -3
  137. odxtools/parameters/tableentryparameter.py +4 -9
  138. odxtools/parameters/tablekeyparameter.py +10 -10
  139. odxtools/parameters/tablestructparameter.py +7 -7
  140. odxtools/parameters/valueparameter.py +7 -7
  141. odxtools/paramlengthinfotype.py +5 -3
  142. odxtools/parentref.py +9 -9
  143. odxtools/physicaldimension.py +11 -11
  144. odxtools/physicaltype.py +4 -12
  145. odxtools/posresponsesuppressible.py +72 -0
  146. odxtools/preconditionstateref.py +7 -7
  147. odxtools/progcode.py +6 -6
  148. odxtools/protstack.py +4 -4
  149. odxtools/radix.py +9 -0
  150. odxtools/relateddiagcommref.py +22 -0
  151. odxtools/relateddoc.py +6 -6
  152. odxtools/request.py +14 -12
  153. odxtools/response.py +15 -13
  154. odxtools/scaleconstr.py +4 -12
  155. odxtools/servicebinner.py +5 -5
  156. odxtools/singleecujob.py +4 -4
  157. odxtools/snrefcontext.py +2 -2
  158. odxtools/specialdata.py +5 -5
  159. odxtools/specialdatagroup.py +9 -9
  160. odxtools/specialdatagroupcaption.py +3 -3
  161. odxtools/standardizationlevel.py +9 -0
  162. odxtools/standardlengthtype.py +12 -21
  163. odxtools/state.py +3 -3
  164. odxtools/statechart.py +4 -4
  165. odxtools/statemachine.py +4 -3
  166. odxtools/statetransition.py +5 -18
  167. odxtools/statetransitionref.py +18 -18
  168. odxtools/staticfield.py +5 -4
  169. odxtools/structure.py +2 -3
  170. odxtools/subcomponent.py +12 -245
  171. odxtools/subcomponentparamconnector.py +103 -0
  172. odxtools/subcomponentpattern.py +42 -0
  173. odxtools/swvariable.py +3 -4
  174. odxtools/table.py +17 -55
  175. odxtools/tablediagcommconnector.py +47 -0
  176. odxtools/tablerow.py +30 -30
  177. odxtools/tablerowconnector.py +46 -0
  178. odxtools/teammember.py +11 -11
  179. odxtools/templates/macros/printService.xml.jinja2 +2 -1
  180. odxtools/termination.py +8 -0
  181. odxtools/text.py +2 -3
  182. odxtools/transmode.py +9 -0
  183. odxtools/uds.py +2 -3
  184. odxtools/unit.py +9 -9
  185. odxtools/unitgroup.py +6 -11
  186. odxtools/unitgroupcategory.py +7 -0
  187. odxtools/unitspec.py +6 -6
  188. odxtools/usage.py +9 -0
  189. odxtools/utils.py +31 -2
  190. odxtools/validtype.py +9 -0
  191. odxtools/variablegroup.py +2 -2
  192. odxtools/variantmatcher.py +10 -10
  193. odxtools/variantpattern.py +3 -3
  194. odxtools/version.py +2 -2
  195. odxtools/writepdxfile.py +5 -5
  196. odxtools/xdoc.py +9 -9
  197. {odxtools-9.6.1.dist-info → odxtools-10.0.0.dist-info}/METADATA +4 -5
  198. odxtools-10.0.0.dist-info/RECORD +264 -0
  199. odxtools-9.6.1.dist-info/RECORD +0 -238
  200. {odxtools-9.6.1.dist-info → odxtools-10.0.0.dist-info}/WHEEL +0 -0
  201. {odxtools-9.6.1.dist-info → odxtools-10.0.0.dist-info}/entry_points.txt +0 -0
  202. {odxtools-9.6.1.dist-info → odxtools-10.0.0.dist-info}/licenses/LICENSE +0 -0
  203. {odxtools-9.6.1.dist-info → odxtools-10.0.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 override
@@ -34,7 +34,7 @@ class NrcConstParameter(Parameter):
34
34
 
35
35
  """
36
36
 
37
- coded_values_raw: List[str]
37
+ coded_values_raw: list[str]
38
38
  diag_coded_type: DiagCodedType
39
39
 
40
40
  @property
@@ -57,13 +57,13 @@ class NrcConstParameter(Parameter):
57
57
  return self.diag_coded_type.base_data_type
58
58
 
59
59
  @property
60
- def coded_values(self) -> List[AtomicOdxType]:
60
+ def coded_values(self) -> list[AtomicOdxType]:
61
61
  return self._coded_values
62
62
 
63
63
  @staticmethod
64
64
  @override
65
65
  def from_et(et_element: ElementTree.Element,
66
- doc_frags: List[OdxDocFragment]) -> "NrcConstParameter":
66
+ doc_frags: list[OdxDocFragment]) -> "NrcConstParameter":
67
67
 
68
68
  kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, doc_frags))
69
69
 
@@ -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
2
  from dataclasses import dataclass
3
- from typing import Any, Dict, List, Literal, Optional
3
+ from typing import Any, Literal
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from typing_extensions import final, override
@@ -42,11 +42,11 @@ class Parameter(NamedElement):
42
42
  non-positionable parameter types.
43
43
 
44
44
  """
45
- sdgs: List[SpecialDataGroup]
46
- semantic: Optional[str]
47
- oid: Optional[str]
48
- byte_position: Optional[int]
49
- bit_position: Optional[int]
45
+ sdgs: list[SpecialDataGroup]
46
+ semantic: str | None
47
+ oid: str | None
48
+ byte_position: int | None
49
+ bit_position: int | None
50
50
 
51
51
  @property
52
52
  def parameter_type(self) -> ParameterType:
@@ -78,7 +78,7 @@ class Parameter(NamedElement):
78
78
 
79
79
  @staticmethod
80
80
  @override
81
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "Parameter":
81
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "Parameter":
82
82
 
83
83
  kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, doc_frags))
84
84
 
@@ -100,7 +100,7 @@ class Parameter(NamedElement):
100
100
  bit_position=bit_position,
101
101
  **kwargs)
102
102
 
103
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
103
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
104
104
  result = {}
105
105
 
106
106
  for sdg in self.sdgs:
@@ -116,11 +116,11 @@ class Parameter(NamedElement):
116
116
  for sdg in self.sdgs:
117
117
  sdg._resolve_snrefs(context)
118
118
 
119
- def get_static_bit_length(self) -> Optional[int]:
119
+ def get_static_bit_length(self) -> int | None:
120
120
  return None
121
121
 
122
122
  @final
123
- def encode_into_pdu(self, physical_value: Optional[ParameterValue],
123
+ def encode_into_pdu(self, physical_value: ParameterValue | None,
124
124
  encode_state: EncodeState) -> None:
125
125
  """Convert a physical value into its encoded form and place it
126
126
  into the PDU
@@ -140,7 +140,7 @@ class Parameter(NamedElement):
140
140
 
141
141
  encode_state.cursor_bit_position = 0
142
142
 
143
- def _encode_positioned_into_pdu(self, physical_value: Optional[ParameterValue],
143
+ def _encode_positioned_into_pdu(self, physical_value: ParameterValue | None,
144
144
  encode_state: EncodeState) -> None:
145
145
  """Method which actually encodes the parameter
146
146
 
@@ -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
@@ -21,8 +21,8 @@ from .parameter import Parameter
21
21
 
22
22
  @dataclass
23
23
  class ParameterWithDOP(Parameter):
24
- dop_ref: Optional[OdxLinkRef]
25
- dop_snref: Optional[str]
24
+ dop_ref: OdxLinkRef | None
25
+ dop_snref: str | None
26
26
 
27
27
  @property
28
28
  def dop(self) -> DopBase:
@@ -33,7 +33,7 @@ class ParameterWithDOP(Parameter):
33
33
  @staticmethod
34
34
  @override
35
35
  def from_et(et_element: ElementTree.Element,
36
- doc_frags: List[OdxDocFragment]) -> "ParameterWithDOP":
36
+ doc_frags: list[OdxDocFragment]) -> "ParameterWithDOP":
37
37
 
38
38
  kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, doc_frags))
39
39
 
@@ -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]:
81
- if isinstance(self.dop, (DataObjectProperty, DtcDop)):
80
+ def physical_type(self) -> PhysicalType | None:
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
@@ -43,7 +43,7 @@ class PhysicalConstantParameter(ParameterWithDOP):
43
43
  @staticmethod
44
44
  @override
45
45
  def from_et(et_element: ElementTree.Element,
46
- doc_frags: List[OdxDocFragment]) -> "PhysicalConstantParameter":
46
+ doc_frags: list[OdxDocFragment]) -> "PhysicalConstantParameter":
47
47
 
48
48
  kwargs = dataclass_fields_asdict(ParameterWithDOP.from_et(et_element, doc_frags))
49
49
 
@@ -53,7 +53,7 @@ class PhysicalConstantParameter(ParameterWithDOP):
53
53
  physical_constant_value_raw=physical_constant_value_raw, **kwargs)
54
54
 
55
55
  @override
56
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
56
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
57
57
  return super()._build_odxlinks()
58
58
 
59
59
  @override
@@ -72,7 +72,7 @@ class PhysicalConstantParameter(ParameterWithDOP):
72
72
  self._physical_constant_value = base_data_type.from_string(self.physical_constant_value_raw)
73
73
 
74
74
  @override
75
- def _encode_positioned_into_pdu(self, physical_value: Optional[ParameterValue],
75
+ def _encode_positioned_into_pdu(self, physical_value: ParameterValue | None,
76
76
  encode_state: EncodeState) -> None:
77
77
  if physical_value is not None and physical_value != self.physical_constant_value:
78
78
  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
@@ -36,7 +35,7 @@ class ReservedParameter(Parameter):
36
35
  @staticmethod
37
36
  @override
38
37
  def from_et(et_element: ElementTree.Element,
39
- doc_frags: List[OdxDocFragment]) -> "ReservedParameter":
38
+ doc_frags: list[OdxDocFragment]) -> "ReservedParameter":
40
39
  kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, doc_frags))
41
40
 
42
41
  bit_length = int(odxrequire(et_element.findtext("BIT-LENGTH")))
@@ -44,11 +43,11 @@ class ReservedParameter(Parameter):
44
43
  return ReservedParameter(bit_length=bit_length, **kwargs)
45
44
 
46
45
  @override
47
- def get_static_bit_length(self) -> Optional[int]:
46
+ def get_static_bit_length(self) -> int | None:
48
47
  return self.bit_length
49
48
 
50
49
  @override
51
- def _encode_positioned_into_pdu(self, physical_value: Optional[ParameterValue],
50
+ def _encode_positioned_into_pdu(self, physical_value: ParameterValue | None,
52
51
  encode_state: EncodeState) -> None:
53
52
  encode_state.cursor_byte_position += (encode_state.cursor_bit_position + self.bit_length +
54
53
  7) // 8
@@ -0,0 +1,7 @@
1
+ # SPDX-License-Identifier: MIT
2
+ from enum import Enum
3
+
4
+
5
+ class RowFragment(Enum):
6
+ KEY = "KEY"
7
+ STRUCT = "STRUCT"
@@ -2,7 +2,6 @@
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
@@ -50,7 +49,7 @@ class SystemParameter(ParameterWithDOP):
50
49
  @staticmethod
51
50
  @override
52
51
  def from_et(et_element: ElementTree.Element,
53
- doc_frags: List[OdxDocFragment]) -> "SystemParameter":
52
+ doc_frags: list[OdxDocFragment]) -> "SystemParameter":
54
53
  kwargs = dataclass_fields_asdict(ParameterWithDOP.from_et(et_element, doc_frags))
55
54
 
56
55
  sysparam = odxrequire(et_element.get("SYSPARAM"))
@@ -58,7 +57,7 @@ class SystemParameter(ParameterWithDOP):
58
57
  return SystemParameter(sysparam=sysparam, **kwargs)
59
58
 
60
59
  @override
61
- def _encode_positioned_into_pdu(self, physical_value: Optional[ParameterValue],
60
+ def _encode_positioned_into_pdu(self, physical_value: ParameterValue | None,
62
61
  encode_state: EncodeState) -> None:
63
62
  if physical_value is None:
64
63
  # determine the value to be encoded automatically
@@ -1,7 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from enum import Enum
4
- from typing import TYPE_CHECKING, List, Optional, cast
3
+ from typing import TYPE_CHECKING, cast
5
4
  from xml.etree import ElementTree
6
5
 
7
6
  from typing_extensions import override
@@ -13,16 +12,12 @@ from ..odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkRef
13
12
  from ..odxtypes import ParameterValue
14
13
  from ..utils import dataclass_fields_asdict
15
14
  from .parameter import Parameter, ParameterType
15
+ from .rowfragment import RowFragment
16
16
 
17
17
  if TYPE_CHECKING:
18
18
  from ..tablerow import TableRow
19
19
 
20
20
 
21
- class RowFragment(Enum):
22
- KEY = "KEY"
23
- STRUCT = "STRUCT"
24
-
25
-
26
21
  @dataclass
27
22
  class TableEntryParameter(Parameter):
28
23
  target: RowFragment
@@ -50,7 +45,7 @@ class TableEntryParameter(Parameter):
50
45
  @staticmethod
51
46
  @override
52
47
  def from_et(et_element: ElementTree.Element,
53
- doc_frags: List[OdxDocFragment]) -> "TableEntryParameter":
48
+ doc_frags: list[OdxDocFragment]) -> "TableEntryParameter":
54
49
  kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, doc_frags))
55
50
 
56
51
  target_str = odxrequire(et_element.findtext("TARGET"))
@@ -73,7 +68,7 @@ class TableEntryParameter(Parameter):
73
68
  self._table_row = odxlinks.resolve(self.table_row_ref)
74
69
 
75
70
  @override
76
- def _encode_positioned_into_pdu(self, physical_value: Optional[ParameterValue],
71
+ def _encode_positioned_into_pdu(self, physical_value: ParameterValue | None,
77
72
  encode_state: EncodeState) -> None:
78
73
  raise NotImplementedError("Encoding a TableEntryParameter is not implemented yet.")
79
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
@@ -26,18 +26,18 @@ class TableKeyParameter(Parameter):
26
26
 
27
27
  # the spec mandates that exactly one of the two attributes must
28
28
  # be non-None
29
- table_ref: Optional[OdxLinkRef]
30
- table_snref: Optional[str]
29
+ table_ref: OdxLinkRef | None
30
+ table_snref: str | None
31
31
 
32
32
  # the spec mandates that exactly one of the two attributes must
33
33
  # be non-None
34
- table_row_ref: Optional[OdxLinkRef]
35
- table_row_snref: Optional[str]
34
+ table_row_ref: OdxLinkRef | None
35
+ table_row_snref: str | None
36
36
 
37
37
  @staticmethod
38
38
  @override
39
39
  def from_et(et_element: ElementTree.Element,
40
- doc_frags: List[OdxDocFragment]) -> "TableKeyParameter":
40
+ doc_frags: list[OdxDocFragment]) -> "TableKeyParameter":
41
41
  kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, doc_frags))
42
42
 
43
43
  odx_id = odxrequire(OdxLinkId.from_et(et_element, doc_frags))
@@ -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:
@@ -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, cast
3
+ from typing import TYPE_CHECKING, Any, cast
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from typing_extensions import override
@@ -21,8 +21,8 @@ if TYPE_CHECKING:
21
21
 
22
22
  @dataclass
23
23
  class TableStructParameter(Parameter):
24
- table_key_ref: Optional[OdxLinkRef]
25
- table_key_snref: Optional[str]
24
+ table_key_ref: OdxLinkRef | None
25
+ table_key_snref: str | None
26
26
 
27
27
  @property
28
28
  @override
@@ -50,7 +50,7 @@ class TableStructParameter(Parameter):
50
50
  @staticmethod
51
51
  @override
52
52
  def from_et(et_element: ElementTree.Element,
53
- doc_frags: List[OdxDocFragment]) -> "TableStructParameter":
53
+ doc_frags: list[OdxDocFragment]) -> "TableStructParameter":
54
54
 
55
55
  kwargs = dataclass_fields_asdict(Parameter.from_et(et_element, doc_frags))
56
56
 
@@ -67,7 +67,7 @@ class TableStructParameter(Parameter):
67
67
  odxraise("Either table_key_ref or table_key_snref must be defined.")
68
68
 
69
69
  @override
70
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
70
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
71
71
  return super()._build_odxlinks()
72
72
 
73
73
  @override
@@ -86,10 +86,10 @@ class TableStructParameter(Parameter):
86
86
  TableKeyParameter)
87
87
 
88
88
  @override
89
- def _encode_positioned_into_pdu(self, physical_value: Optional[ParameterValue],
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(
@@ -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
@@ -18,7 +18,7 @@ from .parameterwithdop import ParameterWithDOP
18
18
 
19
19
  @dataclass
20
20
  class ValueParameter(ParameterWithDOP):
21
- physical_default_value_raw: Optional[str]
21
+ physical_default_value_raw: str | None
22
22
 
23
23
  @property
24
24
  @override
@@ -26,7 +26,7 @@ class ValueParameter(ParameterWithDOP):
26
26
  return "VALUE"
27
27
 
28
28
  @property
29
- def physical_default_value(self) -> Optional[AtomicOdxType]:
29
+ def physical_default_value(self) -> AtomicOdxType | None:
30
30
  return self._physical_default_value
31
31
 
32
32
  @property
@@ -42,7 +42,7 @@ class ValueParameter(ParameterWithDOP):
42
42
  @staticmethod
43
43
  @override
44
44
  def from_et(et_element: ElementTree.Element,
45
- doc_frags: List[OdxDocFragment]) -> "ValueParameter":
45
+ doc_frags: list[OdxDocFragment]) -> "ValueParameter":
46
46
 
47
47
  kwargs = dataclass_fields_asdict(ParameterWithDOP.from_et(et_element, doc_frags))
48
48
 
@@ -51,10 +51,10 @@ class ValueParameter(ParameterWithDOP):
51
51
  return ValueParameter(physical_default_value_raw=physical_default_value_raw, **kwargs)
52
52
 
53
53
  def __post_init__(self) -> None:
54
- self._physical_default_value: Optional[AtomicOdxType] = None
54
+ self._physical_default_value: AtomicOdxType | None = None
55
55
 
56
56
  @override
57
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
57
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
58
58
  return super()._build_odxlinks()
59
59
 
60
60
  @override
@@ -75,7 +75,7 @@ class ValueParameter(ParameterWithDOP):
75
75
  self.physical_default_value_raw)
76
76
 
77
77
  @override
78
- def _encode_positioned_into_pdu(self, physical_value: Optional[ParameterValue],
78
+ def _encode_positioned_into_pdu(self, physical_value: ParameterValue | None,
79
79
  encode_state: EncodeState) -> None:
80
80
 
81
81
  if physical_value is None:
@@ -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, cast
3
+ from typing import TYPE_CHECKING, Any, cast
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from typing_extensions import override
@@ -33,7 +33,7 @@ class ParamLengthInfoType(DiagCodedType):
33
33
  @staticmethod
34
34
  @override
35
35
  def from_et(et_element: ElementTree.Element,
36
- doc_frags: List[OdxDocFragment]) -> "ParamLengthInfoType":
36
+ doc_frags: list[OdxDocFragment]) -> "ParamLengthInfoType":
37
37
  kwargs = dataclass_fields_asdict(DiagCodedType.from_et(et_element, doc_frags))
38
38
 
39
39
  length_key_ref = odxrequire(
@@ -41,7 +41,7 @@ class ParamLengthInfoType(DiagCodedType):
41
41
 
42
42
  return ParamLengthInfoType(length_key_ref=length_key_ref, **kwargs)
43
43
 
44
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
44
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
45
45
  return super()._build_odxlinks()
46
46
 
47
47
  def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
@@ -74,6 +74,8 @@ class ParamLengthInfoType(DiagCodedType):
74
74
  elif self.base_data_type in [DataType.A_UNICODE2STRING]:
75
75
  bit_length = 16 * len(cast(str, internal_value))
76
76
  elif self.base_data_type in [DataType.A_INT32, DataType.A_UINT32]:
77
+ if not isinstance(internal_value, int):
78
+ odxraise()
77
79
  bit_length = int(internal_value).bit_length()
78
80
  if self.base_data_type == DataType.A_INT32:
79
81
  bit_length += 1
odxtools/parentref.py CHANGED
@@ -1,7 +1,7 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from copy import deepcopy
3
3
  from dataclasses import dataclass
4
- from typing import TYPE_CHECKING, Any, Dict, List
4
+ from typing import TYPE_CHECKING, Any
5
5
  from xml.etree import ElementTree
6
6
 
7
7
  from .exceptions import odxrequire
@@ -16,18 +16,18 @@ if TYPE_CHECKING:
16
16
  @dataclass
17
17
  class ParentRef:
18
18
  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
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
24
24
 
25
25
  @property
26
26
  def layer(self) -> "DiagLayer":
27
27
  return self._layer
28
28
 
29
29
  @staticmethod
30
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "ParentRef":
30
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "ParentRef":
31
31
 
32
32
  layer_ref = odxrequire(OdxLinkRef.from_et(et_element, doc_frags))
33
33
 
@@ -69,7 +69,7 @@ class ParentRef:
69
69
  not_inherited_global_neg_responses=not_inherited_global_neg_responses,
70
70
  )
71
71
 
72
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
72
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
73
73
  return {}
74
74
 
75
75
  def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
@@ -81,7 +81,7 @@ class ParentRef:
81
81
  def _resolve_snrefs(self, context: SnRefContext) -> None:
82
82
  pass
83
83
 
84
- def __deepcopy__(self, memo: Dict[int, Any]) -> Any:
84
+ def __deepcopy__(self, memo: dict[int, Any]) -> Any:
85
85
  cls = self.__class__
86
86
  result = cls.__new__(cls)
87
87
  memo[id(self)] = result
@@ -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 .element import IdentifiableElement
@@ -41,20 +41,20 @@ class PhysicalDimension(IdentifiableElement):
41
41
  )
42
42
  ```
43
43
  """
44
- length_exp: Optional[int]
45
- mass_exp: Optional[int]
46
- time_exp: Optional[int]
47
- current_exp: Optional[int]
48
- temperature_exp: Optional[int]
49
- molar_amount_exp: Optional[int]
50
- luminous_intensity_exp: Optional[int]
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
51
51
 
52
52
  @staticmethod
53
53
  def from_et(et_element: ElementTree.Element,
54
- doc_frags: List[OdxDocFragment]) -> "PhysicalDimension":
54
+ doc_frags: list[OdxDocFragment]) -> "PhysicalDimension":
55
55
  kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
56
56
 
57
- def read_optional_int(element: ElementTree.Element, name: str) -> Optional[int]:
57
+ def read_optional_int(element: ElementTree.Element, name: str) -> int | None:
58
58
  if (val_str := element.findtext(name)) is not None:
59
59
  return int(val_str)
60
60
  else:
@@ -78,7 +78,7 @@ class PhysicalDimension(IdentifiableElement):
78
78
  luminous_intensity_exp=luminous_intensity_exp,
79
79
  **kwargs)
80
80
 
81
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
81
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
82
82
  return {self.odx_id: self}
83
83
 
84
84
  def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None: