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.
- odxtools/additionalaudience.py +7 -7
- odxtools/admindata.py +14 -13
- odxtools/audience.py +17 -17
- odxtools/basecomparam.py +9 -8
- odxtools/basevariantpattern.py +9 -10
- odxtools/basicstructure.py +15 -15
- odxtools/cli/_print_utils.py +34 -22
- odxtools/cli/browse.py +8 -8
- odxtools/cli/compare.py +24 -24
- odxtools/cli/decode.py +3 -4
- odxtools/cli/find.py +4 -5
- odxtools/cli/list.py +6 -6
- odxtools/cli/main.py +2 -2
- odxtools/cli/snoop.py +3 -3
- odxtools/codec.py +3 -3
- odxtools/commrelation.py +18 -17
- odxtools/companydata.py +13 -13
- odxtools/companydocinfo.py +15 -17
- odxtools/companyrevisioninfo.py +9 -9
- odxtools/companyspecificinfo.py +11 -13
- odxtools/comparam.py +8 -7
- odxtools/comparaminstance.py +14 -14
- odxtools/comparamspec.py +10 -11
- odxtools/comparamsubset.py +17 -25
- odxtools/complexcomparam.py +14 -14
- odxtools/complexdop.py +1 -1
- odxtools/compositecodec.py +8 -8
- odxtools/compumethods/compucodecompumethod.py +7 -7
- odxtools/compumethods/compuconst.py +5 -6
- odxtools/compumethods/compudefaultvalue.py +2 -3
- odxtools/compumethods/compuinternaltophys.py +13 -12
- odxtools/compumethods/compumethod.py +10 -9
- odxtools/compumethods/compuphystointernal.py +13 -12
- odxtools/compumethods/compurationalcoeffs.py +7 -7
- odxtools/compumethods/compuscale.py +15 -16
- odxtools/compumethods/createanycompumethod.py +12 -13
- odxtools/compumethods/identicalcompumethod.py +4 -5
- odxtools/compumethods/limit.py +14 -14
- odxtools/compumethods/linearcompumethod.py +5 -5
- odxtools/compumethods/linearsegment.py +10 -11
- odxtools/compumethods/ratfunccompumethod.py +6 -6
- odxtools/compumethods/ratfuncsegment.py +7 -8
- odxtools/compumethods/scalelinearcompumethod.py +9 -9
- odxtools/compumethods/scaleratfunccompumethod.py +7 -7
- odxtools/compumethods/tabintpcompumethod.py +10 -13
- odxtools/compumethods/texttablecompumethod.py +6 -6
- odxtools/createanycomparam.py +5 -7
- odxtools/createanydiagcodedtype.py +7 -8
- odxtools/database.py +34 -31
- odxtools/dataobjectproperty.py +19 -20
- odxtools/decodestate.py +5 -5
- odxtools/description.py +9 -9
- odxtools/determinenumberofitems.py +8 -7
- odxtools/diagcodedtype.py +10 -10
- odxtools/diagcomm.py +29 -30
- odxtools/diagdatadictionaryspec.py +36 -36
- odxtools/diaglayercontainer.py +35 -34
- odxtools/diaglayers/basevariant.py +14 -12
- odxtools/diaglayers/basevariantraw.py +22 -23
- odxtools/diaglayers/diaglayer.py +24 -22
- odxtools/diaglayers/diaglayerraw.py +43 -52
- odxtools/diaglayers/diaglayertype.py +1 -2
- odxtools/diaglayers/ecushareddata.py +9 -9
- odxtools/diaglayers/ecushareddataraw.py +15 -16
- odxtools/diaglayers/ecuvariant.py +15 -13
- odxtools/diaglayers/ecuvariantraw.py +21 -22
- odxtools/diaglayers/functionalgroup.py +12 -11
- odxtools/diaglayers/functionalgroupraw.py +17 -18
- odxtools/diaglayers/hierarchyelement.py +48 -54
- odxtools/diaglayers/hierarchyelementraw.py +10 -11
- odxtools/diaglayers/protocol.py +7 -7
- odxtools/diaglayers/protocolraw.py +13 -14
- odxtools/diagnostictroublecode.py +15 -17
- odxtools/diagservice.py +28 -27
- odxtools/diagvariable.py +24 -25
- odxtools/docrevision.py +18 -17
- odxtools/dopbase.py +13 -14
- odxtools/dtcconnector.py +8 -7
- odxtools/dtcdop.py +24 -20
- odxtools/dynamicendmarkerfield.py +10 -9
- odxtools/dynamiclengthfield.py +10 -9
- odxtools/dyndefinedspec.py +10 -10
- odxtools/dynenddopref.py +9 -9
- odxtools/dyniddefmodeinfo.py +21 -21
- odxtools/ecuvariantpattern.py +8 -10
- odxtools/element.py +12 -13
- odxtools/encodestate.py +11 -11
- odxtools/encoding.py +2 -3
- odxtools/endofpdufield.py +9 -10
- odxtools/envdataconnector.py +8 -8
- odxtools/environmentdata.py +7 -9
- odxtools/environmentdatadescription.py +18 -17
- odxtools/exceptions.py +5 -5
- odxtools/externalaccessmethod.py +4 -6
- odxtools/externaldoc.py +6 -6
- odxtools/field.py +15 -15
- odxtools/functionalclass.py +9 -9
- odxtools/inputparam.py +11 -10
- odxtools/internalconstr.py +10 -11
- odxtools/isotp_state_machine.py +12 -11
- odxtools/leadinglengthinfotype.py +4 -6
- odxtools/library.py +9 -8
- odxtools/linkeddtcdop.py +9 -8
- odxtools/loadfile.py +5 -6
- odxtools/matchingbasevariantparameter.py +5 -6
- odxtools/matchingparameter.py +10 -10
- odxtools/message.py +1 -1
- odxtools/minmaxlengthtype.py +6 -7
- odxtools/modification.py +7 -6
- odxtools/multiplexer.py +54 -18
- odxtools/multiplexercase.py +13 -13
- odxtools/multiplexerdefaultcase.py +11 -10
- odxtools/multiplexerswitchkey.py +8 -8
- odxtools/nameditemlist.py +13 -13
- odxtools/negoutputparam.py +8 -8
- odxtools/obd.py +1 -2
- odxtools/odxcategory.py +14 -26
- odxtools/odxdoccontext.py +16 -0
- odxtools/odxlink.py +23 -25
- odxtools/odxtypes.py +18 -15
- odxtools/outputparam.py +9 -8
- odxtools/parameterinfo.py +1 -1
- odxtools/parameters/codedconstparameter.py +10 -10
- odxtools/parameters/createanyparameter.py +15 -16
- odxtools/parameters/dynamicparameter.py +5 -7
- odxtools/parameters/lengthkeyparameter.py +10 -10
- odxtools/parameters/matchingrequestparameter.py +6 -7
- odxtools/parameters/nrcconstparameter.py +13 -13
- odxtools/parameters/parameter.py +17 -18
- odxtools/parameters/parameterwithdop.py +13 -13
- odxtools/parameters/physicalconstantparameter.py +8 -7
- odxtools/parameters/reservedparameter.py +6 -8
- odxtools/parameters/systemparameter.py +5 -7
- odxtools/parameters/tableentryparameter.py +8 -8
- odxtools/parameters/tablekeyparameter.py +17 -17
- odxtools/parameters/tablestructparameter.py +11 -11
- odxtools/parameters/valueparameter.py +11 -11
- odxtools/paramlengthinfotype.py +10 -9
- odxtools/parentref.py +15 -13
- odxtools/physicaldimension.py +15 -15
- odxtools/physicaltype.py +5 -6
- odxtools/posresponsesuppressible.py +11 -12
- odxtools/preconditionstateref.py +11 -11
- odxtools/progcode.py +11 -10
- odxtools/protstack.py +10 -9
- odxtools/relateddiagcommref.py +5 -6
- odxtools/relateddoc.py +11 -10
- odxtools/request.py +18 -19
- odxtools/response.py +19 -20
- odxtools/scaleconstr.py +8 -9
- odxtools/servicebinner.py +5 -5
- odxtools/singleecujob.py +16 -15
- odxtools/snrefcontext.py +3 -3
- odxtools/specialdata.py +8 -7
- odxtools/specialdatagroup.py +17 -17
- odxtools/specialdatagroupcaption.py +7 -6
- odxtools/standardlengthtype.py +14 -22
- odxtools/state.py +7 -6
- odxtools/statechart.py +12 -11
- odxtools/statemachine.py +4 -3
- odxtools/statetransition.py +9 -9
- odxtools/statetransitionref.py +19 -19
- odxtools/staticfield.py +9 -7
- odxtools/structure.py +5 -6
- odxtools/subcomponent.py +20 -18
- odxtools/subcomponentparamconnector.py +10 -9
- odxtools/subcomponentpattern.py +9 -9
- odxtools/swvariable.py +6 -7
- odxtools/table.py +25 -26
- odxtools/tablediagcommconnector.py +9 -8
- odxtools/tablerow.py +64 -43
- odxtools/tablerowconnector.py +8 -8
- odxtools/teammember.py +16 -15
- odxtools/templates/macros/printParentRef.xml.jinja2 +3 -1
- odxtools/text.py +4 -5
- odxtools/uds.py +2 -3
- odxtools/unit.py +14 -13
- odxtools/unitgroup.py +11 -10
- odxtools/unitspec.py +18 -19
- odxtools/utils.py +3 -3
- odxtools/variablegroup.py +5 -6
- odxtools/variantmatcher.py +10 -10
- odxtools/variantpattern.py +5 -6
- odxtools/version.py +2 -2
- odxtools/writepdxfile.py +5 -24
- odxtools/xdoc.py +13 -12
- {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/METADATA +4 -5
- odxtools-10.1.0.dist-info/RECORD +265 -0
- {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/WHEEL +1 -1
- odxtools-9.7.0.dist-info/RECORD +0 -264
- {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/entry_points.txt +0 -0
- {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/licenses/LICENSE +0 -0
- {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
|
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 .
|
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:
|
29
|
-
unit_groups: NamedItemList[UnitGroup]
|
30
|
-
units: NamedItemList[Unit]
|
31
|
-
physical_dimensions: NamedItemList[PhysicalDimension]
|
32
|
-
sdgs:
|
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,
|
41
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "UnitSpec":
|
41
42
|
|
42
|
-
admin_data = AdminData.from_et(et_element.find("ADMIN-DATA"),
|
43
|
+
admin_data = AdminData.from_et(et_element.find("ADMIN-DATA"), context)
|
43
44
|
unit_groups = NamedItemList([
|
44
|
-
UnitGroup.from_et(el,
|
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,
|
48
|
+
[Unit.from_et(el, context) for el in et_element.iterfind("UNITS/UNIT")])
|
48
49
|
physical_dimensions = NamedItemList([
|
49
|
-
PhysicalDimension.from_et(el,
|
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) ->
|
64
|
-
odxlinks:
|
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,
|
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:
|
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) ->
|
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,
|
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 .
|
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
|
-
|
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)
|
odxtools/variantmatcher.py
CHANGED
@@ -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:
|
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:
|
65
|
-
self._recent_ident_response:
|
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:
|
68
|
+
self._matching_variant: EcuVariant | BaseVariant | None = None
|
69
69
|
|
70
|
-
def request_loop(self) -> Generator[
|
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:
|
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) ->
|
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:
|
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:
|
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)
|
odxtools/variantpattern.py
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from dataclasses import dataclass
|
3
|
-
from typing import TYPE_CHECKING
|
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 .
|
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) ->
|
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
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
|
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:
|
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
|
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:
|
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:
|
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
|
3
|
+
from typing import Any
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from .element import NamedElement
|
7
|
-
from .
|
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:
|
15
|
-
state:
|
16
|
-
date:
|
17
|
-
publisher:
|
18
|
-
url:
|
19
|
-
position:
|
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,
|
23
|
-
kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element,
|
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) ->
|
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:
|
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.
|
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"
|