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/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:
odxtools/physicaltype.py CHANGED
@@ -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 .exceptions import odxraise
@@ -32,20 +31,20 @@ class PhysicalType:
32
31
  PhysicalType(DataType.A_FLOAT64, precision=2)
33
32
  """
34
33
 
35
- precision: Optional[int]
34
+ precision: int | None
36
35
  """Number of digits after the decimal point to display to the user
37
36
  The precision is only applicable if the base data type is A_FLOAT32 or A_FLOAT64.
38
37
  """
39
38
 
40
39
  base_data_type: DataType
41
40
 
42
- display_radix: Optional[Radix]
41
+ display_radix: Radix | None
43
42
  """The display radix defines how integers are displayed to the user.
44
43
  The display radix is only applicable if the base data type is A_UINT32.
45
44
  """
46
45
 
47
46
  @staticmethod
48
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "PhysicalType":
47
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "PhysicalType":
49
48
  precision_str = et_element.findtext("PRECISION")
50
49
  precision = int(precision_str) if precision_str is not None else None
51
50
 
@@ -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 .exceptions import odxrequire
@@ -14,21 +13,21 @@ from .utils import read_hex_binary
14
13
  class PosResponseSuppressible:
15
14
  bit_mask: int
16
15
 
17
- coded_const_snref: Optional[str]
18
- coded_const_snpathref: Optional[str]
16
+ coded_const_snref: str | None
17
+ coded_const_snpathref: str | None
19
18
 
20
- value_snref: Optional[str]
21
- value_snpathref: Optional[str]
19
+ value_snref: str | None
20
+ value_snpathref: str | None
22
21
 
23
- phys_const_snref: Optional[str]
24
- phys_const_snpathref: Optional[str]
22
+ phys_const_snref: str | None
23
+ phys_const_snpathref: str | None
25
24
 
26
- table_key_snref: Optional[str]
27
- table_key_snpathref: Optional[str]
25
+ table_key_snref: str | None
26
+ table_key_snpathref: str | None
28
27
 
29
28
  @staticmethod
30
29
  def from_et(et_element: ElementTree.Element,
31
- doc_frags: List[OdxDocFragment]) -> "PosResponseSuppressible":
30
+ doc_frags: list[OdxDocFragment]) -> "PosResponseSuppressible":
32
31
 
33
32
  bit_mask = odxrequire(read_hex_binary(et_element.find("BIT-MASK")))
34
33
 
@@ -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
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .exceptions import odxassert, odxrequire
@@ -21,10 +21,10 @@ class PreConditionStateRef(OdxLinkRef):
21
21
  """
22
22
  This class represents the PRE-CONDITION-STATE-REF XML tag.
23
23
  """
24
- value: Optional[str]
24
+ value: str | None
25
25
 
26
- in_param_if_snref: Optional[str]
27
- in_param_if_snpathref: Optional[str]
26
+ in_param_if_snref: str | None
27
+ in_param_if_snpathref: str | None
28
28
 
29
29
  @property
30
30
  def state(self) -> "State":
@@ -33,7 +33,7 @@ class PreConditionStateRef(OdxLinkRef):
33
33
  @staticmethod
34
34
  def from_et( # type: ignore[override]
35
35
  et_element: ElementTree.Element,
36
- doc_frags: List[OdxDocFragment]) -> "PreConditionStateRef":
36
+ doc_frags: list[OdxDocFragment]) -> "PreConditionStateRef":
37
37
  kwargs = dataclass_fields_asdict(OdxLinkRef.from_et(et_element, doc_frags))
38
38
 
39
39
  value = et_element.findtext("VALUE")
@@ -57,7 +57,7 @@ class PreConditionStateRef(OdxLinkRef):
57
57
  odxassert(self.in_param_if_snref is not None or self.in_param_if_snref is not None,
58
58
  "If VALUE is specified, a parameter must be referenced")
59
59
 
60
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
60
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
61
61
  return {}
62
62
 
63
63
  def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
@@ -66,7 +66,7 @@ class PreConditionStateRef(OdxLinkRef):
66
66
  def _resolve_snrefs(self, context: SnRefContext) -> None:
67
67
  pass
68
68
 
69
- def applies(self, state_machine: "StateMachine", params: List[Parameter],
69
+ def applies(self, state_machine: "StateMachine", params: list[Parameter],
70
70
  param_value_dict: ParameterValueDict) -> bool:
71
71
  """Given a state machine, evaluate whether the precondition is fulfilled or not
72
72
 
odxtools/progcode.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, cast
3
+ from typing import Any, cast
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .exceptions import odxraise, odxrequire
@@ -14,11 +14,11 @@ from .snrefcontext import SnRefContext
14
14
  class ProgCode:
15
15
  """A reference to code that is executed by a single ECU job"""
16
16
  code_file: str
17
- encryption: Optional[str]
17
+ encryption: str | None
18
18
  syntax: str
19
19
  revision: str
20
- entrypoint: Optional[str]
21
- library_refs: List[OdxLinkRef]
20
+ entrypoint: str | None
21
+ library_refs: list[OdxLinkRef]
22
22
 
23
23
  @property
24
24
  def code(self) -> bytes:
@@ -29,7 +29,7 @@ class ProgCode:
29
29
  return self._libraries
30
30
 
31
31
  @staticmethod
32
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "ProgCode":
32
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "ProgCode":
33
33
  code_file = odxrequire(et_element.findtext("CODE-FILE"))
34
34
  encryption = et_element.findtext("ENCRYPTION")
35
35
  syntax = odxrequire(et_element.findtext("SYNTAX"))
@@ -50,7 +50,7 @@ class ProgCode:
50
50
  library_refs=library_refs,
51
51
  )
52
52
 
53
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
53
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
54
54
  return {}
55
55
 
56
56
  def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
odxtools/protstack.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 .comparamsubset import ComparamSubset
@@ -17,14 +17,14 @@ class ProtStack(IdentifiableElement):
17
17
  # mandatory in ODX 2.2, but non existent in ODX 2.0
18
18
  pdu_protocol_type: str
19
19
  physical_link_type: str
20
- comparam_subset_refs: List[OdxLinkRef]
20
+ comparam_subset_refs: list[OdxLinkRef]
21
21
 
22
22
  @property
23
23
  def comparam_subsets(self) -> NamedItemList[ComparamSubset]:
24
24
  return self._comparam_subsets
25
25
 
26
26
  @staticmethod
27
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "ProtStack":
27
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "ProtStack":
28
28
  kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
29
29
 
30
30
  pdu_protocol_type = odxrequire(et_element.findtext("PDU-PROTOCOL-TYPE"))
@@ -41,7 +41,7 @@ class ProtStack(IdentifiableElement):
41
41
  comparam_subset_refs=comparam_subset_refs,
42
42
  **kwargs)
43
43
 
44
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
44
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
45
45
  result = {self.odx_id: self}
46
46
  return result
47
47
 
@@ -1,6 +1,5 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import List
4
3
  from xml.etree import ElementTree
5
4
 
6
5
  from .exceptions import odxrequire
@@ -15,7 +14,7 @@ class RelatedDiagCommRef(OdxLinkRef):
15
14
  @staticmethod
16
15
  def from_et( # type: ignore[override]
17
16
  et_element: ElementTree.Element,
18
- doc_frags: List[OdxDocFragment]) -> "RelatedDiagCommRef":
17
+ doc_frags: list[OdxDocFragment]) -> "RelatedDiagCommRef":
19
18
  kwargs = dataclass_fields_asdict(odxrequire(OdxLinkRef.from_et(et_element, doc_frags)))
20
19
 
21
20
  relation_type = odxrequire(et_element.findtext("RELATION-TYPE"))
odxtools/relateddoc.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 .description import Description
@@ -11,12 +11,12 @@ from .xdoc import XDoc
11
11
 
12
12
  @dataclass
13
13
  class RelatedDoc:
14
- xdoc: Optional[XDoc]
15
- description: Optional[Description]
14
+ xdoc: XDoc | None
15
+ description: Description | None
16
16
 
17
17
  @staticmethod
18
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "RelatedDoc":
19
- xdoc: Optional[XDoc] = None
18
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "RelatedDoc":
19
+ xdoc: XDoc | None = None
20
20
  if (xdoc_elem := et_element.find("XDOC")) is not None:
21
21
  xdoc = XDoc.from_et(xdoc_elem, doc_frags)
22
22
  description = Description.from_et(et_element.find("DESC"), doc_frags)
@@ -26,7 +26,7 @@ class RelatedDoc:
26
26
  description=description,
27
27
  )
28
28
 
29
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
29
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
30
30
  result = {}
31
31
 
32
32
  if self.xdoc:
odxtools/request.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, cast
3
+ from typing import Any, cast
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .admindata import AdminData
@@ -29,20 +29,20 @@ class Request(IdentifiableElement):
29
29
 
30
30
  This class implements the `CompositeCodec` interface.
31
31
  """
32
- admin_data: Optional[AdminData]
32
+ admin_data: AdminData | None
33
33
  parameters: NamedItemList[Parameter]
34
- sdgs: List[SpecialDataGroup]
34
+ sdgs: list[SpecialDataGroup]
35
35
 
36
36
  @property
37
- def required_parameters(self) -> List[Parameter]:
37
+ def required_parameters(self) -> list[Parameter]:
38
38
  return composite_codec_get_required_parameters(self)
39
39
 
40
40
  @property
41
- def free_parameters(self) -> List[Parameter]:
41
+ def free_parameters(self) -> list[Parameter]:
42
42
  return composite_codec_get_free_parameters(self)
43
43
 
44
44
  @staticmethod
45
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "Request":
45
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "Request":
46
46
  kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
47
47
 
48
48
  admin_data = AdminData.from_et(et_element.find("ADMIN-DATA"), doc_frags)
@@ -56,7 +56,7 @@ class Request(IdentifiableElement):
56
56
 
57
57
  return Request(admin_data=admin_data, parameters=parameters, sdgs=sdgs, **kwargs)
58
58
 
59
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
59
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
60
60
  result = {self.odx_id: self}
61
61
 
62
62
  if self.admin_data is not None:
@@ -96,7 +96,7 @@ class Request(IdentifiableElement):
96
96
  context.request = None
97
97
  context.parameters = None
98
98
 
99
- def get_static_bit_length(self) -> Optional[int]:
99
+ def get_static_bit_length(self) -> int | None:
100
100
  return composite_codec_get_static_bit_length(self)
101
101
 
102
102
  def print_free_parameters_info(self) -> None:
@@ -123,7 +123,7 @@ class Request(IdentifiableElement):
123
123
 
124
124
  return cast(ParameterValueDict, param_values)
125
125
 
126
- def encode_into_pdu(self, physical_value: Optional[ParameterValue],
126
+ def encode_into_pdu(self, physical_value: ParameterValue | None,
127
127
  encode_state: EncodeState) -> None:
128
128
  composite_codec_encode_into_pdu(self, physical_value, encode_state)
129
129
 
odxtools/response.py CHANGED
@@ -1,7 +1,7 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
3
  from enum import Enum
4
- from typing import Any, Dict, List, Optional, cast
4
+ from typing import Any, cast
5
5
  from xml.etree import ElementTree
6
6
 
7
7
  from .admindata import AdminData
@@ -39,12 +39,12 @@ class Response(IdentifiableElement):
39
39
 
40
40
  response_type: ResponseType
41
41
 
42
- admin_data: Optional[AdminData]
42
+ admin_data: AdminData | None
43
43
  parameters: NamedItemList[Parameter]
44
- sdgs: List[SpecialDataGroup]
44
+ sdgs: list[SpecialDataGroup]
45
45
 
46
46
  @staticmethod
47
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "Response":
47
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "Response":
48
48
  """Reads a response."""
49
49
  kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
50
50
 
@@ -70,7 +70,7 @@ class Response(IdentifiableElement):
70
70
  sdgs=sdgs,
71
71
  **kwargs)
72
72
 
73
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
73
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
74
74
  result = {self.odx_id: self}
75
75
 
76
76
  if self.admin_data is not None:
@@ -110,7 +110,7 @@ class Response(IdentifiableElement):
110
110
  context.response = None
111
111
  context.parameters = None
112
112
 
113
- def encode(self, coded_request: Optional[bytes] = None, **kwargs: ParameterValue) -> bytearray:
113
+ def encode(self, coded_request: bytes | None = None, **kwargs: ParameterValue) -> bytearray:
114
114
  encode_state = EncodeState(triggering_request=coded_request, is_end_of_pdu=True)
115
115
 
116
116
  self.encode_into_pdu(physical_value=kwargs, encode_state=encode_state)
@@ -126,22 +126,22 @@ class Response(IdentifiableElement):
126
126
 
127
127
  return cast(ParameterValueDict, param_values)
128
128
 
129
- def encode_into_pdu(self, physical_value: Optional[ParameterValue],
129
+ def encode_into_pdu(self, physical_value: ParameterValue | None,
130
130
  encode_state: EncodeState) -> None:
131
131
  composite_codec_encode_into_pdu(self, physical_value, encode_state)
132
132
 
133
133
  def decode_from_pdu(self, decode_state: DecodeState) -> ParameterValue:
134
134
  return composite_codec_decode_from_pdu(self, decode_state)
135
135
 
136
- def get_static_bit_length(self) -> Optional[int]:
136
+ def get_static_bit_length(self) -> int | None:
137
137
  return composite_codec_get_static_bit_length(self)
138
138
 
139
139
  @property
140
- def required_parameters(self) -> List[Parameter]:
140
+ def required_parameters(self) -> list[Parameter]:
141
141
  return composite_codec_get_required_parameters(self)
142
142
 
143
143
  @property
144
- def free_parameters(self) -> List[Parameter]:
144
+ def free_parameters(self) -> list[Parameter]:
145
145
  return composite_codec_get_free_parameters(self)
146
146
 
147
147
  def print_free_parameters_info(self) -> None:
odxtools/scaleconstr.py CHANGED
@@ -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 .compumethods.limit import Limit
@@ -16,15 +15,15 @@ class ScaleConstr:
16
15
  """This class represents a SCALE-CONSTR.
17
16
  """
18
17
 
19
- short_label: Optional[str]
20
- description: Optional[Description]
18
+ short_label: str | None
19
+ description: Description | None
21
20
  lower_limit: Limit
22
21
  upper_limit: Limit
23
22
  validity: ValidType
24
23
  value_type: DataType
25
24
 
26
25
  @staticmethod
27
- def scale_constr_from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment], *,
26
+ def scale_constr_from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment], *,
28
27
  value_type: DataType) -> "ScaleConstr":
29
28
  short_label = et_element.findtext("SHORT-LABEL")
30
29
  description = Description.from_et(et_element.find("DESC"), doc_frags)
odxtools/servicebinner.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
+ from collections.abc import Iterable, Iterator
2
3
  from io import StringIO
3
- from typing import Dict, Iterable, Iterator, Optional
4
4
 
5
5
  from . import obd, uds
6
6
  from .diagservice import DiagService
@@ -21,7 +21,7 @@ class ServiceBinner:
21
21
  """
22
22
 
23
23
  def __init__(self, services: Iterable[DiagService]):
24
- service_groups: Dict[Optional[int], NamedItemList[DiagService]] = {}
24
+ service_groups: dict[int | None, NamedItemList[DiagService]] = {}
25
25
  for service in services:
26
26
  SID = self.__extract_sid(service)
27
27
 
@@ -32,7 +32,7 @@ class ServiceBinner:
32
32
 
33
33
  self._service_groups = service_groups
34
34
 
35
- def __extract_sid(self, service: DiagService) -> Optional[int]:
35
+ def __extract_sid(self, service: DiagService) -> int | None:
36
36
  # diagnostic services without requests are possible; just like
37
37
  # aircraft without wings...
38
38
  if service.request is None:
@@ -96,10 +96,10 @@ class ServiceBinner:
96
96
 
97
97
  return result.getvalue()
98
98
 
99
- def __iter__(self) -> Iterator[Optional[int]]:
99
+ def __iter__(self) -> Iterator[int | None]:
100
100
  return iter(self._service_groups)
101
101
 
102
- def __getitem__(self, sid: Optional[int]) -> NamedItemList[DiagService]:
102
+ def __getitem__(self, sid: int | None) -> NamedItemList[DiagService]:
103
103
  if sid is None:
104
104
  return self._service_groups.get(sid, NamedItemList())
105
105
 
odxtools/singleecujob.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 .diagcomm import DiagComm
@@ -30,13 +30,13 @@ class SingleEcuJob(DiagComm):
30
30
  standard.
31
31
  """
32
32
 
33
- prog_codes: List[ProgCode]
33
+ prog_codes: list[ProgCode]
34
34
  input_params: NamedItemList[InputParam]
35
35
  output_params: NamedItemList[OutputParam]
36
36
  neg_output_params: NamedItemList[NegOutputParam]
37
37
 
38
38
  @staticmethod
39
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "SingleEcuJob":
39
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "SingleEcuJob":
40
40
  kwargs = dataclass_fields_asdict(DiagComm.from_et(et_element, doc_frags))
41
41
 
42
42
  prog_codes = [
@@ -64,7 +64,7 @@ class SingleEcuJob(DiagComm):
64
64
  neg_output_params=neg_output_params,
65
65
  **kwargs)
66
66
 
67
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
67
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
68
68
  result = super()._build_odxlinks()
69
69
 
70
70
  for prog_code in self.prog_codes:
odxtools/snrefcontext.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import TYPE_CHECKING, List, Optional
3
+ from typing import TYPE_CHECKING, Optional
4
4
 
5
5
  if TYPE_CHECKING:
6
6
  from .database import Database
@@ -25,5 +25,5 @@ class SnRefContext:
25
25
  single_ecu_job: Optional["SingleEcuJob"] = None
26
26
  request: Optional["Request"] = None
27
27
  response: Optional["Response"] = None
28
- parameters: Optional[List["Parameter"]] = None
28
+ parameters: list["Parameter"] | None = None
29
29
  state_chart: Optional["StateChart"] = None
odxtools/specialdata.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 .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId
@@ -10,12 +10,12 @@ from .snrefcontext import SnRefContext
10
10
  @dataclass
11
11
  class SpecialData:
12
12
  """This corresponds to the SD XML tag"""
13
- semantic_info: Optional[str] # the "SI" attribute
14
- text_identifier: Optional[str] # the "TI" attribute, specifies the language used
13
+ semantic_info: str | None # the "SI" attribute
14
+ text_identifier: str | None # the "TI" attribute, specifies the language used
15
15
  value: str
16
16
 
17
17
  @staticmethod
18
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "SpecialData":
18
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "SpecialData":
19
19
  semantic_info = et_element.get("SI")
20
20
  text_identifier = et_element.get("TI")
21
21
  value = et_element.text or ""
@@ -23,7 +23,7 @@ class SpecialData:
23
23
  return SpecialData(
24
24
  semantic_info=semantic_info, text_identifier=text_identifier, value=value)
25
25
 
26
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
26
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
27
27
  return {}
28
28
 
29
29
  def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
@@ -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, Union
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
@@ -12,14 +12,14 @@ from .specialdatagroupcaption import SpecialDataGroupCaption
12
12
  @dataclass
13
13
  class SpecialDataGroup:
14
14
  """This corresponds to the SDG XML tag"""
15
- sdg_caption: Optional[SpecialDataGroupCaption]
16
- sdg_caption_ref: Optional[OdxLinkRef]
17
- values: List[Union["SpecialDataGroup", SpecialData]]
18
- semantic_info: Optional[str] # the "SI" attribute
15
+ sdg_caption: SpecialDataGroupCaption | None
16
+ sdg_caption_ref: OdxLinkRef | None
17
+ values: list[Union["SpecialDataGroup", SpecialData]]
18
+ semantic_info: str | None # the "SI" attribute
19
19
 
20
20
  @staticmethod
21
21
  def from_et(et_element: ElementTree.Element,
22
- doc_frags: List[OdxDocFragment]) -> "SpecialDataGroup":
22
+ doc_frags: list[OdxDocFragment]) -> "SpecialDataGroup":
23
23
 
24
24
  sdg_caption = None
25
25
  if caption_elem := et_element.find("SDG-CAPTION"):
@@ -31,9 +31,9 @@ class SpecialDataGroup:
31
31
 
32
32
  semantic_info = et_element.get("SI")
33
33
 
34
- values: List[Union[SpecialData, SpecialDataGroup]] = []
34
+ values: list[SpecialData | SpecialDataGroup] = []
35
35
  for value_elem in et_element:
36
- next_entry: Optional[Union[SpecialData, SpecialDataGroup]] = None
36
+ next_entry: SpecialData | SpecialDataGroup | None = None
37
37
  if value_elem.tag == "SDG":
38
38
  next_entry = SpecialDataGroup.from_et(value_elem, doc_frags)
39
39
  elif value_elem.tag == "SD":
@@ -49,7 +49,7 @@ class SpecialDataGroup:
49
49
  values=values,
50
50
  )
51
51
 
52
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
52
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
53
53
  result = {}
54
54
 
55
55
  if self.sdg_caption_ref is None and self.sdg_caption is not None: