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
@@ -1,9 +1,10 @@
1
1
  # SPDX-License-Identifier: MIT
2
+ from collections.abc import Callable, Iterable
2
3
  from copy import copy, deepcopy
3
4
  from dataclasses import dataclass
4
5
  from functools import cached_property
5
6
  from itertools import chain
6
- from typing import Any, Callable, Dict, Iterable, List, Optional, Union, cast
7
+ from typing import Any, Union, cast
7
8
  from xml.etree import ElementTree
8
9
 
9
10
  from ..admindata import AdminData
@@ -29,7 +30,7 @@ from ..unitgroup import UnitGroup
29
30
  from .diaglayerraw import DiagLayerRaw
30
31
  from .diaglayertype import DiagLayerType
31
32
 
32
- PrefixTree = Dict[int, Union[List[DiagService], "PrefixTree"]]
33
+ PrefixTree = dict[int, Union[list[DiagService], "PrefixTree"]]
33
34
 
34
35
 
35
36
  @dataclass
@@ -44,7 +45,7 @@ class DiagLayer:
44
45
  diag_layer_raw: DiagLayerRaw
45
46
 
46
47
  @staticmethod
47
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "DiagLayer":
48
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "DiagLayer":
48
49
  diag_layer_raw = DiagLayerRaw.from_et(et_element, doc_frags)
49
50
 
50
51
  # Create DiagLayer
@@ -72,7 +73,7 @@ class DiagLayer:
72
73
  else:
73
74
  self._diag_data_dictionary_spec = self.diag_layer_raw.diag_data_dictionary_spec
74
75
 
75
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
76
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
76
77
  """Construct a mapping from IDs to all objects that are contained in this diagnostic layer."""
77
78
  result = self.diag_layer_raw._build_odxlinks()
78
79
 
@@ -91,7 +92,7 @@ class DiagLayer:
91
92
  # reference. This mechanism can thus be seen as a kind of
92
93
  # "poor man's inheritance".
93
94
  if self.import_refs:
94
- imported_links: Dict[OdxLinkId, Any] = {}
95
+ imported_links: dict[OdxLinkId, Any] = {}
95
96
  for import_ref in self.import_refs:
96
97
  imported_dl = odxlinks.resolve(import_ref, DiagLayer)
97
98
 
@@ -168,7 +169,7 @@ class DiagLayer:
168
169
  """
169
170
  return get_local_objects(self)
170
171
 
171
- def __deepcopy__(self, memo: Dict[int, Any]) -> Any:
172
+ def __deepcopy__(self, memo: dict[int, Any]) -> Any:
172
173
  """Create a deep copy of the diagnostic layer
173
174
 
174
175
  Note that the copied diagnostic layer is not fully
@@ -210,15 +211,15 @@ class DiagLayer:
210
211
  return self.diag_layer_raw.short_name
211
212
 
212
213
  @property
213
- def long_name(self) -> Optional[str]:
214
+ def long_name(self) -> str | None:
214
215
  return self.diag_layer_raw.long_name
215
216
 
216
217
  @property
217
- def description(self) -> Optional[Description]:
218
+ def description(self) -> Description | None:
218
219
  return self.diag_layer_raw.description
219
220
 
220
221
  @property
221
- def admin_data(self) -> Optional[AdminData]:
222
+ def admin_data(self) -> AdminData | None:
222
223
  return self.diag_layer_raw.admin_data
223
224
 
224
225
  @property
@@ -258,7 +259,7 @@ class DiagLayer:
258
259
  return self.diag_layer_raw.global_negative_responses
259
260
 
260
261
  @property
261
- def import_refs(self) -> List[OdxLinkRef]:
262
+ def import_refs(self) -> list[OdxLinkRef]:
262
263
  return self.diag_layer_raw.import_refs
263
264
 
264
265
  @property
@@ -270,7 +271,7 @@ class DiagLayer:
270
271
  return self.diag_layer_raw.sub_components
271
272
 
272
273
  @property
273
- def sdgs(self) -> List[SpecialDataGroup]:
274
+ def sdgs(self) -> list[SpecialDataGroup]:
274
275
  return self.diag_layer_raw.sdgs
275
276
 
276
277
  @property
@@ -359,13 +360,13 @@ class DiagLayer:
359
360
  if sub_tree.get(-1) is None:
360
361
  sub_tree[-1] = [service]
361
362
  else:
362
- cast(List[DiagService], sub_tree[-1]).append(service)
363
+ cast(list[DiagService], sub_tree[-1]).append(service)
363
364
 
364
- def _find_services_for_uds(self, message: bytes) -> List[DiagService]:
365
+ def _find_services_for_uds(self, message: bytes) -> list[DiagService]:
365
366
  prefix_tree = self._prefix_tree
366
367
 
367
368
  # Find matching service(s) in prefix tree
368
- possible_services: List[DiagService] = []
369
+ possible_services: list[DiagService] = []
369
370
  for b in message:
370
371
  if b in prefix_tree:
371
372
  odxassert(isinstance(prefix_tree[b], dict))
@@ -373,11 +374,11 @@ class DiagLayer:
373
374
  else:
374
375
  break
375
376
  if -1 in prefix_tree:
376
- possible_services += cast(List[DiagService], prefix_tree[-1])
377
+ possible_services += cast(list[DiagService], prefix_tree[-1])
377
378
  return possible_services
378
379
 
379
- def _decode(self, message: bytes, candidate_services: Iterable[DiagService]) -> List[Message]:
380
- decoded_messages: List[Message] = []
380
+ def _decode(self, message: bytes, candidate_services: Iterable[DiagService]) -> list[Message]:
381
+ decoded_messages: list[Message] = []
381
382
 
382
383
  for service in candidate_services:
383
384
  try:
@@ -415,12 +416,12 @@ class DiagLayer:
415
416
 
416
417
  return decoded_messages
417
418
 
418
- def decode(self, message: bytes) -> List[Message]:
419
+ def decode(self, message: bytes) -> list[Message]:
419
420
  candidate_services = self._find_services_for_uds(message)
420
421
 
421
422
  return self._decode(message, candidate_services)
422
423
 
423
- def decode_response(self, response: bytes, request: bytes) -> List[Message]:
424
+ def decode_response(self, response: bytes, request: bytes) -> list[Message]:
424
425
  candidate_services = self._find_services_for_uds(request)
425
426
  if candidate_services is None:
426
427
  raise DecodeError(f"Couldn't find corresponding service for request {request.hex()}.")
@@ -1,7 +1,7 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from copy import copy
3
3
  from dataclasses import dataclass
4
- from typing import Any, Dict, List, Optional, Union, cast
4
+ from typing import Any, cast
5
5
  from xml.etree import ElementTree
6
6
 
7
7
  from ..additionalaudience import AdditionalAudience
@@ -36,21 +36,21 @@ class DiagLayerRaw(IdentifiableElement):
36
36
  """
37
37
 
38
38
  variant_type: DiagLayerType
39
- admin_data: Optional[AdminData]
39
+ admin_data: AdminData | None
40
40
  company_datas: NamedItemList[CompanyData]
41
41
  functional_classes: NamedItemList[FunctionalClass]
42
- diag_data_dictionary_spec: Optional[DiagDataDictionarySpec]
43
- diag_comms_raw: List[Union[OdxLinkRef, DiagComm]]
42
+ diag_data_dictionary_spec: DiagDataDictionarySpec | None
43
+ diag_comms_raw: list[OdxLinkRef | DiagComm]
44
44
  requests: NamedItemList[Request]
45
45
  positive_responses: NamedItemList[Response]
46
46
  negative_responses: NamedItemList[Response]
47
47
  global_negative_responses: NamedItemList[Response]
48
- import_refs: List[OdxLinkRef]
48
+ import_refs: list[OdxLinkRef]
49
49
  state_charts: NamedItemList[StateChart]
50
50
  additional_audiences: NamedItemList[AdditionalAudience]
51
51
  sub_components: NamedItemList[SubComponent]
52
52
  libraries: NamedItemList[Library]
53
- sdgs: List[SpecialDataGroup]
53
+ sdgs: list[SpecialDataGroup]
54
54
 
55
55
  @property
56
56
  def diag_comms(self) -> NamedItemList[DiagComm]:
@@ -70,7 +70,7 @@ class DiagLayerRaw(IdentifiableElement):
70
70
  return self._single_ecu_jobs
71
71
 
72
72
  @staticmethod
73
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "DiagLayerRaw":
73
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "DiagLayerRaw":
74
74
  try:
75
75
  variant_type = DiagLayerType(et_element.tag)
76
76
  except ValueError:
@@ -102,10 +102,10 @@ class DiagLayerRaw(IdentifiableElement):
102
102
  if (ddds_elem := et_element.find("DIAG-DATA-DICTIONARY-SPEC")) is not None:
103
103
  diag_data_dictionary_spec = DiagDataDictionarySpec.from_et(ddds_elem, doc_frags)
104
104
 
105
- diag_comms_raw: List[Union[OdxLinkRef, DiagComm]] = []
105
+ diag_comms_raw: list[OdxLinkRef | DiagComm] = []
106
106
  if (dc_elems := et_element.find("DIAG-COMMS")) is not None:
107
107
  for dc_proxy_elem in dc_elems:
108
- dc: Union[OdxLinkRef, DiagComm]
108
+ dc: OdxLinkRef | DiagComm
109
109
  if dc_proxy_elem.tag == "DIAG-COMM-REF":
110
110
  dc = OdxLinkRef.from_et(dc_proxy_elem, doc_frags)
111
111
  elif dc_proxy_elem.tag == "DIAG-SERVICE":
@@ -183,7 +183,7 @@ class DiagLayerRaw(IdentifiableElement):
183
183
  sdgs=sdgs,
184
184
  **kwargs)
185
185
 
186
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
186
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
187
187
  """Construct a mapping from IDs to all objects that are contained in this diagnostic layer."""
188
188
  odxlinks = {self.odx_id: self}
189
189
 
@@ -1,6 +1,5 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from enum import Enum
3
- from typing import Dict
4
3
 
5
4
 
6
5
  class DiagLayerType(Enum):
@@ -19,7 +18,7 @@ class DiagLayerType(Enum):
19
18
 
20
19
  """
21
20
 
22
- PRIORITY_OF_DIAG_LAYER_TYPE: Dict[DiagLayerType, int] = {
21
+ PRIORITY_OF_DIAG_LAYER_TYPE: dict[DiagLayerType, int] = {
23
22
  DiagLayerType.PROTOCOL:
24
23
  1,
25
24
  DiagLayerType.FUNCTIONAL_GROUP:
@@ -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, Union, cast
4
+ from typing import TYPE_CHECKING, Any, cast
5
5
  from xml.etree import ElementTree
6
6
 
7
7
  from ..diagvariable import DiagVariable
@@ -27,7 +27,7 @@ class EcuSharedData(DiagLayer):
27
27
  return cast(EcuSharedDataRaw, self.diag_layer_raw)
28
28
 
29
29
  @property
30
- def diag_variables_raw(self) -> List[Union[OdxLinkRef, DiagVariable]]:
30
+ def diag_variables_raw(self) -> list[OdxLinkRef | DiagVariable]:
31
31
  return self.ecu_shared_data_raw.diag_variables_raw
32
32
 
33
33
  @property
@@ -40,7 +40,7 @@ class EcuSharedData(DiagLayer):
40
40
 
41
41
  @staticmethod
42
42
  def from_et(et_element: ElementTree.Element,
43
- doc_frags: List[OdxDocFragment]) -> "EcuSharedData":
43
+ doc_frags: list[OdxDocFragment]) -> "EcuSharedData":
44
44
  ecu_shared_data_raw = EcuSharedDataRaw.from_et(et_element, doc_frags)
45
45
 
46
46
  return EcuSharedData(diag_layer_raw=ecu_shared_data_raw)
@@ -78,7 +78,7 @@ class EcuSharedData(DiagLayer):
78
78
  self._resolve_snrefs(context)
79
79
  context.diag_layer = None
80
80
 
81
- def __deepcopy__(self, memo: Dict[int, Any]) -> Any:
81
+ def __deepcopy__(self, memo: dict[int, Any]) -> Any:
82
82
  """Create a deep copy of the protocol layer
83
83
 
84
84
  Note that the copied diagnostic layer is not fully
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import Any, Dict, List, Union
3
+ from typing import Any
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from ..diagvariable import DiagVariable
@@ -18,7 +18,7 @@ class EcuSharedDataRaw(DiagLayerRaw):
18
18
  """This is a diagnostic layer for data shared accross others
19
19
  """
20
20
 
21
- diag_variables_raw: List[Union[DiagVariable, OdxLinkRef]]
21
+ diag_variables_raw: list[DiagVariable | OdxLinkRef]
22
22
  variable_groups: NamedItemList[VariableGroup]
23
23
 
24
24
  @property
@@ -27,7 +27,7 @@ class EcuSharedDataRaw(DiagLayerRaw):
27
27
 
28
28
  @staticmethod
29
29
  def from_et(et_element: ElementTree.Element,
30
- doc_frags: List[OdxDocFragment]) -> "EcuSharedDataRaw":
30
+ doc_frags: list[OdxDocFragment]) -> "EcuSharedDataRaw":
31
31
  # objects contained by diagnostic layers exibit an additional
32
32
  # document fragment for the diag layer, so we use the document
33
33
  # fragments of the odx id of the diag layer for IDs of
@@ -36,10 +36,10 @@ class EcuSharedDataRaw(DiagLayerRaw):
36
36
  kwargs = dataclass_fields_asdict(dlr)
37
37
  doc_frags = dlr.odx_id.doc_fragments
38
38
 
39
- diag_variables_raw: List[Union[DiagVariable, OdxLinkRef]] = []
39
+ diag_variables_raw: list[DiagVariable | OdxLinkRef] = []
40
40
  if (dv_elems := et_element.find("DIAG-VARIABLES")) is not None:
41
41
  for dv_proxy_elem in dv_elems:
42
- dv_proxy: Union[OdxLinkRef, DiagVariable]
42
+ dv_proxy: OdxLinkRef | DiagVariable
43
43
  if dv_proxy_elem.tag == "DIAG-VARIABLE-REF":
44
44
  dv_proxy = OdxLinkRef.from_et(dv_proxy_elem, doc_frags)
45
45
  elif dv_proxy_elem.tag == "DIAG-VARIABLE":
@@ -58,7 +58,7 @@ class EcuSharedDataRaw(DiagLayerRaw):
58
58
  return EcuSharedDataRaw(
59
59
  diag_variables_raw=diag_variables_raw, variable_groups=variable_groups, **kwargs)
60
60
 
61
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
61
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
62
62
  result = super()._build_odxlinks()
63
63
  for dv_proxy in self.diag_variables_raw:
64
64
  if not isinstance(dv_proxy, OdxLinkRef):
@@ -1,7 +1,8 @@
1
1
  # SPDX-License-Identifier: MIT
2
+ from collections.abc import Iterable
2
3
  from copy import deepcopy
3
4
  from dataclasses import dataclass
4
- from typing import Any, Dict, Iterable, List, Optional, Union, cast
5
+ from typing import Any, cast
5
6
  from xml.etree import ElementTree
6
7
 
7
8
  from typing_extensions import override
@@ -28,19 +29,19 @@ class EcuVariant(HierarchyElement):
28
29
  return cast(EcuVariantRaw, self.diag_layer_raw)
29
30
 
30
31
  @property
31
- def diag_variables_raw(self) -> List[Union[DiagVariable, OdxLinkRef]]:
32
+ def diag_variables_raw(self) -> list[DiagVariable | OdxLinkRef]:
32
33
  return self.ecu_variant_raw.diag_variables_raw
33
34
 
34
35
  @property
35
- def dyn_defined_spec(self) -> Optional[DynDefinedSpec]:
36
+ def dyn_defined_spec(self) -> DynDefinedSpec | None:
36
37
  return self.ecu_variant_raw.dyn_defined_spec
37
38
 
38
39
  @property
39
- def parent_refs(self) -> List[ParentRef]:
40
+ def parent_refs(self) -> list[ParentRef]:
40
41
  return self.ecu_variant_raw.parent_refs
41
42
 
42
43
  @property
43
- def base_variant(self) -> Optional[BaseVariant]:
44
+ def base_variant(self) -> BaseVariant | None:
44
45
  """Return the base variant for the ECU variant
45
46
 
46
47
  The ODX specification allows at a single base variant for each
@@ -55,7 +56,7 @@ class EcuVariant(HierarchyElement):
55
56
  return None
56
57
 
57
58
  @property
58
- def ecu_variant_patterns(self) -> List[EcuVariantPattern]:
59
+ def ecu_variant_patterns(self) -> list[EcuVariantPattern]:
59
60
  return self.ecu_variant_raw.ecu_variant_patterns
60
61
 
61
62
  #######
@@ -74,7 +75,7 @@ class EcuVariant(HierarchyElement):
74
75
  #######
75
76
 
76
77
  @staticmethod
77
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "EcuVariant":
78
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "EcuVariant":
78
79
  ecu_variant_raw = EcuVariantRaw.from_et(et_element, doc_frags)
79
80
 
80
81
  return EcuVariant(diag_layer_raw=ecu_variant_raw)
@@ -87,7 +88,7 @@ class EcuVariant(HierarchyElement):
87
88
  "The raw diagnostic layer passed to EcuVariant "
88
89
  "must be a EcuVariantRaw")
89
90
 
90
- def __deepcopy__(self, memo: Dict[int, Any]) -> Any:
91
+ def __deepcopy__(self, memo: dict[int, Any]) -> Any:
91
92
  """Create a deep copy of the ECU variant
92
93
 
93
94
  Note that the copied diagnostic layer is not fully
@@ -120,7 +121,7 @@ class EcuVariant(HierarchyElement):
120
121
 
121
122
  return dl.diag_layer_raw.diag_variables
122
123
 
123
- def not_inherited_fn(parent_ref: ParentRef) -> List[str]:
124
+ def not_inherited_fn(parent_ref: ParentRef) -> list[str]:
124
125
  return parent_ref.not_inherited_variables
125
126
 
126
127
  return self._compute_available_objects(get_local_objects_fn, not_inherited_fn)
@@ -134,7 +135,7 @@ class EcuVariant(HierarchyElement):
134
135
 
135
136
  return dl.diag_layer_raw.variable_groups
136
137
 
137
- def not_inherited_fn(parent_ref: ParentRef) -> List[str]:
138
+ def not_inherited_fn(parent_ref: ParentRef) -> list[str]:
138
139
  return []
139
140
 
140
141
  return self._compute_available_objects(get_local_objects_fn, not_inherited_fn)
@@ -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 ..diagvariable import DiagVariable
@@ -18,11 +18,11 @@ from .hierarchyelementraw import HierarchyElementRaw
18
18
 
19
19
  @dataclass
20
20
  class EcuVariantRaw(HierarchyElementRaw):
21
- diag_variables_raw: List[Union[DiagVariable, OdxLinkRef]]
21
+ diag_variables_raw: list[DiagVariable | OdxLinkRef]
22
22
  variable_groups: NamedItemList[VariableGroup]
23
- ecu_variant_patterns: List[EcuVariantPattern]
24
- dyn_defined_spec: Optional[DynDefinedSpec]
25
- parent_refs: List[ParentRef]
23
+ ecu_variant_patterns: list[EcuVariantPattern]
24
+ dyn_defined_spec: DynDefinedSpec | None
25
+ parent_refs: list[ParentRef]
26
26
 
27
27
  @property
28
28
  def diag_variables(self) -> NamedItemList[DiagVariable]:
@@ -30,7 +30,7 @@ class EcuVariantRaw(HierarchyElementRaw):
30
30
 
31
31
  @staticmethod
32
32
  def from_et(et_element: ElementTree.Element,
33
- doc_frags: List[OdxDocFragment]) -> "EcuVariantRaw":
33
+ doc_frags: list[OdxDocFragment]) -> "EcuVariantRaw":
34
34
  # objects contained by diagnostic layers exibit an additional
35
35
  # document fragment for the diag layer, so we use the document
36
36
  # fragments of the odx id of the diag layer for IDs of
@@ -39,10 +39,10 @@ class EcuVariantRaw(HierarchyElementRaw):
39
39
  kwargs = dataclass_fields_asdict(her)
40
40
  doc_frags = her.odx_id.doc_fragments
41
41
 
42
- diag_variables_raw: List[Union[DiagVariable, OdxLinkRef]] = []
42
+ diag_variables_raw: list[DiagVariable | OdxLinkRef] = []
43
43
  if (dv_elems := et_element.find("DIAG-VARIABLES")) is not None:
44
44
  for dv_proxy_elem in dv_elems:
45
- dv_proxy: Union[OdxLinkRef, DiagVariable]
45
+ dv_proxy: OdxLinkRef | DiagVariable
46
46
  if dv_proxy_elem.tag == "DIAG-VARIABLE-REF":
47
47
  dv_proxy = OdxLinkRef.from_et(dv_proxy_elem, doc_frags)
48
48
  elif dv_proxy_elem.tag == "DIAG-VARIABLE":
@@ -81,7 +81,7 @@ class EcuVariantRaw(HierarchyElementRaw):
81
81
  parent_refs=parent_refs,
82
82
  **kwargs)
83
83
 
84
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
84
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
85
85
  result = super()._build_odxlinks()
86
86
 
87
87
  for dv_proxy in self.diag_variables_raw:
@@ -1,7 +1,8 @@
1
1
  # SPDX-License-Identifier: MIT
2
+ from collections.abc import Iterable
2
3
  from copy import deepcopy
3
4
  from dataclasses import dataclass
4
- from typing import Any, Dict, Iterable, List, Union, cast
5
+ from typing import Any, cast
5
6
  from xml.etree import ElementTree
6
7
 
7
8
  from typing_extensions import override
@@ -27,7 +28,7 @@ class FunctionalGroup(HierarchyElement):
27
28
  return cast(FunctionalGroupRaw, self.diag_layer_raw)
28
29
 
29
30
  @property
30
- def diag_variables_raw(self) -> List[Union[DiagVariable, OdxLinkRef]]:
31
+ def diag_variables_raw(self) -> list[DiagVariable | OdxLinkRef]:
31
32
  return self.functional_group_raw.diag_variables_raw
32
33
 
33
34
  @property
@@ -39,12 +40,12 @@ class FunctionalGroup(HierarchyElement):
39
40
  return self._variable_groups
40
41
 
41
42
  @property
42
- def parent_refs(self) -> List[ParentRef]:
43
+ def parent_refs(self) -> list[ParentRef]:
43
44
  return self.functional_group_raw.parent_refs
44
45
 
45
46
  @staticmethod
46
47
  def from_et(et_element: ElementTree.Element,
47
- doc_frags: List[OdxDocFragment]) -> "FunctionalGroup":
48
+ doc_frags: list[OdxDocFragment]) -> "FunctionalGroup":
48
49
  functional_group_raw = FunctionalGroupRaw.from_et(et_element, doc_frags)
49
50
 
50
51
  return FunctionalGroup(diag_layer_raw=functional_group_raw)
@@ -73,7 +74,7 @@ class FunctionalGroup(HierarchyElement):
73
74
 
74
75
  return dl.diag_layer_raw.diag_variables # type: ignore[no-any-return]
75
76
 
76
- def not_inherited_fn(parent_ref: ParentRef) -> List[str]:
77
+ def not_inherited_fn(parent_ref: ParentRef) -> list[str]:
77
78
  return parent_ref.not_inherited_variables
78
79
 
79
80
  return self._compute_available_objects(get_local_objects_fn, not_inherited_fn)
@@ -87,12 +88,12 @@ class FunctionalGroup(HierarchyElement):
87
88
 
88
89
  return dl.diag_layer_raw.variable_groups # type: ignore[no-any-return]
89
90
 
90
- def not_inherited_fn(parent_ref: ParentRef) -> List[str]:
91
+ def not_inherited_fn(parent_ref: ParentRef) -> list[str]:
91
92
  return []
92
93
 
93
94
  return self._compute_available_objects(get_local_objects_fn, not_inherited_fn)
94
95
 
95
- def __deepcopy__(self, memo: Dict[int, Any]) -> Any:
96
+ def __deepcopy__(self, memo: dict[int, Any]) -> Any:
96
97
  """Create a deep copy of the functional group layer
97
98
 
98
99
  Note that the copied diagnostic layer is not fully
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import Any, Dict, List, Union
3
+ from typing import Any
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from ..diagvariable import DiagVariable
@@ -19,9 +19,9 @@ class FunctionalGroupRaw(HierarchyElementRaw):
19
19
  """This is a diagnostic layer for common functionality of an ECU
20
20
  """
21
21
 
22
- diag_variables_raw: List[Union[DiagVariable, OdxLinkRef]]
22
+ diag_variables_raw: list[DiagVariable | OdxLinkRef]
23
23
  variable_groups: NamedItemList[VariableGroup]
24
- parent_refs: List[ParentRef]
24
+ parent_refs: list[ParentRef]
25
25
 
26
26
  @property
27
27
  def diag_variables(self) -> NamedItemList[DiagVariable]:
@@ -29,7 +29,7 @@ class FunctionalGroupRaw(HierarchyElementRaw):
29
29
 
30
30
  @staticmethod
31
31
  def from_et(et_element: ElementTree.Element,
32
- doc_frags: List[OdxDocFragment]) -> "FunctionalGroupRaw":
32
+ doc_frags: list[OdxDocFragment]) -> "FunctionalGroupRaw":
33
33
  # objects contained by diagnostic layers exibit an additional
34
34
  # document fragment for the diag layer, so we use the document
35
35
  # fragments of the odx id of the diag layer for IDs of
@@ -38,10 +38,10 @@ class FunctionalGroupRaw(HierarchyElementRaw):
38
38
  kwargs = dataclass_fields_asdict(her)
39
39
  doc_frags = her.odx_id.doc_fragments
40
40
 
41
- diag_variables_raw: List[Union[DiagVariable, OdxLinkRef]] = []
41
+ diag_variables_raw: list[DiagVariable | OdxLinkRef] = []
42
42
  if (dv_elems := et_element.find("DIAG-VARIABLES")) is not None:
43
43
  for dv_proxy_elem in dv_elems:
44
- dv_proxy: Union[OdxLinkRef, DiagVariable]
44
+ dv_proxy: OdxLinkRef | DiagVariable
45
45
  if dv_proxy_elem.tag == "DIAG-VARIABLE-REF":
46
46
  dv_proxy = OdxLinkRef.from_et(dv_proxy_elem, doc_frags)
47
47
  elif dv_proxy_elem.tag == "DIAG-VARIABLE":
@@ -67,7 +67,7 @@ class FunctionalGroupRaw(HierarchyElementRaw):
67
67
  parent_refs=parent_refs,
68
68
  **kwargs)
69
69
 
70
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
70
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
71
71
  result = super()._build_odxlinks()
72
72
 
73
73
  for dv_proxy in self.diag_variables_raw: