odxtools 9.7.0__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 (189) hide show
  1. odxtools/additionalaudience.py +3 -3
  2. odxtools/admindata.py +8 -8
  3. odxtools/audience.py +10 -10
  4. odxtools/basecomparam.py +5 -5
  5. odxtools/basevariantpattern.py +4 -5
  6. odxtools/basicstructure.py +8 -8
  7. odxtools/cli/_print_utils.py +35 -23
  8. odxtools/cli/browse.py +9 -9
  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 +7 -7
  13. odxtools/cli/main.py +2 -2
  14. odxtools/cli/snoop.py +3 -3
  15. odxtools/codec.py +3 -3
  16. odxtools/commrelation.py +11 -11
  17. odxtools/companydata.py +5 -5
  18. odxtools/companydocinfo.py +8 -8
  19. odxtools/companyrevisioninfo.py +5 -5
  20. odxtools/companyspecificinfo.py +5 -5
  21. odxtools/comparam.py +3 -3
  22. odxtools/comparaminstance.py +10 -10
  23. odxtools/comparamspec.py +3 -3
  24. odxtools/comparamsubset.py +5 -5
  25. odxtools/complexcomparam.py +7 -7
  26. odxtools/compositecodec.py +11 -11
  27. odxtools/compumethods/compucodecompumethod.py +4 -4
  28. odxtools/compumethods/compuconst.py +4 -5
  29. odxtools/compumethods/compudefaultvalue.py +1 -2
  30. odxtools/compumethods/compuinternaltophys.py +6 -6
  31. odxtools/compumethods/compumethod.py +5 -5
  32. odxtools/compumethods/compuphystointernal.py +6 -6
  33. odxtools/compumethods/compurationalcoeffs.py +4 -4
  34. odxtools/compumethods/compuscale.py +9 -10
  35. odxtools/compumethods/createanycompumethod.py +1 -2
  36. odxtools/compumethods/identicalcompumethod.py +1 -2
  37. odxtools/compumethods/limit.py +12 -12
  38. odxtools/compumethods/linearcompumethod.py +2 -2
  39. odxtools/compumethods/linearsegment.py +14 -15
  40. odxtools/compumethods/ratfunccompumethod.py +3 -3
  41. odxtools/compumethods/ratfuncsegment.py +7 -8
  42. odxtools/compumethods/scalelinearcompumethod.py +7 -7
  43. odxtools/compumethods/scaleratfunccompumethod.py +4 -4
  44. odxtools/compumethods/tabintpcompumethod.py +15 -18
  45. odxtools/compumethods/texttablecompumethod.py +3 -3
  46. odxtools/createanycomparam.py +2 -4
  47. odxtools/createanydiagcodedtype.py +1 -2
  48. odxtools/database.py +9 -8
  49. odxtools/dataobjectproperty.py +10 -10
  50. odxtools/decodestate.py +5 -5
  51. odxtools/description.py +5 -5
  52. odxtools/determinenumberofitems.py +4 -4
  53. odxtools/diagcodedtype.py +7 -7
  54. odxtools/diagcomm.py +17 -17
  55. odxtools/diagdatadictionaryspec.py +6 -6
  56. odxtools/diaglayercontainer.py +4 -4
  57. odxtools/diaglayers/basevariant.py +10 -9
  58. odxtools/diaglayers/basevariantraw.py +9 -9
  59. odxtools/diaglayers/diaglayer.py +20 -19
  60. odxtools/diaglayers/diaglayerraw.py +10 -10
  61. odxtools/diaglayers/diaglayertype.py +1 -2
  62. odxtools/diaglayers/ecushareddata.py +4 -4
  63. odxtools/diaglayers/ecushareddataraw.py +6 -6
  64. odxtools/diaglayers/ecuvariant.py +11 -10
  65. odxtools/diaglayers/ecuvariantraw.py +9 -9
  66. odxtools/diaglayers/functionalgroup.py +8 -7
  67. odxtools/diaglayers/functionalgroupraw.py +7 -7
  68. odxtools/diaglayers/hierarchyelement.py +43 -49
  69. odxtools/diaglayers/hierarchyelementraw.py +4 -4
  70. odxtools/diaglayers/protocol.py +4 -4
  71. odxtools/diaglayers/protocolraw.py +6 -6
  72. odxtools/diagnostictroublecode.py +8 -8
  73. odxtools/diagservice.py +18 -18
  74. odxtools/diagvariable.py +14 -14
  75. odxtools/docrevision.py +11 -11
  76. odxtools/dopbase.py +6 -6
  77. odxtools/dtcconnector.py +3 -3
  78. odxtools/dtcdop.py +13 -9
  79. odxtools/dynamicendmarkerfield.py +5 -4
  80. odxtools/dynamiclengthfield.py +5 -4
  81. odxtools/dyndefinedspec.py +5 -5
  82. odxtools/dynenddopref.py +5 -5
  83. odxtools/dyniddefmodeinfo.py +13 -13
  84. odxtools/ecuvariantpattern.py +4 -5
  85. odxtools/element.py +5 -6
  86. odxtools/encodestate.py +11 -11
  87. odxtools/encoding.py +2 -3
  88. odxtools/endofpdufield.py +6 -6
  89. odxtools/envdataconnector.py +3 -3
  90. odxtools/environmentdata.py +3 -4
  91. odxtools/environmentdatadescription.py +11 -11
  92. odxtools/exceptions.py +5 -5
  93. odxtools/externalaccessmethod.py +1 -2
  94. odxtools/externaldoc.py +4 -4
  95. odxtools/field.py +9 -10
  96. odxtools/functionalclass.py +4 -4
  97. odxtools/inputparam.py +6 -6
  98. odxtools/internalconstr.py +4 -5
  99. odxtools/isotp_state_machine.py +12 -11
  100. odxtools/leadinglengthinfotype.py +2 -3
  101. odxtools/library.py +5 -5
  102. odxtools/linkeddtcdop.py +4 -4
  103. odxtools/loadfile.py +5 -6
  104. odxtools/matchingbasevariantparameter.py +2 -3
  105. odxtools/matchingparameter.py +7 -7
  106. odxtools/minmaxlengthtype.py +4 -4
  107. odxtools/modification.py +4 -4
  108. odxtools/multiplexer.py +11 -11
  109. odxtools/multiplexercase.py +6 -6
  110. odxtools/multiplexerdefaultcase.py +6 -6
  111. odxtools/multiplexerswitchkey.py +4 -4
  112. odxtools/nameditemlist.py +14 -14
  113. odxtools/negoutputparam.py +3 -3
  114. odxtools/obd.py +1 -2
  115. odxtools/odxcategory.py +6 -6
  116. odxtools/odxlink.py +19 -20
  117. odxtools/odxtypes.py +21 -18
  118. odxtools/outputparam.py +4 -4
  119. odxtools/parameterinfo.py +1 -1
  120. odxtools/parameters/codedconstparameter.py +5 -5
  121. odxtools/parameters/createanyparameter.py +1 -2
  122. odxtools/parameters/dynamicparameter.py +2 -3
  123. odxtools/parameters/lengthkeyparameter.py +5 -5
  124. odxtools/parameters/matchingrequestparameter.py +3 -4
  125. odxtools/parameters/nrcconstparameter.py +7 -7
  126. odxtools/parameters/parameter.py +11 -11
  127. odxtools/parameters/parameterwithdop.py +9 -9
  128. odxtools/parameters/physicalconstantparameter.py +4 -4
  129. odxtools/parameters/reservedparameter.py +3 -4
  130. odxtools/parameters/systemparameter.py +2 -3
  131. odxtools/parameters/tableentryparameter.py +3 -3
  132. odxtools/parameters/tablekeyparameter.py +10 -10
  133. odxtools/parameters/tablestructparameter.py +7 -7
  134. odxtools/parameters/valueparameter.py +7 -7
  135. odxtools/paramlengthinfotype.py +5 -3
  136. odxtools/parentref.py +9 -9
  137. odxtools/physicaldimension.py +11 -11
  138. odxtools/physicaltype.py +3 -4
  139. odxtools/posresponsesuppressible.py +9 -10
  140. odxtools/preconditionstateref.py +7 -7
  141. odxtools/progcode.py +6 -6
  142. odxtools/protstack.py +4 -4
  143. odxtools/relateddiagcommref.py +1 -2
  144. odxtools/relateddoc.py +6 -6
  145. odxtools/request.py +9 -9
  146. odxtools/response.py +10 -10
  147. odxtools/scaleconstr.py +3 -4
  148. odxtools/servicebinner.py +5 -5
  149. odxtools/singleecujob.py +4 -4
  150. odxtools/snrefcontext.py +2 -2
  151. odxtools/specialdata.py +5 -5
  152. odxtools/specialdatagroup.py +9 -9
  153. odxtools/specialdatagroupcaption.py +3 -3
  154. odxtools/standardlengthtype.py +10 -10
  155. odxtools/state.py +3 -3
  156. odxtools/statechart.py +4 -4
  157. odxtools/statemachine.py +4 -3
  158. odxtools/statetransition.py +4 -4
  159. odxtools/statetransitionref.py +18 -18
  160. odxtools/staticfield.py +5 -4
  161. odxtools/structure.py +2 -3
  162. odxtools/subcomponent.py +5 -5
  163. odxtools/subcomponentparamconnector.py +5 -5
  164. odxtools/subcomponentpattern.py +4 -4
  165. odxtools/swvariable.py +3 -4
  166. odxtools/table.py +14 -14
  167. odxtools/tablediagcommconnector.py +5 -5
  168. odxtools/tablerow.py +30 -30
  169. odxtools/tablerowconnector.py +3 -3
  170. odxtools/teammember.py +11 -11
  171. odxtools/text.py +2 -3
  172. odxtools/uds.py +2 -3
  173. odxtools/unit.py +9 -9
  174. odxtools/unitgroup.py +5 -5
  175. odxtools/unitspec.py +6 -6
  176. odxtools/utils.py +3 -3
  177. odxtools/variablegroup.py +2 -2
  178. odxtools/variantmatcher.py +10 -10
  179. odxtools/variantpattern.py +3 -3
  180. odxtools/version.py +2 -2
  181. odxtools/writepdxfile.py +5 -5
  182. odxtools/xdoc.py +9 -9
  183. {odxtools-9.7.0.dist-info → odxtools-10.0.0.dist-info}/METADATA +4 -5
  184. odxtools-10.0.0.dist-info/RECORD +264 -0
  185. odxtools-9.7.0.dist-info/RECORD +0 -264
  186. {odxtools-9.7.0.dist-info → odxtools-10.0.0.dist-info}/WHEEL +0 -0
  187. {odxtools-9.7.0.dist-info → odxtools-10.0.0.dist-info}/entry_points.txt +0 -0
  188. {odxtools-9.7.0.dist-info → odxtools-10.0.0.dist-info}/licenses/LICENSE +0 -0
  189. {odxtools-9.7.0.dist-info → odxtools-10.0.0.dist-info}/top_level.txt +0 -0
odxtools/docrevision.py CHANGED
@@ -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 .companyrevisioninfo import CompanyRevisionInfo
@@ -17,20 +17,20 @@ class DocRevision:
17
17
  Representation of a single revision of the relevant object.
18
18
  """
19
19
 
20
- team_member_ref: Optional[OdxLinkRef]
21
- revision_label: Optional[str]
22
- state: Optional[str]
20
+ team_member_ref: OdxLinkRef | None
21
+ revision_label: str | None
22
+ state: str | None
23
23
  date: str
24
- tool: Optional[str]
25
- company_revision_infos: List[CompanyRevisionInfo]
26
- modifications: List[Modification]
24
+ tool: str | None
25
+ company_revision_infos: list[CompanyRevisionInfo]
26
+ modifications: list[Modification]
27
27
 
28
28
  @property
29
- def team_member(self) -> Optional[TeamMember]:
29
+ def team_member(self) -> TeamMember | None:
30
30
  return self._team_member
31
31
 
32
32
  @staticmethod
33
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "DocRevision":
33
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "DocRevision":
34
34
 
35
35
  team_member_ref = OdxLinkRef.from_et(et_element.find("TEAM-MEMBER-REF"), doc_frags)
36
36
  revision_label = et_element.findtext("REVISION-LABEL")
@@ -59,11 +59,11 @@ class DocRevision:
59
59
  modifications=modifications,
60
60
  )
61
61
 
62
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
62
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
63
63
  return {}
64
64
 
65
65
  def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
66
- self._team_member: Optional[TeamMember] = None
66
+ self._team_member: TeamMember | None = None
67
67
  if self.team_member_ref is not None:
68
68
  self._team_member = odxlinks.resolve(self.team_member_ref, TeamMember)
69
69
 
odxtools/dopbase.py CHANGED
@@ -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 .admindata import AdminData
@@ -24,11 +24,11 @@ class DopBase(IdentifiableElement):
24
24
 
25
25
  """
26
26
 
27
- admin_data: Optional[AdminData]
28
- sdgs: List[SpecialDataGroup]
27
+ admin_data: AdminData | None
28
+ sdgs: list[SpecialDataGroup]
29
29
 
30
30
  @staticmethod
31
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "DopBase":
31
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "DopBase":
32
32
 
33
33
  kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
34
34
 
@@ -42,7 +42,7 @@ class DopBase(IdentifiableElement):
42
42
 
43
43
  return DopBase(admin_data=admin_data, sdgs=sdgs, **kwargs)
44
44
 
45
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
45
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
46
46
  result = {self.odx_id: self}
47
47
 
48
48
  for sdg in self.sdgs:
@@ -58,7 +58,7 @@ class DopBase(IdentifiableElement):
58
58
  for sdg in self.sdgs:
59
59
  sdg._resolve_snrefs(context)
60
60
 
61
- def get_static_bit_length(self) -> Optional[int]:
61
+ def get_static_bit_length(self) -> int | None:
62
62
  return None
63
63
 
64
64
  def is_valid_physical_value(self, physical_value: ParameterValue) -> bool:
odxtools/dtcconnector.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import Any, Dict, List
3
+ from typing import Any
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .diagnostictroublecode import DiagnosticTroubleCode
@@ -26,7 +26,7 @@ class DtcConnector(NamedElement):
26
26
  return self._dtc
27
27
 
28
28
  @staticmethod
29
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "DtcConnector":
29
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "DtcConnector":
30
30
  kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, doc_frags))
31
31
 
32
32
  dtc_dop_ref = odxrequire(OdxLinkRef.from_et(et_element.find("DTC-DOP-REF"), doc_frags))
@@ -35,7 +35,7 @@ class DtcConnector(NamedElement):
35
35
 
36
36
  return DtcConnector(dtc_dop_ref=dtc_dop_ref, dtc_snref=dtc_snref, **kwargs)
37
37
 
38
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
38
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
39
39
  return {}
40
40
 
41
41
  def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
odxtools/dtcdop.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import Any, Dict, List, Optional, Union, cast
3
+ from typing import Any, cast
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from typing_extensions import override
@@ -30,9 +30,9 @@ class DtcDop(DopBase):
30
30
  diag_coded_type: DiagCodedType
31
31
  physical_type: PhysicalType
32
32
  compu_method: CompuMethod
33
- dtcs_raw: List[Union[DiagnosticTroubleCode, OdxLinkRef]]
34
- linked_dtc_dops_raw: List[LinkedDtcDop]
35
- is_visible_raw: Optional[bool]
33
+ dtcs_raw: list[DiagnosticTroubleCode | OdxLinkRef]
34
+ linked_dtc_dops_raw: list[LinkedDtcDop]
35
+ is_visible_raw: bool | None
36
36
 
37
37
  @property
38
38
  def dtcs(self) -> NamedItemList[DiagnosticTroubleCode]:
@@ -47,7 +47,7 @@ class DtcDop(DopBase):
47
47
  return self.is_visible_raw is True
48
48
 
49
49
  @staticmethod
50
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "DtcDop":
50
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "DtcDop":
51
51
  """Reads a DTC-DOP."""
52
52
  kwargs = dataclass_fields_asdict(DopBase.from_et(et_element, doc_frags))
53
53
 
@@ -61,7 +61,7 @@ class DtcDop(DopBase):
61
61
  internal_type=diag_coded_type.base_data_type,
62
62
  physical_type=physical_type.base_data_type,
63
63
  )
64
- dtcs_raw: List[Union[DiagnosticTroubleCode, OdxLinkRef]] = []
64
+ dtcs_raw: list[DiagnosticTroubleCode | OdxLinkRef] = []
65
65
  if (dtcs_elem := et_element.find("DTCS")) is not None:
66
66
  for dtc_proxy_elem in dtcs_elem:
67
67
  if dtc_proxy_elem.tag == "DTC":
@@ -155,7 +155,7 @@ class DtcDop(DopBase):
155
155
  return cast(int, None)
156
156
 
157
157
  @override
158
- def encode_into_pdu(self, physical_value: Optional[ParameterValue],
158
+ def encode_into_pdu(self, physical_value: ParameterValue | None,
159
159
  encode_state: EncodeState) -> None:
160
160
  if physical_value is None:
161
161
  odxraise(f"No DTC specified", EncodeError)
@@ -163,7 +163,11 @@ class DtcDop(DopBase):
163
163
 
164
164
  trouble_code = self.convert_to_numerical_trouble_code(physical_value)
165
165
 
166
- internal_trouble_code = int(self.compu_method.convert_physical_to_internal(trouble_code))
166
+ if not isinstance(trouble_code, int):
167
+ odxraise()
168
+ internal_trouble_code = self.compu_method.convert_physical_to_internal(trouble_code)
169
+ if not isinstance(internal_trouble_code, int):
170
+ odxraise()
167
171
 
168
172
  found = False
169
173
  for dtc in self.dtcs:
@@ -178,7 +182,7 @@ class DtcDop(DopBase):
178
182
 
179
183
  self.diag_coded_type.encode_into_pdu(internal_trouble_code, encode_state)
180
184
 
181
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
185
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
182
186
  odxlinks = super()._build_odxlinks()
183
187
 
184
188
  odxlinks.update(self.compu_method._build_odxlinks())
@@ -1,6 +1,7 @@
1
1
  # SPDX-License-Identifier: MIT
2
+ from collections.abc import Sequence
2
3
  from dataclasses import dataclass
3
- from typing import Any, Dict, List, Sequence
4
+ from typing import Any
4
5
  from xml.etree import ElementTree
5
6
 
6
7
  from typing_extensions import override
@@ -33,7 +34,7 @@ class DynamicEndmarkerField(Field):
33
34
 
34
35
  @staticmethod
35
36
  def from_et(et_element: ElementTree.Element,
36
- doc_frags: List[OdxDocFragment]) -> "DynamicEndmarkerField":
37
+ doc_frags: list[OdxDocFragment]) -> "DynamicEndmarkerField":
37
38
  kwargs = dataclass_fields_asdict(Field.from_et(et_element, doc_frags))
38
39
 
39
40
  # ODX 2.0 uses DATA-OBJECT-PROP-REF
@@ -43,7 +44,7 @@ class DynamicEndmarkerField(Field):
43
44
 
44
45
  return DynamicEndmarkerField(dyn_end_dop_ref=dyn_end_dop_ref, **kwargs)
45
46
 
46
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
47
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
47
48
  odxlinks = super()._build_odxlinks()
48
49
  return odxlinks
49
50
 
@@ -102,7 +103,7 @@ class DynamicEndmarkerField(Field):
102
103
  orig_origin = decode_state.origin_byte_position
103
104
  decode_state.origin_byte_position = decode_state.cursor_byte_position
104
105
 
105
- result: List[ParameterValue] = []
106
+ result: list[ParameterValue] = []
106
107
  while True:
107
108
  # check if we're at the end of the PDU
108
109
  if decode_state.cursor_byte_position == len(decode_state.coded_message):
@@ -1,6 +1,7 @@
1
1
  # SPDX-License-Identifier: MIT
2
+ from collections.abc import Sequence
2
3
  from dataclasses import dataclass
3
- from typing import Any, Dict, List, Sequence
4
+ from typing import Any
4
5
  from xml.etree import ElementTree
5
6
 
6
7
  from typing_extensions import override
@@ -24,7 +25,7 @@ class DynamicLengthField(Field):
24
25
 
25
26
  @staticmethod
26
27
  def from_et(et_element: ElementTree.Element,
27
- doc_frags: List[OdxDocFragment]) -> "DynamicLengthField":
28
+ doc_frags: list[OdxDocFragment]) -> "DynamicLengthField":
28
29
  kwargs = dataclass_fields_asdict(Field.from_et(et_element, doc_frags))
29
30
 
30
31
  offset = int(odxrequire(et_element.findtext('OFFSET')))
@@ -36,7 +37,7 @@ class DynamicLengthField(Field):
36
37
  return DynamicLengthField(
37
38
  offset=offset, determine_number_of_items=determine_number_of_items, **kwargs)
38
39
 
39
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
40
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
40
41
  odxlinks = super()._build_odxlinks()
41
42
  odxlinks.update(self.determine_number_of_items._build_odxlinks())
42
43
  return odxlinks
@@ -106,7 +107,7 @@ class DynamicLengthField(Field):
106
107
  decode_state.cursor_bit_position = det_num_items.bit_position or 0
107
108
 
108
109
  n = det_num_items.dop.decode_from_pdu(decode_state)
109
- result: List[ParameterValue] = []
110
+ result: list[ParameterValue] = []
110
111
 
111
112
  if not isinstance(n, int):
112
113
  odxraise(f"Number of items specified by a dynamic length field {self.short_name} "
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import Any, Dict, List
3
+ from typing import Any
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .dyniddefmodeinfo import DynIdDefModeInfo
@@ -10,19 +10,19 @@ from .snrefcontext import SnRefContext
10
10
 
11
11
  @dataclass
12
12
  class DynDefinedSpec:
13
- dyn_id_def_mode_infos: List[DynIdDefModeInfo]
13
+ dyn_id_def_mode_infos: list[DynIdDefModeInfo]
14
14
 
15
15
  @staticmethod
16
16
  def from_et(et_element: ElementTree.Element,
17
- doc_frags: List[OdxDocFragment]) -> "DynDefinedSpec":
17
+ doc_frags: list[OdxDocFragment]) -> "DynDefinedSpec":
18
18
  dyn_id_def_mode_infos = [
19
19
  DynIdDefModeInfo.from_et(x, doc_frags)
20
20
  for x in et_element.iterfind("DYN-ID-DEF-MODE-INFOS/DYN-ID-DEF-MODE-INFO")
21
21
  ]
22
22
  return DynDefinedSpec(dyn_id_def_mode_infos=dyn_id_def_mode_infos)
23
23
 
24
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
25
- result: Dict[OdxLinkId, Any] = {}
24
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
25
+ result: dict[OdxLinkId, Any] = {}
26
26
 
27
27
  for didmi in self.dyn_id_def_mode_infos:
28
28
  result.update(didmi._build_odxlinks())
odxtools/dynenddopref.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import List, Optional, overload
3
+ from typing import Optional, overload
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .exceptions import odxraise, odxrequire
@@ -14,18 +14,18 @@ class DynEndDopRef(OdxLinkRef):
14
14
 
15
15
  @staticmethod
16
16
  @overload
17
- def from_et(et_element: None, source_doc_frags: List[OdxDocFragment]) -> None:
17
+ def from_et(et_element: None, source_doc_frags: list[OdxDocFragment]) -> None:
18
18
  ...
19
19
 
20
20
  @staticmethod
21
21
  @overload
22
22
  def from_et(et_element: ElementTree.Element,
23
- source_doc_frags: List[OdxDocFragment]) -> "DynEndDopRef":
23
+ source_doc_frags: list[OdxDocFragment]) -> "DynEndDopRef":
24
24
  ...
25
25
 
26
26
  @staticmethod
27
- def from_et(et_element: Optional[ElementTree.Element],
28
- source_doc_frags: List[OdxDocFragment]) -> Optional["DynEndDopRef"]:
27
+ def from_et(et_element: ElementTree.Element | None,
28
+ source_doc_frags: list[OdxDocFragment]) -> Optional["DynEndDopRef"]:
29
29
 
30
30
  if et_element is None:
31
31
  odxraise("Mandatory DYN-END-DOP-REF tag is missing")
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import Any, Dict, List, Optional, Union
3
+ from typing import Any
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .diagclasstype import DiagClassType
@@ -16,17 +16,17 @@ from .table import Table
16
16
  class DynIdDefModeInfo:
17
17
  def_mode: str
18
18
 
19
- clear_dyn_def_message_ref: Optional[OdxLinkRef]
20
- clear_dyn_def_message_snref: Optional[str]
19
+ clear_dyn_def_message_ref: OdxLinkRef | None
20
+ clear_dyn_def_message_snref: str | None
21
21
 
22
- read_dyn_def_message_ref: Optional[OdxLinkRef]
23
- read_dyn_def_message_snref: Optional[str]
22
+ read_dyn_def_message_ref: OdxLinkRef | None
23
+ read_dyn_def_message_snref: str | None
24
24
 
25
- dyn_def_message_ref: Optional[OdxLinkRef]
26
- dyn_def_message_snref: Optional[str]
25
+ dyn_def_message_ref: OdxLinkRef | None
26
+ dyn_def_message_snref: str | None
27
27
 
28
- supported_dyn_ids: List[bytes]
29
- selection_table_refs: List[Union[OdxLinkRef, str]]
28
+ supported_dyn_ids: list[bytes]
29
+ selection_table_refs: list[OdxLinkRef | str]
30
30
 
31
31
  @property
32
32
  def clear_dyn_def_message(self) -> DiagComm:
@@ -46,7 +46,7 @@ class DynIdDefModeInfo:
46
46
 
47
47
  @staticmethod
48
48
  def from_et(et_element: ElementTree.Element,
49
- doc_frags: List[OdxDocFragment]) -> "DynIdDefModeInfo":
49
+ doc_frags: list[OdxDocFragment]) -> "DynIdDefModeInfo":
50
50
  def_mode = odxrequire(et_element.findtext("DEF-MODE"))
51
51
 
52
52
  clear_dyn_def_message_ref = OdxLinkRef.from_et(
@@ -71,7 +71,7 @@ class DynIdDefModeInfo:
71
71
  for x in et_element.iterfind("SUPPORTED-DYN-IDS/SUPPORTED-DYN-ID")
72
72
  ]
73
73
 
74
- selection_table_refs: List[Union[OdxLinkRef, str]] = []
74
+ selection_table_refs: list[OdxLinkRef | str] = []
75
75
  if (st_elems := et_element.find("SELECTION-TABLE-REFS")) is not None:
76
76
  for st_elem in st_elems:
77
77
  if st_elem.tag == "SELECTION-TABLE-REF":
@@ -104,8 +104,8 @@ class DynIdDefModeInfo:
104
104
  odxassert(self.dyn_def_message_ref is not None or self.dyn_def_message_snref is not None,
105
105
  "A DYN-DEF-MESSAGE must be specified")
106
106
 
107
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
108
- result: Dict[OdxLinkId, Any] = {}
107
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
108
+ result: dict[OdxLinkId, Any] = {}
109
109
 
110
110
  return result
111
111
 
@@ -1,6 +1,5 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import List, Union
4
3
  from xml.etree import ElementTree
5
4
 
6
5
  from typing_extensions import override
@@ -17,16 +16,16 @@ class EcuVariantPattern(VariantPattern):
17
16
  """ECU variant patterns are variant patterns used to identify the
18
17
  concrete variant of an ECU.
19
18
  """
20
- matching_parameters: List[MatchingParameter]
19
+ matching_parameters: list[MatchingParameter]
21
20
 
22
21
  @override
23
- def get_matching_parameters(
24
- self) -> Union[List[MatchingParameter], List[MatchingBaseVariantParameter]]:
22
+ def get_matching_parameters(self
23
+ ) -> list[MatchingParameter] | list[MatchingBaseVariantParameter]:
25
24
  return self.matching_parameters
26
25
 
27
26
  @staticmethod
28
27
  def from_et(et_element: ElementTree.Element,
29
- doc_frags: List[OdxDocFragment]) -> "EcuVariantPattern":
28
+ doc_frags: list[OdxDocFragment]) -> "EcuVariantPattern":
30
29
 
31
30
  matching_parameters = [
32
31
  MatchingParameter.from_et(mp_el, doc_frags)
odxtools/element.py CHANGED
@@ -1,5 +1,4 @@
1
1
  from dataclasses import dataclass
2
- from typing import List, Optional
3
2
  from xml.etree import ElementTree
4
3
 
5
4
  from .description import Description
@@ -11,11 +10,11 @@ from .utils import dataclass_fields_asdict
11
10
  @dataclass
12
11
  class NamedElement:
13
12
  short_name: str
14
- long_name: Optional[str]
15
- description: Optional[Description]
13
+ long_name: str | None
14
+ description: Description | None
16
15
 
17
16
  @staticmethod
18
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "NamedElement":
17
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "NamedElement":
19
18
 
20
19
  return NamedElement(
21
20
  short_name=odxrequire(et_element.findtext("SHORT-NAME")),
@@ -27,11 +26,11 @@ class NamedElement:
27
26
  @dataclass
28
27
  class IdentifiableElement(NamedElement):
29
28
  odx_id: OdxLinkId
30
- oid: Optional[str]
29
+ oid: str | None
31
30
 
32
31
  @staticmethod
33
32
  def from_et(et_element: ElementTree.Element,
34
- doc_frags: List[OdxDocFragment]) -> "IdentifiableElement":
33
+ doc_frags: list[OdxDocFragment]) -> "IdentifiableElement":
35
34
 
36
35
  kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, doc_frags))
37
36
 
odxtools/encodestate.py CHANGED
@@ -1,7 +1,7 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  import warnings
3
3
  from dataclasses import dataclass, field
4
- from typing import TYPE_CHECKING, Dict, List, Optional, Tuple
4
+ from typing import TYPE_CHECKING
5
5
 
6
6
  from .encoding import Encoding, get_string_encoding
7
7
  from .exceptions import EncodeError, OdxWarning, odxassert, odxraise
@@ -41,20 +41,20 @@ class EncodeState:
41
41
  cursor_bit_position: int = 0
42
42
 
43
43
  #: If encoding a response: request that triggered the response
44
- triggering_request: Optional[bytes] = None
44
+ triggering_request: bytes | None = None
45
45
 
46
46
  #: Mapping from the short name of a length-key parameter to bit
47
47
  #: lengths (specified by LengthKeyParameter)
48
- length_keys: Dict[str, int] = field(default_factory=dict)
48
+ length_keys: dict[str, int] = field(default_factory=dict)
49
49
 
50
50
  #: Mapping from the short name of a table-key parameter to the
51
51
  #: short name of the corresponding row of the table (specified by
52
52
  #: TableKeyParameter)
53
- table_keys: Dict[str, str] = field(default_factory=dict)
53
+ table_keys: dict[str, str] = field(default_factory=dict)
54
54
 
55
55
  #: The cursor position where a given length- or table key is located
56
56
  #: in the PDU
57
- key_pos: Dict[str, int] = field(default_factory=dict)
57
+ key_pos: dict[str, int] = field(default_factory=dict)
58
58
 
59
59
  #: Flag whether we are currently the last parameter of the PDU
60
60
  #: (needed for MinMaxLengthType, EndOfPduField, etc.)
@@ -63,7 +63,7 @@ class EncodeState:
63
63
  #: list of parameters that have been encoded so far. The journal
64
64
  #: is used by some types of parameters which depend on the values of
65
65
  #: other parameters; e.g., environment data description parameters
66
- journal: List[Tuple["Parameter", Optional[ParameterValue]]] = field(default_factory=list)
66
+ journal: list[tuple["Parameter", ParameterValue | None]] = field(default_factory=list)
67
67
 
68
68
  #: If this is True, specifying unknown parameters for encoding
69
69
  #: will raise an OdxError exception in strict mode.
@@ -87,9 +87,9 @@ class EncodeState:
87
87
  internal_value: AtomicOdxType,
88
88
  bit_length: int,
89
89
  base_data_type: DataType,
90
- base_type_encoding: Optional[Encoding],
90
+ base_type_encoding: Encoding | None,
91
91
  is_highlow_byte_order: bool,
92
- used_mask: Optional[bytes],
92
+ used_mask: bytes | None,
93
93
  ) -> None:
94
94
  """Convert the internal_value to bytes and emplace this into the PDU"""
95
95
 
@@ -220,7 +220,7 @@ class EncodeState:
220
220
  odxraise(f"Illegal bit length for a float64 object ({bit_length})")
221
221
  bit_length = 64
222
222
 
223
- raw_value = float(internal_value)
223
+ raw_value = float(internal_value) # type: ignore[arg-type]
224
224
 
225
225
  # If the bit length is zero, encode an empty value
226
226
  if bit_length == 0:
@@ -260,8 +260,8 @@ class EncodeState:
260
260
 
261
261
  def emplace_bytes(self,
262
262
  new_data: bytes,
263
- obj_name: Optional[str] = None,
264
- obj_used_mask: Optional[bytes] = None) -> None:
263
+ obj_name: str | None = None,
264
+ obj_used_mask: bytes | None = None) -> None:
265
265
  if self.cursor_bit_position != 0:
266
266
  odxraise("EncodeState.emplace_bytes can only be called "
267
267
  "for a bit position of 0!", RuntimeError)
odxtools/encoding.py CHANGED
@@ -1,6 +1,5 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from enum import Enum
3
- from typing import Optional
4
3
 
5
4
  from .exceptions import odxraise
6
5
  from .odxtypes import DataType
@@ -23,8 +22,8 @@ class Encoding(Enum):
23
22
  NONE = "NONE"
24
23
 
25
24
 
26
- def get_string_encoding(base_data_type: DataType, base_type_encoding: Optional[Encoding],
27
- is_highlow_byte_order: bool) -> Optional[str]:
25
+ def get_string_encoding(base_data_type: DataType, base_type_encoding: Encoding | None,
26
+ is_highlow_byte_order: bool) -> str | None:
28
27
  """If the encoding is for a string, return the value for
29
28
  `str.encode()`/`str.decode()` to convert the string object
30
29
  to/from a byte array
odxtools/endofpdufield.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
+ from collections.abc import Sequence
2
3
  from dataclasses import dataclass
3
- from typing import List, Optional, Sequence
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from typing_extensions import override
@@ -17,12 +17,12 @@ from .utils import dataclass_fields_asdict
17
17
  @dataclass
18
18
  class EndOfPduField(Field):
19
19
  """End of PDU fields are structures that are repeated until the end of the PDU"""
20
- max_number_of_items: Optional[int]
21
- min_number_of_items: Optional[int]
20
+ max_number_of_items: int | None
21
+ min_number_of_items: int | None
22
22
 
23
23
  @staticmethod
24
24
  def from_et(et_element: ElementTree.Element,
25
- doc_frags: List[OdxDocFragment]) -> "EndOfPduField":
25
+ doc_frags: list[OdxDocFragment]) -> "EndOfPduField":
26
26
  kwargs = dataclass_fields_asdict(Field.from_et(et_element, doc_frags))
27
27
 
28
28
  if (max_n_str := et_element.findtext("MAX-NUMBER-OF-ITEMS")) is not None:
@@ -40,7 +40,7 @@ class EndOfPduField(Field):
40
40
  **kwargs)
41
41
 
42
42
  @override
43
- def encode_into_pdu(self, physical_value: Optional[ParameterValue],
43
+ def encode_into_pdu(self, physical_value: ParameterValue | None,
44
44
  encode_state: EncodeState) -> None:
45
45
  odxassert(not encode_state.cursor_bit_position,
46
46
  "No bit position can be specified for end-of-pdu fields!")
@@ -72,7 +72,7 @@ class EndOfPduField(Field):
72
72
  orig_origin = decode_state.origin_byte_position
73
73
  decode_state.origin_byte_position = decode_state.cursor_byte_position
74
74
 
75
- result: List[ParameterValue] = []
75
+ result: list[ParameterValue] = []
76
76
  while decode_state.cursor_byte_position < len(decode_state.coded_message):
77
77
  # ATTENTION: the ODX specification is very misleading
78
78
  # here: it says that the item is repeated until the end of
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import Any, Dict, List
3
+ from typing import Any
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .element import NamedElement
@@ -27,7 +27,7 @@ class EnvDataConnector(NamedElement):
27
27
 
28
28
  @staticmethod
29
29
  def from_et(et_element: ElementTree.Element,
30
- doc_frags: List[OdxDocFragment]) -> "EnvDataConnector":
30
+ doc_frags: list[OdxDocFragment]) -> "EnvDataConnector":
31
31
  kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, doc_frags))
32
32
 
33
33
  env_data_desc_ref = odxrequire(
@@ -38,7 +38,7 @@ class EnvDataConnector(NamedElement):
38
38
  return EnvDataConnector(
39
39
  env_data_desc_ref=env_data_desc_ref, env_data_snref=env_data_snref, **kwargs)
40
40
 
41
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
41
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
42
42
  return {}
43
43
 
44
44
  def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> 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 .basicstructure import BasicStructure
@@ -20,12 +19,12 @@ class EnvironmentData(BasicStructure):
20
19
  sense, it is quite similar to NRC-CONST parameters.)
21
20
  """
22
21
 
23
- all_value: Optional[bool]
24
- dtc_values: List[int]
22
+ all_value: bool | None
23
+ dtc_values: list[int]
25
24
 
26
25
  @staticmethod
27
26
  def from_et(et_element: ElementTree.Element,
28
- doc_frags: List[OdxDocFragment]) -> "EnvironmentData":
27
+ doc_frags: list[OdxDocFragment]) -> "EnvironmentData":
29
28
  """Reads Environment Data from Diag Layer."""
30
29
  kwargs = dataclass_fields_asdict(BasicStructure.from_et(et_element, doc_frags))
31
30