odxtools 9.7.0__py3-none-any.whl → 10.1.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 (193) hide show
  1. odxtools/additionalaudience.py +7 -7
  2. odxtools/admindata.py +14 -13
  3. odxtools/audience.py +17 -17
  4. odxtools/basecomparam.py +9 -8
  5. odxtools/basevariantpattern.py +9 -10
  6. odxtools/basicstructure.py +15 -15
  7. odxtools/cli/_print_utils.py +34 -22
  8. odxtools/cli/browse.py +8 -8
  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 +6 -6
  13. odxtools/cli/main.py +2 -2
  14. odxtools/cli/snoop.py +3 -3
  15. odxtools/codec.py +3 -3
  16. odxtools/commrelation.py +18 -17
  17. odxtools/companydata.py +13 -13
  18. odxtools/companydocinfo.py +15 -17
  19. odxtools/companyrevisioninfo.py +9 -9
  20. odxtools/companyspecificinfo.py +11 -13
  21. odxtools/comparam.py +8 -7
  22. odxtools/comparaminstance.py +14 -14
  23. odxtools/comparamspec.py +10 -11
  24. odxtools/comparamsubset.py +17 -25
  25. odxtools/complexcomparam.py +14 -14
  26. odxtools/complexdop.py +1 -1
  27. odxtools/compositecodec.py +8 -8
  28. odxtools/compumethods/compucodecompumethod.py +7 -7
  29. odxtools/compumethods/compuconst.py +5 -6
  30. odxtools/compumethods/compudefaultvalue.py +2 -3
  31. odxtools/compumethods/compuinternaltophys.py +13 -12
  32. odxtools/compumethods/compumethod.py +10 -9
  33. odxtools/compumethods/compuphystointernal.py +13 -12
  34. odxtools/compumethods/compurationalcoeffs.py +7 -7
  35. odxtools/compumethods/compuscale.py +15 -16
  36. odxtools/compumethods/createanycompumethod.py +12 -13
  37. odxtools/compumethods/identicalcompumethod.py +4 -5
  38. odxtools/compumethods/limit.py +14 -14
  39. odxtools/compumethods/linearcompumethod.py +5 -5
  40. odxtools/compumethods/linearsegment.py +10 -11
  41. odxtools/compumethods/ratfunccompumethod.py +6 -6
  42. odxtools/compumethods/ratfuncsegment.py +7 -8
  43. odxtools/compumethods/scalelinearcompumethod.py +9 -9
  44. odxtools/compumethods/scaleratfunccompumethod.py +7 -7
  45. odxtools/compumethods/tabintpcompumethod.py +10 -13
  46. odxtools/compumethods/texttablecompumethod.py +6 -6
  47. odxtools/createanycomparam.py +5 -7
  48. odxtools/createanydiagcodedtype.py +7 -8
  49. odxtools/database.py +34 -31
  50. odxtools/dataobjectproperty.py +19 -20
  51. odxtools/decodestate.py +5 -5
  52. odxtools/description.py +9 -9
  53. odxtools/determinenumberofitems.py +8 -7
  54. odxtools/diagcodedtype.py +10 -10
  55. odxtools/diagcomm.py +29 -30
  56. odxtools/diagdatadictionaryspec.py +36 -36
  57. odxtools/diaglayercontainer.py +35 -34
  58. odxtools/diaglayers/basevariant.py +14 -12
  59. odxtools/diaglayers/basevariantraw.py +22 -23
  60. odxtools/diaglayers/diaglayer.py +24 -22
  61. odxtools/diaglayers/diaglayerraw.py +43 -52
  62. odxtools/diaglayers/diaglayertype.py +1 -2
  63. odxtools/diaglayers/ecushareddata.py +9 -9
  64. odxtools/diaglayers/ecushareddataraw.py +15 -16
  65. odxtools/diaglayers/ecuvariant.py +15 -13
  66. odxtools/diaglayers/ecuvariantraw.py +21 -22
  67. odxtools/diaglayers/functionalgroup.py +12 -11
  68. odxtools/diaglayers/functionalgroupraw.py +17 -18
  69. odxtools/diaglayers/hierarchyelement.py +48 -54
  70. odxtools/diaglayers/hierarchyelementraw.py +10 -11
  71. odxtools/diaglayers/protocol.py +7 -7
  72. odxtools/diaglayers/protocolraw.py +13 -14
  73. odxtools/diagnostictroublecode.py +15 -17
  74. odxtools/diagservice.py +28 -27
  75. odxtools/diagvariable.py +24 -25
  76. odxtools/docrevision.py +18 -17
  77. odxtools/dopbase.py +13 -14
  78. odxtools/dtcconnector.py +8 -7
  79. odxtools/dtcdop.py +24 -20
  80. odxtools/dynamicendmarkerfield.py +10 -9
  81. odxtools/dynamiclengthfield.py +10 -9
  82. odxtools/dyndefinedspec.py +10 -10
  83. odxtools/dynenddopref.py +9 -9
  84. odxtools/dyniddefmodeinfo.py +21 -21
  85. odxtools/ecuvariantpattern.py +8 -10
  86. odxtools/element.py +12 -13
  87. odxtools/encodestate.py +11 -11
  88. odxtools/encoding.py +2 -3
  89. odxtools/endofpdufield.py +9 -10
  90. odxtools/envdataconnector.py +8 -8
  91. odxtools/environmentdata.py +7 -9
  92. odxtools/environmentdatadescription.py +18 -17
  93. odxtools/exceptions.py +5 -5
  94. odxtools/externalaccessmethod.py +4 -6
  95. odxtools/externaldoc.py +6 -6
  96. odxtools/field.py +15 -15
  97. odxtools/functionalclass.py +9 -9
  98. odxtools/inputparam.py +11 -10
  99. odxtools/internalconstr.py +10 -11
  100. odxtools/isotp_state_machine.py +12 -11
  101. odxtools/leadinglengthinfotype.py +4 -6
  102. odxtools/library.py +9 -8
  103. odxtools/linkeddtcdop.py +9 -8
  104. odxtools/loadfile.py +5 -6
  105. odxtools/matchingbasevariantparameter.py +5 -6
  106. odxtools/matchingparameter.py +10 -10
  107. odxtools/message.py +1 -1
  108. odxtools/minmaxlengthtype.py +6 -7
  109. odxtools/modification.py +7 -6
  110. odxtools/multiplexer.py +54 -18
  111. odxtools/multiplexercase.py +13 -13
  112. odxtools/multiplexerdefaultcase.py +11 -10
  113. odxtools/multiplexerswitchkey.py +8 -8
  114. odxtools/nameditemlist.py +13 -13
  115. odxtools/negoutputparam.py +8 -8
  116. odxtools/obd.py +1 -2
  117. odxtools/odxcategory.py +14 -26
  118. odxtools/odxdoccontext.py +16 -0
  119. odxtools/odxlink.py +23 -25
  120. odxtools/odxtypes.py +18 -15
  121. odxtools/outputparam.py +9 -8
  122. odxtools/parameterinfo.py +1 -1
  123. odxtools/parameters/codedconstparameter.py +10 -10
  124. odxtools/parameters/createanyparameter.py +15 -16
  125. odxtools/parameters/dynamicparameter.py +5 -7
  126. odxtools/parameters/lengthkeyparameter.py +10 -10
  127. odxtools/parameters/matchingrequestparameter.py +6 -7
  128. odxtools/parameters/nrcconstparameter.py +13 -13
  129. odxtools/parameters/parameter.py +17 -18
  130. odxtools/parameters/parameterwithdop.py +13 -13
  131. odxtools/parameters/physicalconstantparameter.py +8 -7
  132. odxtools/parameters/reservedparameter.py +6 -8
  133. odxtools/parameters/systemparameter.py +5 -7
  134. odxtools/parameters/tableentryparameter.py +8 -8
  135. odxtools/parameters/tablekeyparameter.py +17 -17
  136. odxtools/parameters/tablestructparameter.py +11 -11
  137. odxtools/parameters/valueparameter.py +11 -11
  138. odxtools/paramlengthinfotype.py +10 -9
  139. odxtools/parentref.py +15 -13
  140. odxtools/physicaldimension.py +15 -15
  141. odxtools/physicaltype.py +5 -6
  142. odxtools/posresponsesuppressible.py +11 -12
  143. odxtools/preconditionstateref.py +11 -11
  144. odxtools/progcode.py +11 -10
  145. odxtools/protstack.py +10 -9
  146. odxtools/relateddiagcommref.py +5 -6
  147. odxtools/relateddoc.py +11 -10
  148. odxtools/request.py +18 -19
  149. odxtools/response.py +19 -20
  150. odxtools/scaleconstr.py +8 -9
  151. odxtools/servicebinner.py +5 -5
  152. odxtools/singleecujob.py +16 -15
  153. odxtools/snrefcontext.py +3 -3
  154. odxtools/specialdata.py +8 -7
  155. odxtools/specialdatagroup.py +17 -17
  156. odxtools/specialdatagroupcaption.py +7 -6
  157. odxtools/standardlengthtype.py +14 -22
  158. odxtools/state.py +7 -6
  159. odxtools/statechart.py +12 -11
  160. odxtools/statemachine.py +4 -3
  161. odxtools/statetransition.py +9 -9
  162. odxtools/statetransitionref.py +19 -19
  163. odxtools/staticfield.py +9 -7
  164. odxtools/structure.py +5 -6
  165. odxtools/subcomponent.py +20 -18
  166. odxtools/subcomponentparamconnector.py +10 -9
  167. odxtools/subcomponentpattern.py +9 -9
  168. odxtools/swvariable.py +6 -7
  169. odxtools/table.py +25 -26
  170. odxtools/tablediagcommconnector.py +9 -8
  171. odxtools/tablerow.py +64 -43
  172. odxtools/tablerowconnector.py +8 -8
  173. odxtools/teammember.py +16 -15
  174. odxtools/templates/macros/printParentRef.xml.jinja2 +3 -1
  175. odxtools/text.py +4 -5
  176. odxtools/uds.py +2 -3
  177. odxtools/unit.py +14 -13
  178. odxtools/unitgroup.py +11 -10
  179. odxtools/unitspec.py +18 -19
  180. odxtools/utils.py +3 -3
  181. odxtools/variablegroup.py +5 -6
  182. odxtools/variantmatcher.py +10 -10
  183. odxtools/variantpattern.py +5 -6
  184. odxtools/version.py +2 -2
  185. odxtools/writepdxfile.py +5 -24
  186. odxtools/xdoc.py +13 -12
  187. {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/METADATA +4 -5
  188. odxtools-10.1.0.dist-info/RECORD +265 -0
  189. {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/WHEEL +1 -1
  190. odxtools-9.7.0.dist-info/RECORD +0 -264
  191. {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/entry_points.txt +0 -0
  192. {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/licenses/LICENSE +0 -0
  193. {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/top_level.txt +0 -0
odxtools/unitspec.py CHANGED
@@ -1,11 +1,12 @@
1
1
  # SPDX-License-Identifier: MIT
2
- from dataclasses import dataclass
3
- from typing import Any, Dict, List, Optional
2
+ from dataclasses import dataclass, field
3
+ from typing import Any
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .admindata import AdminData
7
7
  from .nameditemlist import NamedItemList
8
- from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId
8
+ from .odxdoccontext import OdxDocContext
9
+ from .odxlink import OdxLinkDatabase, OdxLinkId
9
10
  from .physicaldimension import PhysicalDimension
10
11
  from .snrefcontext import SnRefContext
11
12
  from .specialdatagroup import SpecialDataGroup
@@ -13,7 +14,7 @@ from .unit import Unit
13
14
  from .unitgroup import UnitGroup
14
15
 
15
16
 
16
- @dataclass
17
+ @dataclass(kw_only=True)
17
18
  class UnitSpec:
18
19
  """
19
20
  A unit spec encapsulates three lists:
@@ -25,11 +26,11 @@ class UnitSpec:
25
26
  The following odx elements are not internalized: ADMIN-DATA, SDGS
26
27
  """
27
28
 
28
- admin_data: Optional[AdminData]
29
- unit_groups: NamedItemList[UnitGroup]
30
- units: NamedItemList[Unit]
31
- physical_dimensions: NamedItemList[PhysicalDimension]
32
- sdgs: List[SpecialDataGroup]
29
+ admin_data: AdminData | None = None
30
+ unit_groups: NamedItemList[UnitGroup] = field(default_factory=NamedItemList)
31
+ units: NamedItemList[Unit] = field(default_factory=NamedItemList)
32
+ physical_dimensions: NamedItemList[PhysicalDimension] = field(default_factory=NamedItemList)
33
+ sdgs: list[SpecialDataGroup] = field(default_factory=list)
33
34
 
34
35
  def __post_init__(self) -> None:
35
36
  self.unit_groups = NamedItemList(self.unit_groups)
@@ -37,21 +38,19 @@ class UnitSpec:
37
38
  self.physical_dimensions = NamedItemList(self.physical_dimensions)
38
39
 
39
40
  @staticmethod
40
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "UnitSpec":
41
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "UnitSpec":
41
42
 
42
- admin_data = AdminData.from_et(et_element.find("ADMIN-DATA"), doc_frags)
43
+ admin_data = AdminData.from_et(et_element.find("ADMIN-DATA"), context)
43
44
  unit_groups = NamedItemList([
44
- UnitGroup.from_et(el, doc_frags) for el in et_element.iterfind("UNIT-GROUPS/UNIT-GROUP")
45
+ UnitGroup.from_et(el, context) for el in et_element.iterfind("UNIT-GROUPS/UNIT-GROUP")
45
46
  ])
46
47
  units = NamedItemList(
47
- [Unit.from_et(el, doc_frags) for el in et_element.iterfind("UNITS/UNIT")])
48
+ [Unit.from_et(el, context) for el in et_element.iterfind("UNITS/UNIT")])
48
49
  physical_dimensions = NamedItemList([
49
- PhysicalDimension.from_et(el, doc_frags)
50
+ PhysicalDimension.from_et(el, context)
50
51
  for el in et_element.iterfind("PHYSICAL-DIMENSIONS/PHYSICAL-DIMENSION")
51
52
  ])
52
- sdgs = [
53
- SpecialDataGroup.from_et(sdge, doc_frags) for sdge in et_element.iterfind("SDGS/SDG")
54
- ]
53
+ sdgs = [SpecialDataGroup.from_et(sdge, context) for sdge in et_element.iterfind("SDGS/SDG")]
55
54
 
56
55
  return UnitSpec(
57
56
  admin_data=admin_data,
@@ -60,8 +59,8 @@ class UnitSpec:
60
59
  physical_dimensions=physical_dimensions,
61
60
  sdgs=sdgs)
62
61
 
63
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
64
- odxlinks: Dict[OdxLinkId, Any] = {}
62
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
63
+ odxlinks: dict[OdxLinkId, Any] = {}
65
64
  for unit in self.units:
66
65
  odxlinks.update(unit._build_odxlinks())
67
66
  for dim in self.physical_dimensions:
odxtools/utils.py CHANGED
@@ -1,7 +1,7 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  import dataclasses
3
3
  import re
4
- from typing import TYPE_CHECKING, Any, Dict, Optional
4
+ from typing import TYPE_CHECKING, Any, Optional
5
5
  from xml.etree import ElementTree
6
6
 
7
7
  from .exceptions import odxraise
@@ -12,7 +12,7 @@ if TYPE_CHECKING:
12
12
  from .snrefcontext import SnRefContext
13
13
 
14
14
 
15
- def read_hex_binary(et_element: Optional[ElementTree.Element]) -> Optional[int]:
15
+ def read_hex_binary(et_element: ElementTree.Element | None) -> int | None:
16
16
  """Convert the contents of an xsd:hexBinary to an integer
17
17
  """
18
18
  if et_element is None:
@@ -76,7 +76,7 @@ def retarget_snrefs(database: "Database",
76
76
  retarget_snrefs(database, pr.layer, context)
77
77
 
78
78
 
79
- def dataclass_fields_asdict(obj: Any) -> Dict[str, Any]:
79
+ def dataclass_fields_asdict(obj: Any) -> dict[str, Any]:
80
80
  """Extract all attributes from a dataclass object that are fields.
81
81
 
82
82
  This is a non-recursive version of `dataclasses.asdict()`. Its
odxtools/variablegroup.py CHANGED
@@ -1,12 +1,12 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  import typing
3
3
  from dataclasses import dataclass
4
- from typing import TYPE_CHECKING, List, runtime_checkable
4
+ from typing import TYPE_CHECKING, runtime_checkable
5
5
  from xml.etree import ElementTree
6
6
 
7
7
  from .element import IdentifiableElement, NamedElement
8
8
  from .nameditemlist import NamedItemList
9
- from .odxlink import OdxDocFragment
9
+ from .odxdoccontext import OdxDocContext
10
10
  from .utils import dataclass_fields_asdict
11
11
 
12
12
  if TYPE_CHECKING:
@@ -21,12 +21,11 @@ class HasVariableGroups(typing.Protocol):
21
21
  ...
22
22
 
23
23
 
24
- @dataclass
24
+ @dataclass(kw_only=True)
25
25
  class VariableGroup(IdentifiableElement):
26
26
 
27
27
  @staticmethod
28
- def from_et(et_element: ElementTree.Element,
29
- doc_frags: List[OdxDocFragment]) -> "VariableGroup":
30
- kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, doc_frags))
28
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "VariableGroup":
29
+ kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, context))
31
30
 
32
31
  return VariableGroup(**kwargs)
@@ -1,7 +1,7 @@
1
1
  # SPDX-License-Identifier: MIT
2
+ from collections.abc import Generator
2
3
  from copy import copy
3
4
  from enum import Enum
4
- from typing import Dict, Generator, List, Optional, Tuple, Union
5
5
 
6
6
  from .diaglayers.basevariant import BaseVariant
7
7
  from .diaglayers.ecuvariant import EcuVariant
@@ -56,18 +56,18 @@ class VariantMatcher:
56
56
  MATCH = 2
57
57
 
58
58
  def __init__(self,
59
- variant_candidates: Union[List[EcuVariant], List[BaseVariant]],
59
+ variant_candidates: list[EcuVariant] | list[BaseVariant],
60
60
  use_cache: bool = True):
61
61
 
62
62
  self.variant_candidates = variant_candidates
63
63
  self.use_cache = use_cache
64
- self.req_resp_cache: Dict[bytes, bytes] = {}
65
- self._recent_ident_response: Optional[bytes] = None
64
+ self.req_resp_cache: dict[bytes, bytes] = {}
65
+ self._recent_ident_response: bytes | None = None
66
66
 
67
67
  self._state = VariantMatcher.State.PENDING
68
- self._matching_variant: Optional[Union[EcuVariant, BaseVariant]] = None
68
+ self._matching_variant: EcuVariant | BaseVariant | None = None
69
69
 
70
- def request_loop(self) -> Generator[Tuple[bool, bytes], None, None]:
70
+ def request_loop(self) -> Generator[tuple[bool, bytes], None, None]:
71
71
  """The request loop yielding tuples of byte sequences of
72
72
  requests and the whether physical addressing ought to be used
73
73
  to send them
@@ -86,7 +86,7 @@ class VariantMatcher:
86
86
 
87
87
  self._matching_variant = None
88
88
  for variant in self.variant_candidates:
89
- variant_patterns: Union[List[EcuVariantPattern], List[BaseVariantPattern]]
89
+ variant_patterns: list[EcuVariantPattern] | list[BaseVariantPattern]
90
90
  if isinstance(variant, EcuVariant):
91
91
  variant_patterns = variant.ecu_variant_patterns
92
92
  elif isinstance(variant, BaseVariant):
@@ -158,13 +158,13 @@ class VariantMatcher:
158
158
  return self._state == VariantMatcher.State.MATCH
159
159
 
160
160
  @property
161
- def matching_variant(self) -> Optional[Union[EcuVariant, BaseVariant]]:
161
+ def matching_variant(self) -> EcuVariant | BaseVariant | None:
162
162
  """Returns the matched, i.e., active ecu variant if such a variant has been found."""
163
163
  return self._matching_variant
164
164
 
165
165
  def _ident_response_matches(
166
166
  self,
167
- variant: Union[EcuVariant, BaseVariant],
167
+ variant: EcuVariant | BaseVariant,
168
168
  matching_param: MatchingParameter,
169
169
  response_bytes: bytes,
170
170
  ) -> bool:
@@ -175,7 +175,7 @@ class VariantMatcher:
175
175
 
176
176
  # ISO 22901 requires that snref or snpathref is resolvable in
177
177
  # at least one POS-RESPONSE or NEG-RESPONSE
178
- all_responses: List[Response] = []
178
+ all_responses: list[Response] = []
179
179
  all_responses.extend(service.positive_responses)
180
180
  all_responses.extend(service.negative_responses)
181
181
  all_responses.extend(variant.global_negative_responses)
@@ -1,18 +1,18 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import TYPE_CHECKING, List, Union
3
+ from typing import TYPE_CHECKING
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .exceptions import odxraise
7
7
  from .matchingparameter import MatchingParameter
8
- from .odxlink import OdxDocFragment
8
+ from .odxdoccontext import OdxDocContext
9
9
 
10
10
  if TYPE_CHECKING:
11
11
  from .matchingbasevariantparameter import MatchingBaseVariantParameter
12
12
  from .matchingparameter import MatchingParameter
13
13
 
14
14
 
15
- @dataclass
15
+ @dataclass(kw_only=True)
16
16
  class VariantPattern:
17
17
  """Variant patterns are used to identify the concrete variant of an ECU
18
18
 
@@ -26,13 +26,12 @@ class VariantPattern:
26
26
  """
27
27
 
28
28
  def get_matching_parameters(
29
- self) -> Union[List["MatchingParameter"], List["MatchingBaseVariantParameter"]]:
29
+ self) -> list["MatchingParameter"] | list["MatchingBaseVariantParameter"]:
30
30
  odxraise(
31
31
  f"VariantPattern subclass `{type(self).__name__}` does not "
32
32
  f"implement `.get_match_parameters()`", RuntimeError)
33
33
  return []
34
34
 
35
35
  @staticmethod
36
- def from_et(et_element: ElementTree.Element,
37
- doc_frags: List[OdxDocFragment]) -> "VariantPattern":
36
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "VariantPattern":
38
37
  return VariantPattern()
odxtools/version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '9.7.0'
21
- __version_tuple__ = version_tuple = (9, 7, 0)
20
+ __version__ = version = '10.1.0'
21
+ __version_tuple__ = version_tuple = (10, 1, 0)
odxtools/writepdxfile.py CHANGED
@@ -5,7 +5,7 @@ import mimetypes
5
5
  import os
6
6
  import time
7
7
  import zipfile
8
- from typing import Any, Dict, Optional
8
+ from typing import Any
9
9
 
10
10
  import jinja2
11
11
 
@@ -14,39 +14,21 @@ import odxtools
14
14
  from .database import Database
15
15
  from .odxtypes import bool_to_odxstr
16
16
 
17
- odxdatabase: Optional[Database] = None
17
+ odxdatabase: Database | None = None
18
18
 
19
19
 
20
20
  def jinja2_odxraise_helper(msg: str) -> None:
21
21
  raise Exception(msg)
22
22
 
23
23
 
24
- def get_parent_container_name(dl_short_name: str) -> str:
25
- """
26
- Given the short name of a diagnostic layer, return the name of a container
27
- which the layer is part of.
28
-
29
- If no such container exists, a `RuntimeException` is thrown.
30
- """
31
-
32
- assert odxdatabase is not None
33
-
34
- for dlc in odxdatabase.diag_layer_containers:
35
- if dl_short_name in [dl.short_name for dl in dlc.diag_layers]:
36
- return dlc.short_name
37
-
38
- raise RuntimeError(f"get_parent_container_name() could not determine a "
39
- f"container for diagnostic layer '{dl_short_name}'.")
40
-
41
-
42
- def make_xml_attrib(attrib_name: str, attrib_val: Optional[Any]) -> str:
24
+ def make_xml_attrib(attrib_name: str, attrib_val: Any | None) -> str:
43
25
  if attrib_val is None:
44
26
  return ""
45
27
 
46
28
  return f' {attrib_name}="{attrib_val}"'
47
29
 
48
30
 
49
- def make_bool_xml_attrib(attrib_name: str, attrib_val: Optional[bool]) -> str:
31
+ def make_bool_xml_attrib(attrib_name: str, attrib_val: bool | None) -> str:
50
32
  if attrib_val is None:
51
33
  return ""
52
34
 
@@ -145,9 +127,8 @@ def write_pdx_file(
145
127
  jinja_env.globals["odxraise"] = jinja2_odxraise_helper
146
128
  jinja_env.globals["make_xml_attrib"] = make_xml_attrib
147
129
  jinja_env.globals["make_bool_xml_attrib"] = make_bool_xml_attrib
148
- jinja_env.globals["get_parent_container_name"] = get_parent_container_name
149
130
 
150
- vars: Dict[str, Any] = {}
131
+ vars: dict[str, Any] = {}
151
132
  vars["odxtools_version"] = odxtools.__version__
152
133
  vars["database"] = database
153
134
 
odxtools/xdoc.py CHANGED
@@ -1,26 +1,27 @@
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 NamedElement
7
- from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId
7
+ from .odxdoccontext import OdxDocContext
8
+ from .odxlink import OdxLinkDatabase, OdxLinkId
8
9
  from .snrefcontext import SnRefContext
9
10
  from .utils import dataclass_fields_asdict
10
11
 
11
12
 
12
- @dataclass
13
+ @dataclass(kw_only=True)
13
14
  class XDoc(NamedElement):
14
- number: Optional[str]
15
- state: Optional[str]
16
- date: Optional[str]
17
- publisher: Optional[str]
18
- url: Optional[str]
19
- position: Optional[str]
15
+ number: str | None = None
16
+ state: str | None = None
17
+ date: str | None = None
18
+ publisher: str | None = None
19
+ url: str | None = None
20
+ position: str | None = None
20
21
 
21
22
  @staticmethod
22
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "XDoc":
23
- kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, doc_frags))
23
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "XDoc":
24
+ kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, context))
24
25
  number = et_element.findtext("NUMBER")
25
26
  state = et_element.findtext("STATE")
26
27
  date = et_element.findtext("DATE")
@@ -37,7 +38,7 @@ class XDoc(NamedElement):
37
38
  position=position,
38
39
  **kwargs)
39
40
 
40
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
41
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
41
42
  return {}
42
43
 
43
44
  def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: odxtools
3
- Version: 9.7.0
3
+ Version: 10.1.0
4
4
  Summary: Utilities to work with the ODX standard for automotive diagnostics
5
5
  Author-email: Katrin Bauer <katrin.bauer@mbition.io>, Andreas Lauser <andreas.lauser@mbition.io>, Ayoub Kaanich <kayoub5@live.com>
6
6
  Maintainer-email: Andreas Lauser <andreas.lauser@mbition.io>, Ayoub Kaanich <kayoub5@live.com>
@@ -10,16 +10,16 @@ Project-URL: Bug Tracker, https://github.com/mercedes-benz/odxtools/issues
10
10
  Project-URL: Repository, https://github.com/mercedes-benz/odxtools
11
11
  Keywords: can,can bus,DoIP,odx,pdx,obd,uds,automotive,diagnostics
12
12
  Classifier: Programming Language :: Python :: 3
13
- Classifier: Programming Language :: Python :: 3.8
14
- Classifier: Programming Language :: Python :: 3.9
15
13
  Classifier: Programming Language :: Python :: 3.10
16
14
  Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
17
  Classifier: Development Status :: 5 - Production/Stable
18
18
  Classifier: Environment :: Console
19
19
  Classifier: Intended Audience :: Developers
20
20
  Classifier: License :: OSI Approved :: MIT License
21
21
  Classifier: Operating System :: OS Independent
22
- Requires-Python: >=3.8
22
+ Requires-Python: >=3.10
23
23
  Description-Content-Type: text/markdown
24
24
  License-File: LICENSE
25
25
  Requires-Dist: bitstruct>=8.17
@@ -35,7 +35,6 @@ Provides-Extra: browse-tool
35
35
  Requires-Dist: InquirerPy>=0.3.4; extra == "browse-tool"
36
36
  Provides-Extra: test
37
37
  Requires-Dist: mypy>=1.5; extra == "test"
38
- Requires-Dist: types-tabulate>=0.9.0.3; extra == "test"
39
38
  Requires-Dist: ruff>=0.0.290; extra == "test"
40
39
  Requires-Dist: pytest>=7.4; extra == "test"
41
40
  Requires-Dist: coverage>=7.3; extra == "test"