odxtools 9.6.1__py3-none-any.whl → 10.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. odxtools/additionalaudience.py +3 -3
  2. odxtools/addressing.py +8 -0
  3. odxtools/admindata.py +8 -8
  4. odxtools/audience.py +10 -10
  5. odxtools/basecomparam.py +7 -20
  6. odxtools/basevariantpattern.py +4 -5
  7. odxtools/basicstructure.py +12 -11
  8. odxtools/cli/_print_utils.py +35 -23
  9. odxtools/cli/browse.py +9 -9
  10. odxtools/cli/compare.py +24 -24
  11. odxtools/cli/decode.py +3 -4
  12. odxtools/cli/find.py +4 -5
  13. odxtools/cli/list.py +7 -7
  14. odxtools/cli/main.py +2 -2
  15. odxtools/cli/snoop.py +3 -3
  16. odxtools/codec.py +3 -186
  17. odxtools/commrelation.py +12 -19
  18. odxtools/commrelationvaluetype.py +9 -0
  19. odxtools/companydata.py +5 -5
  20. odxtools/companydocinfo.py +8 -8
  21. odxtools/companyrevisioninfo.py +5 -5
  22. odxtools/companyspecificinfo.py +5 -5
  23. odxtools/comparam.py +3 -3
  24. odxtools/comparaminstance.py +10 -10
  25. odxtools/comparamspec.py +3 -3
  26. odxtools/comparamsubset.py +5 -5
  27. odxtools/complexcomparam.py +7 -7
  28. odxtools/compositecodec.py +191 -0
  29. odxtools/compumethods/compucategory.py +13 -0
  30. odxtools/compumethods/compucodecompumethod.py +6 -5
  31. odxtools/compumethods/compuconst.py +4 -5
  32. odxtools/compumethods/compudefaultvalue.py +1 -2
  33. odxtools/compumethods/compuinternaltophys.py +6 -6
  34. odxtools/compumethods/compumethod.py +6 -17
  35. odxtools/compumethods/compuphystointernal.py +6 -6
  36. odxtools/compumethods/compurationalcoeffs.py +4 -4
  37. odxtools/compumethods/compuscale.py +9 -10
  38. odxtools/compumethods/createanycompumethod.py +1 -2
  39. odxtools/compumethods/identicalcompumethod.py +1 -2
  40. odxtools/compumethods/intervaltype.py +8 -0
  41. odxtools/compumethods/limit.py +13 -19
  42. odxtools/compumethods/linearcompumethod.py +4 -3
  43. odxtools/compumethods/linearsegment.py +14 -15
  44. odxtools/compumethods/ratfunccompumethod.py +5 -4
  45. odxtools/compumethods/ratfuncsegment.py +7 -8
  46. odxtools/compumethods/scalelinearcompumethod.py +10 -9
  47. odxtools/compumethods/scaleratfunccompumethod.py +6 -5
  48. odxtools/compumethods/tabintpcompumethod.py +19 -20
  49. odxtools/compumethods/texttablecompumethod.py +5 -4
  50. odxtools/createanycomparam.py +2 -4
  51. odxtools/createanydiagcodedtype.py +1 -2
  52. odxtools/database.py +9 -8
  53. odxtools/dataobjectproperty.py +10 -10
  54. odxtools/decodestate.py +5 -5
  55. odxtools/description.py +6 -22
  56. odxtools/determinenumberofitems.py +4 -4
  57. odxtools/diagclasstype.py +11 -0
  58. odxtools/diagcodedtype.py +7 -7
  59. odxtools/diagcomm.py +19 -42
  60. odxtools/diagdatadictionaryspec.py +6 -6
  61. odxtools/diaglayercontainer.py +4 -4
  62. odxtools/diaglayers/basevariant.py +10 -9
  63. odxtools/diaglayers/basevariantraw.py +9 -9
  64. odxtools/diaglayers/diaglayer.py +20 -19
  65. odxtools/diaglayers/diaglayerraw.py +10 -10
  66. odxtools/diaglayers/diaglayertype.py +1 -2
  67. odxtools/diaglayers/ecushareddata.py +4 -4
  68. odxtools/diaglayers/ecushareddataraw.py +6 -6
  69. odxtools/diaglayers/ecuvariant.py +11 -10
  70. odxtools/diaglayers/ecuvariantraw.py +9 -9
  71. odxtools/diaglayers/functionalgroup.py +8 -7
  72. odxtools/diaglayers/functionalgroupraw.py +7 -7
  73. odxtools/diaglayers/hierarchyelement.py +43 -49
  74. odxtools/diaglayers/hierarchyelementraw.py +4 -4
  75. odxtools/diaglayers/protocol.py +4 -4
  76. odxtools/diaglayers/protocolraw.py +6 -6
  77. odxtools/diagnostictroublecode.py +8 -8
  78. odxtools/diagservice.py +21 -97
  79. odxtools/diagvariable.py +14 -14
  80. odxtools/docrevision.py +11 -11
  81. odxtools/dopbase.py +6 -6
  82. odxtools/dtcconnector.py +45 -0
  83. odxtools/dtcdop.py +15 -56
  84. odxtools/dynamicendmarkerfield.py +5 -4
  85. odxtools/dynamiclengthfield.py +5 -4
  86. odxtools/dyndefinedspec.py +7 -159
  87. odxtools/dynenddopref.py +5 -5
  88. odxtools/dyniddefmodeinfo.py +161 -0
  89. odxtools/ecuvariantpattern.py +4 -5
  90. odxtools/element.py +5 -6
  91. odxtools/encodestate.py +11 -11
  92. odxtools/encoding.py +2 -3
  93. odxtools/endofpdufield.py +6 -6
  94. odxtools/envdataconnector.py +49 -0
  95. odxtools/environmentdata.py +3 -4
  96. odxtools/environmentdatadescription.py +11 -11
  97. odxtools/exceptions.py +5 -5
  98. odxtools/externalaccessmethod.py +22 -0
  99. odxtools/externaldoc.py +23 -0
  100. odxtools/field.py +9 -10
  101. odxtools/functionalclass.py +4 -4
  102. odxtools/inputparam.py +6 -6
  103. odxtools/internalconstr.py +4 -5
  104. odxtools/isotp_state_machine.py +12 -11
  105. odxtools/leadinglengthinfotype.py +2 -3
  106. odxtools/library.py +5 -5
  107. odxtools/linkeddtcdop.py +62 -0
  108. odxtools/loadfile.py +5 -6
  109. odxtools/matchingbasevariantparameter.py +2 -3
  110. odxtools/matchingparameter.py +7 -7
  111. odxtools/minmaxlengthtype.py +5 -11
  112. odxtools/modification.py +4 -4
  113. odxtools/multiplexer.py +11 -11
  114. odxtools/multiplexercase.py +6 -6
  115. odxtools/multiplexerdefaultcase.py +6 -6
  116. odxtools/multiplexerswitchkey.py +4 -4
  117. odxtools/nameditemlist.py +14 -14
  118. odxtools/negoutputparam.py +3 -3
  119. odxtools/obd.py +1 -2
  120. odxtools/odxcategory.py +6 -6
  121. odxtools/odxlink.py +19 -20
  122. odxtools/odxtypes.py +21 -18
  123. odxtools/outputparam.py +4 -4
  124. odxtools/parameterinfo.py +2 -2
  125. odxtools/parameters/codedconstparameter.py +5 -5
  126. odxtools/parameters/createanyparameter.py +1 -2
  127. odxtools/parameters/dynamicparameter.py +2 -3
  128. odxtools/parameters/lengthkeyparameter.py +5 -5
  129. odxtools/parameters/matchingrequestparameter.py +3 -4
  130. odxtools/parameters/nrcconstparameter.py +7 -7
  131. odxtools/parameters/parameter.py +11 -11
  132. odxtools/parameters/parameterwithdop.py +9 -9
  133. odxtools/parameters/physicalconstantparameter.py +4 -4
  134. odxtools/parameters/reservedparameter.py +3 -4
  135. odxtools/parameters/rowfragment.py +7 -0
  136. odxtools/parameters/systemparameter.py +2 -3
  137. odxtools/parameters/tableentryparameter.py +4 -9
  138. odxtools/parameters/tablekeyparameter.py +10 -10
  139. odxtools/parameters/tablestructparameter.py +7 -7
  140. odxtools/parameters/valueparameter.py +7 -7
  141. odxtools/paramlengthinfotype.py +5 -3
  142. odxtools/parentref.py +9 -9
  143. odxtools/physicaldimension.py +11 -11
  144. odxtools/physicaltype.py +4 -12
  145. odxtools/posresponsesuppressible.py +72 -0
  146. odxtools/preconditionstateref.py +7 -7
  147. odxtools/progcode.py +6 -6
  148. odxtools/protstack.py +4 -4
  149. odxtools/radix.py +9 -0
  150. odxtools/relateddiagcommref.py +22 -0
  151. odxtools/relateddoc.py +6 -6
  152. odxtools/request.py +14 -12
  153. odxtools/response.py +15 -13
  154. odxtools/scaleconstr.py +4 -12
  155. odxtools/servicebinner.py +5 -5
  156. odxtools/singleecujob.py +4 -4
  157. odxtools/snrefcontext.py +2 -2
  158. odxtools/specialdata.py +5 -5
  159. odxtools/specialdatagroup.py +9 -9
  160. odxtools/specialdatagroupcaption.py +3 -3
  161. odxtools/standardizationlevel.py +9 -0
  162. odxtools/standardlengthtype.py +12 -21
  163. odxtools/state.py +3 -3
  164. odxtools/statechart.py +4 -4
  165. odxtools/statemachine.py +4 -3
  166. odxtools/statetransition.py +5 -18
  167. odxtools/statetransitionref.py +18 -18
  168. odxtools/staticfield.py +5 -4
  169. odxtools/structure.py +2 -3
  170. odxtools/subcomponent.py +12 -245
  171. odxtools/subcomponentparamconnector.py +103 -0
  172. odxtools/subcomponentpattern.py +42 -0
  173. odxtools/swvariable.py +3 -4
  174. odxtools/table.py +17 -55
  175. odxtools/tablediagcommconnector.py +47 -0
  176. odxtools/tablerow.py +30 -30
  177. odxtools/tablerowconnector.py +46 -0
  178. odxtools/teammember.py +11 -11
  179. odxtools/templates/macros/printService.xml.jinja2 +2 -1
  180. odxtools/termination.py +8 -0
  181. odxtools/text.py +2 -3
  182. odxtools/transmode.py +9 -0
  183. odxtools/uds.py +2 -3
  184. odxtools/unit.py +9 -9
  185. odxtools/unitgroup.py +6 -11
  186. odxtools/unitgroupcategory.py +7 -0
  187. odxtools/unitspec.py +6 -6
  188. odxtools/usage.py +9 -0
  189. odxtools/utils.py +31 -2
  190. odxtools/validtype.py +9 -0
  191. odxtools/variablegroup.py +2 -2
  192. odxtools/variantmatcher.py +10 -10
  193. odxtools/variantpattern.py +3 -3
  194. odxtools/version.py +2 -2
  195. odxtools/writepdxfile.py +5 -5
  196. odxtools/xdoc.py +9 -9
  197. {odxtools-9.6.1.dist-info → odxtools-10.0.0.dist-info}/METADATA +4 -5
  198. odxtools-10.0.0.dist-info/RECORD +264 -0
  199. odxtools-9.6.1.dist-info/RECORD +0 -238
  200. {odxtools-9.6.1.dist-info → odxtools-10.0.0.dist-info}/WHEEL +0 -0
  201. {odxtools-9.6.1.dist-info → odxtools-10.0.0.dist-info}/entry_points.txt +0 -0
  202. {odxtools-9.6.1.dist-info → odxtools-10.0.0.dist-info}/licenses/LICENSE +0 -0
  203. {odxtools-9.6.1.dist-info → odxtools-10.0.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import Any, Dict, List, Optional, cast
3
+ from typing import Any, cast
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .compumethods.compumethod import CompuMethod
@@ -37,20 +37,20 @@ class DataObjectProperty(DopBase):
37
37
  #: The type of the value in the physical world
38
38
  physical_type: PhysicalType
39
39
 
40
- internal_constr: Optional[InternalConstr]
40
+ internal_constr: InternalConstr | None
41
41
 
42
42
  #: The unit associated with physical values (e.g. 'm/s^2')
43
- unit_ref: Optional[OdxLinkRef]
43
+ unit_ref: OdxLinkRef | None
44
44
 
45
- physical_constr: Optional[InternalConstr]
45
+ physical_constr: InternalConstr | None
46
46
 
47
47
  @property
48
- def unit(self) -> Optional[Unit]:
48
+ def unit(self) -> Unit | None:
49
49
  return self._unit
50
50
 
51
51
  @staticmethod
52
52
  def from_et(et_element: ElementTree.Element,
53
- doc_frags: List[OdxDocFragment]) -> "DataObjectProperty":
53
+ doc_frags: list[OdxDocFragment]) -> "DataObjectProperty":
54
54
  """Reads a DATA-OBJECT-PROP."""
55
55
  kwargs = dataclass_fields_asdict(DopBase.from_et(et_element, doc_frags))
56
56
 
@@ -83,7 +83,7 @@ class DataObjectProperty(DopBase):
83
83
  physical_constr=physical_constr,
84
84
  **kwargs)
85
85
 
86
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
86
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
87
87
  result = super()._build_odxlinks()
88
88
  result.update(self.compu_method._build_odxlinks())
89
89
  result.update(self.diag_coded_type._build_odxlinks())
@@ -96,7 +96,7 @@ class DataObjectProperty(DopBase):
96
96
  self.compu_method._resolve_odxlinks(odxlinks)
97
97
  self.diag_coded_type._resolve_odxlinks(odxlinks)
98
98
 
99
- self._unit: Optional[Unit] = None
99
+ self._unit: Unit | None = None
100
100
  if self.unit_ref:
101
101
  self._unit = odxlinks.resolve(self.unit_ref, Unit)
102
102
 
@@ -106,7 +106,7 @@ class DataObjectProperty(DopBase):
106
106
  self.compu_method._resolve_snrefs(context)
107
107
  self.diag_coded_type._resolve_snrefs(context)
108
108
 
109
- def get_static_bit_length(self) -> Optional[int]:
109
+ def get_static_bit_length(self) -> int | None:
110
110
  return self.diag_coded_type.get_static_bit_length()
111
111
 
112
112
  def encode_into_pdu(self, physical_value: ParameterValue, encode_state: EncodeState) -> None:
@@ -118,7 +118,7 @@ class DataObjectProperty(DopBase):
118
118
  f"The value {repr(physical_value)} of type {type(physical_value).__name__}"
119
119
  f" is not a valid.")
120
120
 
121
- if not isinstance(physical_value, (int, float, str, BytesTypes)):
121
+ if not isinstance(physical_value, int | float | str | BytesTypes):
122
122
  odxraise(f"Invalid type '{type(physical_value).__name__}' for physical value. "
123
123
  f"(Expect atomic type!)")
124
124
  internal_value = self.compu_method.convert_physical_to_internal(physical_value)
odxtools/decodestate.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass, field
3
- from typing import TYPE_CHECKING, Dict, List, Optional, Tuple
3
+ from typing import TYPE_CHECKING
4
4
 
5
5
  from .encoding import Encoding, get_string_encoding
6
6
  from .exceptions import DecodeError, odxassert, odxraise, strict_mode
@@ -41,22 +41,22 @@ class DecodeState:
41
41
  cursor_bit_position: int = 0
42
42
 
43
43
  #: values of the length key parameters decoded so far
44
- length_keys: Dict[str, int] = field(default_factory=dict)
44
+ length_keys: dict[str, int] = field(default_factory=dict)
45
45
 
46
46
  #: values of the table key parameters decoded so far
47
- table_keys: Dict[str, "TableRow"] = field(default_factory=dict)
47
+ table_keys: dict[str, "TableRow"] = field(default_factory=dict)
48
48
 
49
49
  #: List of parameters that have been decoded so far. The journal
50
50
  #: is used by some types of parameters which depend on the values of
51
51
  #: other parameters; i.e., environment data description parameters
52
- journal: List[Tuple["Parameter", Optional[ParameterValue]]] = field(default_factory=list)
52
+ journal: list[tuple["Parameter", ParameterValue | None]] = field(default_factory=list)
53
53
 
54
54
  def extract_atomic_value(
55
55
  self,
56
56
  *,
57
57
  bit_length: int,
58
58
  base_data_type: DataType,
59
- base_type_encoding: Optional[Encoding],
59
+ base_type_encoding: Encoding | None,
60
60
  is_highlow_byte_order: bool,
61
61
  ) -> AtomicOdxType:
62
62
  """Extract an internal value from a blob of raw bytes.
odxtools/description.py CHANGED
@@ -1,38 +1,22 @@
1
1
  from dataclasses import dataclass
2
- from typing import List, Optional
2
+ from typing import Optional
3
3
  from xml.etree import ElementTree
4
4
 
5
5
  from .exceptions import odxrequire
6
+ from .externaldoc import ExternalDoc
6
7
  from .odxlink import OdxDocFragment
7
8
 
8
9
 
9
- @dataclass
10
- class ExternalDoc:
11
- description: Optional[str]
12
- href: str
13
-
14
- @staticmethod
15
- def from_et(et_element: Optional[ElementTree.Element],
16
- doc_frags: List[OdxDocFragment]) -> Optional["ExternalDoc"]:
17
- if et_element is None:
18
- return None
19
-
20
- description = et_element.text
21
- href = odxrequire(et_element.get("HREF"))
22
-
23
- return ExternalDoc(description=description, href=href)
24
-
25
-
26
10
  @dataclass
27
11
  class Description:
28
12
  text: str
29
- external_docs: List[ExternalDoc]
13
+ external_docs: list[ExternalDoc]
30
14
 
31
- text_identifier: Optional[str]
15
+ text_identifier: str | None
32
16
 
33
17
  @staticmethod
34
- def from_et(et_element: Optional[ElementTree.Element],
35
- doc_frags: List[OdxDocFragment]) -> Optional["Description"]:
18
+ def from_et(et_element: ElementTree.Element | None,
19
+ doc_frags: list[OdxDocFragment]) -> Optional["Description"]:
36
20
  if et_element is None:
37
21
  return None
38
22
 
@@ -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 .dataobjectproperty import DataObjectProperty
@@ -15,7 +15,7 @@ class DetermineNumberOfItems:
15
15
  The object that determines the number of items of dynamic fields
16
16
  """
17
17
  byte_position: int
18
- bit_position: Optional[int]
18
+ bit_position: int | None
19
19
  dop_ref: OdxLinkRef
20
20
 
21
21
  @property
@@ -24,7 +24,7 @@ class DetermineNumberOfItems:
24
24
 
25
25
  @staticmethod
26
26
  def from_et(et_element: ElementTree.Element,
27
- doc_frags: List[OdxDocFragment]) -> "DetermineNumberOfItems":
27
+ doc_frags: list[OdxDocFragment]) -> "DetermineNumberOfItems":
28
28
  byte_position = int(odxrequire(et_element.findtext("BYTE-POSITION")))
29
29
  bit_position_str = et_element.findtext("BIT-POSITION")
30
30
  bit_position = int(bit_position_str) if bit_position_str is not None else None
@@ -36,7 +36,7 @@ class DetermineNumberOfItems:
36
36
  dop_ref=dop_ref,
37
37
  )
38
38
 
39
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
39
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
40
40
  return {}
41
41
 
42
42
  def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
@@ -0,0 +1,11 @@
1
+ # SPDX-License-Identifier: MIT
2
+ from enum import Enum
3
+
4
+
5
+ class DiagClassType(Enum):
6
+ STARTCOMM = "STARTCOMM"
7
+ STOPCOMM = "STOPCOMM"
8
+ VARIANTIDENTIFICATION = "VARIANTIDENTIFICATION"
9
+ READ_DYN_DEFINED_MESSAGE = "READ-DYN-DEFINED-MESSAGE"
10
+ DYN_DEF_MESSAGE = "DYN-DEF-MESSAGE"
11
+ CLEAR_DYN_DEF_MESSAGE = "CLEAR-DYN-DEF-MESSAGE"
odxtools/diagcodedtype.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, Literal, Optional, Union, cast
3
+ from typing import Any, Literal, cast
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .decodestate import DecodeState
@@ -22,10 +22,10 @@ DctType = Literal[
22
22
 
23
23
  @dataclass
24
24
  class DiagCodedType:
25
- base_type_encoding: Optional[Encoding]
25
+ base_type_encoding: Encoding | None
26
26
  base_data_type: DataType
27
27
 
28
- is_highlow_byte_order_raw: Optional[bool]
28
+ is_highlow_byte_order_raw: bool | None
29
29
 
30
30
  @property
31
31
  def dct_type(self) -> DctType:
@@ -39,7 +39,7 @@ class DiagCodedType:
39
39
 
40
40
  @staticmethod
41
41
  def from_et(et_element: ElementTree.Element,
42
- doc_frags: List[OdxDocFragment]) -> "DiagCodedType":
42
+ doc_frags: list[OdxDocFragment]) -> "DiagCodedType":
43
43
  base_type_encoding = None
44
44
  if (base_type_encoding_str := et_element.get("BASE-TYPE-ENCODING")) is not None:
45
45
  try:
@@ -61,7 +61,7 @@ class DiagCodedType:
61
61
  base_data_type=base_data_type,
62
62
  is_highlow_byte_order_raw=is_highlow_byte_order_raw)
63
63
 
64
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]: # noqa: B027
64
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]: # noqa: B027
65
65
  return {}
66
66
 
67
67
  def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None: # noqa: B027
@@ -72,10 +72,10 @@ class DiagCodedType:
72
72
  """Recursively resolve any short-name references"""
73
73
  pass
74
74
 
75
- def get_static_bit_length(self) -> Optional[int]:
75
+ def get_static_bit_length(self) -> int | None:
76
76
  return None
77
77
 
78
- def _minimal_byte_length_of(self, internal_value: Union[bytes, str]) -> int:
78
+ def _minimal_byte_length_of(self, internal_value: bytes | str) -> int:
79
79
  """Helper method to get the minimal byte length.
80
80
  (needed for LeadingLength- and MinMaxLengthType)
81
81
  """
odxtools/diagcomm.py CHANGED
@@ -1,11 +1,11 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from enum import Enum
4
- from typing import TYPE_CHECKING, Any, Dict, List, Optional
3
+ from typing import TYPE_CHECKING, Any
5
4
  from xml.etree import ElementTree
6
5
 
7
6
  from .admindata import AdminData
8
7
  from .audience import Audience
8
+ from .diagclasstype import DiagClassType
9
9
  from .element import IdentifiableElement
10
10
  from .exceptions import odxraise, odxrequire
11
11
  from .functionalclass import FunctionalClass
@@ -13,6 +13,7 @@ from .nameditemlist import NamedItemList
13
13
  from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef, resolve_snref
14
14
  from .odxtypes import odxstr_to_bool
15
15
  from .preconditionstateref import PreConditionStateRef
16
+ from .relateddiagcommref import RelatedDiagCommRef
16
17
  from .snrefcontext import SnRefContext
17
18
  from .specialdatagroup import SpecialDataGroup
18
19
  from .state import State
@@ -24,30 +25,6 @@ if TYPE_CHECKING:
24
25
  from .diaglayers.protocol import Protocol
25
26
 
26
27
 
27
- class DiagClassType(Enum):
28
- STARTCOMM = "STARTCOMM"
29
- STOPCOMM = "STOPCOMM"
30
- VARIANTIDENTIFICATION = "VARIANTIDENTIFICATION"
31
- READ_DYN_DEFINED_MESSAGE = "READ-DYN-DEFINED-MESSAGE"
32
- DYN_DEF_MESSAGE = "DYN-DEF-MESSAGE"
33
- CLEAR_DYN_DEF_MESSAGE = "CLEAR-DYN-DEF-MESSAGE"
34
-
35
-
36
- @dataclass
37
- class RelatedDiagCommRef(OdxLinkRef):
38
- relation_type: str
39
-
40
- @staticmethod
41
- def from_et( # type: ignore[override]
42
- et_element: ElementTree.Element,
43
- doc_frags: List[OdxDocFragment]) -> "RelatedDiagCommRef":
44
- kwargs = dataclass_fields_asdict(odxrequire(OdxLinkRef.from_et(et_element, doc_frags)))
45
-
46
- relation_type = odxrequire(et_element.findtext("RELATION-TYPE"))
47
-
48
- return RelatedDiagCommRef(relation_type=relation_type, **kwargs)
49
-
50
-
51
28
  @dataclass
52
29
  class DiagComm(IdentifiableElement):
53
30
  """Representation of a diagnostic communication object.
@@ -57,21 +34,21 @@ class DiagComm(IdentifiableElement):
57
34
 
58
35
  """
59
36
 
60
- admin_data: Optional[AdminData]
61
- sdgs: List[SpecialDataGroup]
62
- functional_class_refs: List[OdxLinkRef]
63
- audience: Optional[Audience]
64
- protocol_snrefs: List[str]
65
- related_diag_comm_refs: List[RelatedDiagCommRef]
66
- pre_condition_state_refs: List[PreConditionStateRef]
67
- state_transition_refs: List[StateTransitionRef]
37
+ admin_data: AdminData | None
38
+ sdgs: list[SpecialDataGroup]
39
+ functional_class_refs: list[OdxLinkRef]
40
+ audience: Audience | None
41
+ protocol_snrefs: list[str]
42
+ related_diag_comm_refs: list[RelatedDiagCommRef]
43
+ pre_condition_state_refs: list[PreConditionStateRef]
44
+ state_transition_refs: list[StateTransitionRef]
68
45
 
69
46
  # attributes
70
- semantic: Optional[str]
71
- diagnostic_class: Optional[DiagClassType]
72
- is_mandatory_raw: Optional[bool]
73
- is_executable_raw: Optional[bool]
74
- is_final_raw: Optional[bool]
47
+ semantic: str | None
48
+ diagnostic_class: DiagClassType | None
49
+ is_mandatory_raw: bool | None
50
+ is_executable_raw: bool | None
51
+ is_final_raw: bool | None
75
52
 
76
53
  @property
77
54
  def functional_classes(self) -> NamedItemList[FunctionalClass]:
@@ -106,7 +83,7 @@ class DiagComm(IdentifiableElement):
106
83
  return self.is_final_raw is True
107
84
 
108
85
  @staticmethod
109
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "DiagComm":
86
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "DiagComm":
110
87
  kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
111
88
 
112
89
  admin_data = AdminData.from_et(et_element.find("ADMIN-DATA"), doc_frags)
@@ -145,7 +122,7 @@ class DiagComm(IdentifiableElement):
145
122
 
146
123
  semantic = et_element.attrib.get("SEMANTIC")
147
124
 
148
- diagnostic_class: Optional[DiagClassType] = None
125
+ diagnostic_class: DiagClassType | None = None
149
126
  if (diagnostic_class_str := et_element.attrib.get("DIAGNOSTIC-CLASS")) is not None:
150
127
  try:
151
128
  diagnostic_class = DiagClassType(diagnostic_class_str)
@@ -172,7 +149,7 @@ class DiagComm(IdentifiableElement):
172
149
  is_final_raw=is_final_raw,
173
150
  **kwargs)
174
151
 
175
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
152
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
176
153
  result = {self.odx_id: self}
177
154
 
178
155
  if self.admin_data is not None:
@@ -1,7 +1,7 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
3
  from itertools import chain
4
- from typing import Any, Dict, List, Optional
4
+ from typing import Any
5
5
  from xml.etree import ElementTree
6
6
 
7
7
  from .admindata import AdminData
@@ -26,7 +26,7 @@ from .unitspec import UnitSpec
26
26
 
27
27
  @dataclass
28
28
  class DiagDataDictionarySpec:
29
- admin_data: Optional[AdminData]
29
+ admin_data: AdminData | None
30
30
  dtc_dops: NamedItemList[DtcDop]
31
31
  env_data_descs: NamedItemList[EnvironmentDataDescription]
32
32
  data_object_props: NamedItemList[DataObjectProperty]
@@ -37,13 +37,13 @@ class DiagDataDictionarySpec:
37
37
  end_of_pdu_fields: NamedItemList[EndOfPduField]
38
38
  muxs: NamedItemList[Multiplexer]
39
39
  env_datas: NamedItemList[EnvironmentData]
40
- unit_spec: Optional[UnitSpec]
40
+ unit_spec: UnitSpec | None
41
41
  tables: NamedItemList[Table]
42
- sdgs: List[SpecialDataGroup]
42
+ sdgs: list[SpecialDataGroup]
43
43
 
44
44
  @staticmethod
45
45
  def from_et(et_element: ElementTree.Element,
46
- doc_frags: List[OdxDocFragment]) -> "DiagDataDictionarySpec":
46
+ doc_frags: list[OdxDocFragment]) -> "DiagDataDictionarySpec":
47
47
  admin_data = None
48
48
  if (admin_data_elem := et_element.find("ADMIN-DATA")) is not None:
49
49
  admin_data = AdminData.from_et(admin_data_elem, doc_frags)
@@ -149,7 +149,7 @@ class DiagDataDictionarySpec:
149
149
  self.env_datas,
150
150
  ))
151
151
 
152
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
152
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
153
153
  # note that DataDictionarySpec objects do not exhibit an ODXLINK id.
154
154
  odxlinks = {}
155
155
 
@@ -1,7 +1,7 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
3
  from itertools import chain
4
- from typing import TYPE_CHECKING, Any, Dict, List, Union
4
+ from typing import TYPE_CHECKING, Any
5
5
  from xml.etree import ElementTree
6
6
 
7
7
  from .diaglayers.basevariant import BaseVariant
@@ -41,7 +41,7 @@ class DiagLayerContainer(OdxCategory):
41
41
 
42
42
  @staticmethod
43
43
  def from_et(et_element: ElementTree.Element,
44
- doc_frags: List[OdxDocFragment]) -> "DiagLayerContainer":
44
+ doc_frags: list[OdxDocFragment]) -> "DiagLayerContainer":
45
45
 
46
46
  cat = OdxCategory.category_from_et(et_element, doc_frags, doc_type=DocType.CONTAINER)
47
47
  doc_frags = cat.odx_id.doc_fragments
@@ -85,7 +85,7 @@ class DiagLayerContainer(OdxCategory):
85
85
  self.ecu_variants,
86
86
  ),)
87
87
 
88
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
88
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
89
89
  result = super()._build_odxlinks()
90
90
 
91
91
  for protocol in self.protocols:
@@ -132,5 +132,5 @@ class DiagLayerContainer(OdxCategory):
132
132
  def _resolve_snrefs(self, context: SnRefContext) -> None:
133
133
  super()._resolve_snrefs(context)
134
134
 
135
- def __getitem__(self, key: Union[int, str]) -> DiagLayer:
135
+ def __getitem__(self, key: int | str) -> DiagLayer:
136
136
  return self.diag_layers[key]
@@ -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
@@ -32,19 +33,19 @@ class BaseVariant(HierarchyElement):
32
33
  # <properties forwarded to the "raw" base variant>
33
34
  #####
34
35
  @property
35
- def diag_variables_raw(self) -> List[Union[DiagVariable, OdxLinkRef]]:
36
+ def diag_variables_raw(self) -> list[DiagVariable | OdxLinkRef]:
36
37
  return self.base_variant_raw.diag_variables_raw
37
38
 
38
39
  @property
39
- def dyn_defined_spec(self) -> Optional[DynDefinedSpec]:
40
+ def dyn_defined_spec(self) -> DynDefinedSpec | None:
40
41
  return self.base_variant_raw.dyn_defined_spec
41
42
 
42
43
  @property
43
- def base_variant_pattern(self) -> Optional[BaseVariantPattern]:
44
+ def base_variant_pattern(self) -> BaseVariantPattern | None:
44
45
  return self.base_variant_raw.base_variant_pattern
45
46
 
46
47
  @property
47
- def parent_refs(self) -> List[ParentRef]:
48
+ def parent_refs(self) -> list[ParentRef]:
48
49
  return self.base_variant_raw.parent_refs
49
50
 
50
51
  #####
@@ -67,7 +68,7 @@ class BaseVariant(HierarchyElement):
67
68
  #######
68
69
 
69
70
  @staticmethod
70
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "BaseVariant":
71
+ def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "BaseVariant":
71
72
  base_variant_raw = BaseVariantRaw.from_et(et_element, doc_frags)
72
73
 
73
74
  return BaseVariant(diag_layer_raw=base_variant_raw)
@@ -80,7 +81,7 @@ class BaseVariant(HierarchyElement):
80
81
  "The raw diagnostic layer passed to BaseVariant "
81
82
  "must be a BaseVariantRaw")
82
83
 
83
- def __deepcopy__(self, memo: Dict[int, Any]) -> Any:
84
+ def __deepcopy__(self, memo: dict[int, Any]) -> Any:
84
85
  """Create a deep copy of the base variant
85
86
 
86
87
  Note that the copied diagnostic layer is not fully
@@ -113,7 +114,7 @@ class BaseVariant(HierarchyElement):
113
114
 
114
115
  return dl.diag_layer_raw.diag_variables # type: ignore[no-any-return]
115
116
 
116
- def not_inherited_fn(parent_ref: ParentRef) -> List[str]:
117
+ def not_inherited_fn(parent_ref: ParentRef) -> list[str]:
117
118
  return parent_ref.not_inherited_variables
118
119
 
119
120
  return self._compute_available_objects(get_local_objects_fn, not_inherited_fn)
@@ -127,7 +128,7 @@ class BaseVariant(HierarchyElement):
127
128
 
128
129
  return dl.diag_layer_raw.variable_groups # type: ignore[no-any-return]
129
130
 
130
- def not_inherited_fn(parent_ref: ParentRef) -> List[str]:
131
+ def not_inherited_fn(parent_ref: ParentRef) -> list[str]:
131
132
  return []
132
133
 
133
134
  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 ..basevariantpattern import BaseVariantPattern
@@ -21,11 +21,11 @@ class BaseVariantRaw(HierarchyElementRaw):
21
21
  """This is a diagnostic layer for common functionality of an ECU
22
22
  """
23
23
 
24
- diag_variables_raw: List[Union[DiagVariable, OdxLinkRef]]
24
+ diag_variables_raw: list[DiagVariable | OdxLinkRef]
25
25
  variable_groups: NamedItemList[VariableGroup]
26
- dyn_defined_spec: Optional[DynDefinedSpec]
27
- base_variant_pattern: Optional[BaseVariantPattern]
28
- parent_refs: List[ParentRef]
26
+ dyn_defined_spec: DynDefinedSpec | None
27
+ base_variant_pattern: BaseVariantPattern | None
28
+ parent_refs: list[ParentRef]
29
29
 
30
30
  @property
31
31
  def diag_variables(self) -> NamedItemList[DiagVariable]:
@@ -33,7 +33,7 @@ class BaseVariantRaw(HierarchyElementRaw):
33
33
 
34
34
  @staticmethod
35
35
  def from_et(et_element: ElementTree.Element,
36
- doc_frags: List[OdxDocFragment]) -> "BaseVariantRaw":
36
+ doc_frags: list[OdxDocFragment]) -> "BaseVariantRaw":
37
37
  # objects contained by diagnostic layers exibit an additional
38
38
  # document fragment for the diag layer, so we use the document
39
39
  # fragments of the odx id of the diag layer for IDs of
@@ -42,10 +42,10 @@ class BaseVariantRaw(HierarchyElementRaw):
42
42
  kwargs = dataclass_fields_asdict(her)
43
43
  doc_frags = her.odx_id.doc_fragments
44
44
 
45
- diag_variables_raw: List[Union[DiagVariable, OdxLinkRef]] = []
45
+ diag_variables_raw: list[DiagVariable | OdxLinkRef] = []
46
46
  if (dv_elems := et_element.find("DIAG-VARIABLES")) is not None:
47
47
  for dv_proxy_elem in dv_elems:
48
- dv_proxy: Union[OdxLinkRef, DiagVariable]
48
+ dv_proxy: OdxLinkRef | DiagVariable
49
49
  if dv_proxy_elem.tag == "DIAG-VARIABLE-REF":
50
50
  dv_proxy = OdxLinkRef.from_et(dv_proxy_elem, doc_frags)
51
51
  elif dv_proxy_elem.tag == "DIAG-VARIABLE":
@@ -81,7 +81,7 @@ class BaseVariantRaw(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: