odxtools 10.0.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 +5 -5
- odxtools/admindata.py +10 -9
- odxtools/audience.py +15 -15
- odxtools/basecomparam.py +7 -6
- odxtools/basevariantpattern.py +7 -7
- odxtools/basicstructure.py +9 -9
- odxtools/cli/_print_utils.py +1 -1
- odxtools/cli/browse.py +1 -1
- odxtools/cli/list.py +1 -1
- odxtools/commrelation.py +14 -13
- odxtools/companydata.py +11 -11
- odxtools/companydocinfo.py +11 -13
- odxtools/companyrevisioninfo.py +7 -7
- odxtools/companyspecificinfo.py +9 -11
- odxtools/comparam.py +6 -5
- odxtools/comparaminstance.py +10 -10
- odxtools/comparamspec.py +8 -9
- odxtools/comparamsubset.py +14 -22
- odxtools/complexcomparam.py +10 -10
- odxtools/complexdop.py +1 -1
- odxtools/compositecodec.py +3 -3
- odxtools/compumethods/compucodecompumethod.py +4 -4
- odxtools/compumethods/compuconst.py +3 -3
- odxtools/compumethods/compudefaultvalue.py +2 -2
- odxtools/compumethods/compuinternaltophys.py +11 -10
- odxtools/compumethods/compumethod.py +8 -7
- odxtools/compumethods/compuphystointernal.py +11 -10
- odxtools/compumethods/compurationalcoeffs.py +6 -6
- odxtools/compumethods/compuscale.py +14 -14
- odxtools/compumethods/createanycompumethod.py +12 -12
- odxtools/compumethods/identicalcompumethod.py +4 -4
- odxtools/compumethods/limit.py +8 -8
- odxtools/compumethods/linearcompumethod.py +4 -4
- odxtools/compumethods/linearsegment.py +8 -8
- odxtools/compumethods/ratfunccompumethod.py +4 -4
- odxtools/compumethods/ratfuncsegment.py +8 -8
- odxtools/compumethods/scalelinearcompumethod.py +5 -5
- odxtools/compumethods/scaleratfunccompumethod.py +4 -4
- odxtools/compumethods/tabintpcompumethod.py +12 -12
- odxtools/compumethods/texttablecompumethod.py +4 -4
- odxtools/createanycomparam.py +4 -4
- odxtools/createanydiagcodedtype.py +7 -7
- odxtools/database.py +28 -26
- odxtools/dataobjectproperty.py +15 -16
- odxtools/description.py +7 -7
- odxtools/determinenumberofitems.py +6 -5
- odxtools/diagcodedtype.py +6 -6
- odxtools/diagcomm.py +26 -27
- odxtools/diagdatadictionaryspec.py +34 -34
- odxtools/diaglayercontainer.py +32 -31
- odxtools/diaglayers/basevariant.py +5 -4
- odxtools/diaglayers/basevariantraw.py +18 -19
- odxtools/diaglayers/diaglayer.py +5 -4
- odxtools/diaglayers/diaglayerraw.py +39 -48
- odxtools/diaglayers/ecushareddata.py +6 -6
- odxtools/diaglayers/ecushareddataraw.py +11 -12
- odxtools/diaglayers/ecuvariant.py +5 -4
- odxtools/diaglayers/ecuvariantraw.py +17 -18
- odxtools/diaglayers/functionalgroup.py +5 -5
- odxtools/diaglayers/functionalgroupraw.py +13 -14
- odxtools/diaglayers/hierarchyelement.py +9 -9
- odxtools/diaglayers/hierarchyelementraw.py +8 -9
- odxtools/diaglayers/protocol.py +4 -4
- odxtools/diaglayers/protocolraw.py +10 -11
- odxtools/diagnostictroublecode.py +12 -14
- odxtools/diagservice.py +19 -18
- odxtools/diagvariable.py +19 -20
- odxtools/docrevision.py +14 -13
- odxtools/dopbase.py +10 -11
- odxtools/dtcconnector.py +6 -5
- odxtools/dtcdop.py +15 -15
- odxtools/dynamicendmarkerfield.py +6 -6
- odxtools/dynamiclengthfield.py +6 -6
- odxtools/dyndefinedspec.py +7 -7
- odxtools/dynenddopref.py +7 -7
- odxtools/dyniddefmodeinfo.py +17 -17
- odxtools/ecuvariantpattern.py +6 -7
- odxtools/element.py +12 -12
- odxtools/endofpdufield.py +6 -7
- odxtools/envdataconnector.py +6 -6
- odxtools/environmentdata.py +7 -8
- odxtools/environmentdatadescription.py +13 -12
- odxtools/externalaccessmethod.py +4 -5
- odxtools/externaldoc.py +4 -4
- odxtools/field.py +12 -11
- odxtools/functionalclass.py +7 -7
- odxtools/inputparam.py +9 -8
- odxtools/internalconstr.py +10 -10
- odxtools/leadinglengthinfotype.py +5 -6
- odxtools/library.py +7 -6
- odxtools/linkeddtcdop.py +7 -6
- odxtools/matchingbasevariantparameter.py +5 -5
- odxtools/matchingparameter.py +6 -6
- odxtools/message.py +1 -1
- odxtools/minmaxlengthtype.py +6 -7
- odxtools/modification.py +5 -4
- odxtools/multiplexer.py +48 -12
- odxtools/multiplexercase.py +10 -10
- odxtools/multiplexerdefaultcase.py +8 -7
- odxtools/multiplexerswitchkey.py +6 -6
- odxtools/nameditemlist.py +1 -1
- odxtools/negoutputparam.py +6 -6
- odxtools/odxcategory.py +12 -24
- odxtools/odxdoccontext.py +16 -0
- odxtools/odxlink.py +11 -12
- odxtools/odxtypes.py +3 -3
- odxtools/outputparam.py +7 -6
- odxtools/parameters/codedconstparameter.py +6 -6
- odxtools/parameters/createanyparameter.py +15 -15
- odxtools/parameters/dynamicparameter.py +4 -5
- odxtools/parameters/lengthkeyparameter.py +6 -6
- odxtools/parameters/matchingrequestparameter.py +4 -4
- odxtools/parameters/nrcconstparameter.py +8 -8
- odxtools/parameters/parameter.py +12 -13
- odxtools/parameters/parameterwithdop.py +9 -9
- odxtools/parameters/physicalconstantparameter.py +5 -4
- odxtools/parameters/reservedparameter.py +4 -5
- odxtools/parameters/systemparameter.py +4 -5
- odxtools/parameters/tableentryparameter.py +6 -6
- odxtools/parameters/tablekeyparameter.py +12 -12
- odxtools/parameters/tablestructparameter.py +9 -9
- odxtools/parameters/valueparameter.py +6 -6
- odxtools/paramlengthinfotype.py +6 -7
- odxtools/parentref.py +12 -10
- odxtools/physicaldimension.py +12 -12
- odxtools/physicaltype.py +5 -5
- odxtools/posresponsesuppressible.py +11 -11
- odxtools/preconditionstateref.py +8 -8
- odxtools/progcode.py +9 -8
- odxtools/protstack.py +8 -7
- odxtools/relateddiagcommref.py +5 -5
- odxtools/relateddoc.py +8 -7
- odxtools/request.py +12 -13
- odxtools/response.py +12 -13
- odxtools/scaleconstr.py +8 -8
- odxtools/singleecujob.py +14 -13
- odxtools/snrefcontext.py +1 -1
- odxtools/specialdata.py +6 -5
- odxtools/specialdatagroup.py +13 -13
- odxtools/specialdatagroupcaption.py +5 -4
- odxtools/standardlengthtype.py +5 -13
- odxtools/state.py +5 -4
- odxtools/statechart.py +10 -9
- odxtools/statemachine.py +2 -2
- odxtools/statetransition.py +7 -7
- odxtools/statetransitionref.py +11 -11
- odxtools/staticfield.py +5 -4
- odxtools/structure.py +5 -5
- odxtools/subcomponent.py +18 -16
- odxtools/subcomponentparamconnector.py +8 -7
- odxtools/subcomponentpattern.py +7 -7
- odxtools/swvariable.py +6 -6
- odxtools/table.py +20 -21
- odxtools/tablediagcommconnector.py +7 -6
- odxtools/tablerow.py +57 -36
- odxtools/tablerowconnector.py +6 -6
- odxtools/teammember.py +14 -13
- odxtools/templates/macros/printParentRef.xml.jinja2 +3 -1
- odxtools/text.py +4 -4
- odxtools/unit.py +9 -8
- odxtools/unitgroup.py +9 -8
- odxtools/unitspec.py +15 -16
- odxtools/variablegroup.py +4 -5
- odxtools/variantpattern.py +3 -4
- odxtools/version.py +2 -2
- odxtools/writepdxfile.py +0 -19
- odxtools/xdoc.py +11 -10
- {odxtools-10.0.0.dist-info → odxtools-10.1.0.dist-info}/METADATA +1 -1
- odxtools-10.1.0.dist-info/RECORD +265 -0
- {odxtools-10.0.0.dist-info → odxtools-10.1.0.dist-info}/WHEEL +1 -1
- odxtools-10.0.0.dist-info/RECORD +0 -264
- {odxtools-10.0.0.dist-info → odxtools-10.1.0.dist-info}/entry_points.txt +0 -0
- {odxtools-10.0.0.dist-info → odxtools-10.1.0.dist-info}/licenses/LICENSE +0 -0
- {odxtools-10.0.0.dist-info → odxtools-10.1.0.dist-info}/top_level.txt +0 -0
odxtools/dynenddopref.py
CHANGED
@@ -4,34 +4,34 @@ from typing import Optional, overload
|
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from .exceptions import odxraise, odxrequire
|
7
|
-
from .
|
7
|
+
from .odxdoccontext import OdxDocContext
|
8
|
+
from .odxlink import OdxLinkRef
|
8
9
|
from .utils import dataclass_fields_asdict
|
9
10
|
|
10
11
|
|
11
|
-
@dataclass
|
12
|
+
@dataclass(kw_only=True)
|
12
13
|
class DynEndDopRef(OdxLinkRef):
|
13
14
|
termination_value_raw: str
|
14
15
|
|
15
16
|
@staticmethod
|
16
17
|
@overload
|
17
|
-
def from_et(et_element: None,
|
18
|
+
def from_et(et_element: None, context: OdxDocContext) -> None:
|
18
19
|
...
|
19
20
|
|
20
21
|
@staticmethod
|
21
22
|
@overload
|
22
|
-
def from_et(et_element: ElementTree.Element,
|
23
|
-
source_doc_frags: list[OdxDocFragment]) -> "DynEndDopRef":
|
23
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "DynEndDopRef":
|
24
24
|
...
|
25
25
|
|
26
26
|
@staticmethod
|
27
27
|
def from_et(et_element: ElementTree.Element | None,
|
28
|
-
|
28
|
+
context: OdxDocContext) -> Optional["DynEndDopRef"]:
|
29
29
|
|
30
30
|
if et_element is None:
|
31
31
|
odxraise("Mandatory DYN-END-DOP-REF tag is missing")
|
32
32
|
return None
|
33
33
|
|
34
|
-
kwargs = dataclass_fields_asdict(OdxLinkRef.from_et(et_element,
|
34
|
+
kwargs = dataclass_fields_asdict(OdxLinkRef.from_et(et_element, context))
|
35
35
|
|
36
36
|
termination_value_raw = odxrequire(et_element.findtext("TERMINATION-VALUE"))
|
37
37
|
|
odxtools/dyniddefmodeinfo.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from dataclasses import dataclass
|
2
|
+
from dataclasses import dataclass, field
|
3
3
|
from typing import Any
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
@@ -7,26 +7,27 @@ from .diagclasstype import DiagClassType
|
|
7
7
|
from .diagcomm import DiagComm
|
8
8
|
from .exceptions import odxassert, odxraise, odxrequire
|
9
9
|
from .nameditemlist import NamedItemList
|
10
|
-
from .
|
10
|
+
from .odxdoccontext import OdxDocContext
|
11
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef, resolve_snref
|
11
12
|
from .snrefcontext import SnRefContext
|
12
13
|
from .table import Table
|
13
14
|
|
14
15
|
|
15
|
-
@dataclass
|
16
|
+
@dataclass(kw_only=True)
|
16
17
|
class DynIdDefModeInfo:
|
17
18
|
def_mode: str
|
18
19
|
|
19
|
-
clear_dyn_def_message_ref: OdxLinkRef | None
|
20
|
-
clear_dyn_def_message_snref: str | None
|
20
|
+
clear_dyn_def_message_ref: OdxLinkRef | None = None
|
21
|
+
clear_dyn_def_message_snref: str | None = None
|
21
22
|
|
22
|
-
read_dyn_def_message_ref: OdxLinkRef | None
|
23
|
-
read_dyn_def_message_snref: str | None
|
23
|
+
read_dyn_def_message_ref: OdxLinkRef | None = None
|
24
|
+
read_dyn_def_message_snref: str | None = None
|
24
25
|
|
25
|
-
dyn_def_message_ref: OdxLinkRef | None
|
26
|
-
dyn_def_message_snref: str | None
|
26
|
+
dyn_def_message_ref: OdxLinkRef | None = None
|
27
|
+
dyn_def_message_snref: str | None = None
|
27
28
|
|
28
|
-
supported_dyn_ids: list[bytes]
|
29
|
-
selection_table_refs: list[OdxLinkRef | str]
|
29
|
+
supported_dyn_ids: list[bytes] = field(default_factory=list)
|
30
|
+
selection_table_refs: list[OdxLinkRef | str] = field(default_factory=list)
|
30
31
|
|
31
32
|
@property
|
32
33
|
def clear_dyn_def_message(self) -> DiagComm:
|
@@ -45,23 +46,22 @@ class DynIdDefModeInfo:
|
|
45
46
|
return self._selection_tables
|
46
47
|
|
47
48
|
@staticmethod
|
48
|
-
def from_et(et_element: ElementTree.Element,
|
49
|
-
doc_frags: list[OdxDocFragment]) -> "DynIdDefModeInfo":
|
49
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "DynIdDefModeInfo":
|
50
50
|
def_mode = odxrequire(et_element.findtext("DEF-MODE"))
|
51
51
|
|
52
52
|
clear_dyn_def_message_ref = OdxLinkRef.from_et(
|
53
|
-
et_element.find("CLEAR-DYN-DEF-MESSAGE-REF"),
|
53
|
+
et_element.find("CLEAR-DYN-DEF-MESSAGE-REF"), context)
|
54
54
|
clear_dyn_def_message_snref = None
|
55
55
|
if (snref_elem := et_element.find("CLEAR-DYN-DEF-MESSAGE-SNREF")) is not None:
|
56
56
|
clear_dyn_def_message_snref = odxrequire(snref_elem.attrib.get("SHORT-NAME"))
|
57
57
|
|
58
58
|
read_dyn_def_message_ref = OdxLinkRef.from_et(
|
59
|
-
et_element.find("READ-DYN-DEF-MESSAGE-REF"),
|
59
|
+
et_element.find("READ-DYN-DEF-MESSAGE-REF"), context)
|
60
60
|
read_dyn_def_message_snref = None
|
61
61
|
if (snref_elem := et_element.find("READ-DYN-DEF-MESSAGE-SNREF")) is not None:
|
62
62
|
read_dyn_def_message_snref = odxrequire(snref_elem.attrib.get("SHORT-NAME"))
|
63
63
|
|
64
|
-
dyn_def_message_ref = OdxLinkRef.from_et(et_element.find("DYN-DEF-MESSAGE-REF"),
|
64
|
+
dyn_def_message_ref = OdxLinkRef.from_et(et_element.find("DYN-DEF-MESSAGE-REF"), context)
|
65
65
|
dyn_def_message_snref = None
|
66
66
|
if (snref_elem := et_element.find("DYN-DEF-MESSAGE-SNREF")) is not None:
|
67
67
|
dyn_def_message_snref = odxrequire(snref_elem.attrib.get("SHORT-NAME"))
|
@@ -75,7 +75,7 @@ class DynIdDefModeInfo:
|
|
75
75
|
if (st_elems := et_element.find("SELECTION-TABLE-REFS")) is not None:
|
76
76
|
for st_elem in st_elems:
|
77
77
|
if st_elem.tag == "SELECTION-TABLE-REF":
|
78
|
-
selection_table_refs.append(OdxLinkRef.from_et(st_elem,
|
78
|
+
selection_table_refs.append(OdxLinkRef.from_et(st_elem, context))
|
79
79
|
elif st_elem.tag == "SELECTION-TABLE-SNREF":
|
80
80
|
selection_table_refs.append(odxrequire(st_elem.get("SHORT-NAME")))
|
81
81
|
else:
|
odxtools/ecuvariantpattern.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from dataclasses import dataclass
|
2
|
+
from dataclasses import dataclass, field
|
3
3
|
from xml.etree import ElementTree
|
4
4
|
|
5
5
|
from typing_extensions import override
|
@@ -7,16 +7,16 @@ from typing_extensions import override
|
|
7
7
|
from .exceptions import odxassert
|
8
8
|
from .matchingbasevariantparameter import MatchingBaseVariantParameter
|
9
9
|
from .matchingparameter import MatchingParameter
|
10
|
-
from .
|
10
|
+
from .odxdoccontext import OdxDocContext
|
11
11
|
from .variantpattern import VariantPattern
|
12
12
|
|
13
13
|
|
14
|
-
@dataclass
|
14
|
+
@dataclass(kw_only=True)
|
15
15
|
class EcuVariantPattern(VariantPattern):
|
16
16
|
"""ECU variant patterns are variant patterns used to identify the
|
17
17
|
concrete variant of an ECU.
|
18
18
|
"""
|
19
|
-
matching_parameters: list[MatchingParameter]
|
19
|
+
matching_parameters: list[MatchingParameter] = field(default_factory=list)
|
20
20
|
|
21
21
|
@override
|
22
22
|
def get_matching_parameters(self
|
@@ -24,11 +24,10 @@ class EcuVariantPattern(VariantPattern):
|
|
24
24
|
return self.matching_parameters
|
25
25
|
|
26
26
|
@staticmethod
|
27
|
-
def from_et(et_element: ElementTree.Element,
|
28
|
-
doc_frags: list[OdxDocFragment]) -> "EcuVariantPattern":
|
27
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "EcuVariantPattern":
|
29
28
|
|
30
29
|
matching_parameters = [
|
31
|
-
MatchingParameter.from_et(mp_el,
|
30
|
+
MatchingParameter.from_et(mp_el, context)
|
32
31
|
for mp_el in et_element.iterfind("MATCHING-PARAMETERS/"
|
33
32
|
"MATCHING-PARAMETER")
|
34
33
|
]
|
odxtools/element.py
CHANGED
@@ -3,38 +3,38 @@ from xml.etree import ElementTree
|
|
3
3
|
|
4
4
|
from .description import Description
|
5
5
|
from .exceptions import odxrequire
|
6
|
-
from .
|
6
|
+
from .odxdoccontext import OdxDocContext
|
7
|
+
from .odxlink import OdxLinkId
|
7
8
|
from .utils import dataclass_fields_asdict
|
8
9
|
|
9
10
|
|
10
|
-
@dataclass
|
11
|
+
@dataclass(kw_only=True)
|
11
12
|
class NamedElement:
|
12
13
|
short_name: str
|
13
|
-
long_name: str | None
|
14
|
-
description: Description | None
|
14
|
+
long_name: str | None = None
|
15
|
+
description: Description | None = None
|
15
16
|
|
16
17
|
@staticmethod
|
17
|
-
def from_et(et_element: ElementTree.Element,
|
18
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "NamedElement":
|
18
19
|
|
19
20
|
return NamedElement(
|
20
21
|
short_name=odxrequire(et_element.findtext("SHORT-NAME")),
|
21
22
|
long_name=et_element.findtext("LONG-NAME"),
|
22
|
-
description=Description.from_et(et_element.find("DESC"),
|
23
|
+
description=Description.from_et(et_element.find("DESC"), context),
|
23
24
|
)
|
24
25
|
|
25
26
|
|
26
|
-
@dataclass
|
27
|
+
@dataclass(kw_only=True)
|
27
28
|
class IdentifiableElement(NamedElement):
|
28
29
|
odx_id: OdxLinkId
|
29
|
-
oid: str | None
|
30
|
+
oid: str | None = None
|
30
31
|
|
31
32
|
@staticmethod
|
32
|
-
def from_et(et_element: ElementTree.Element,
|
33
|
-
doc_frags: list[OdxDocFragment]) -> "IdentifiableElement":
|
33
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "IdentifiableElement":
|
34
34
|
|
35
|
-
kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element,
|
35
|
+
kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, context))
|
36
36
|
|
37
|
-
odx_id = odxrequire(OdxLinkId.from_et(et_element,
|
37
|
+
odx_id = odxrequire(OdxLinkId.from_et(et_element, context))
|
38
38
|
oid = et_element.get("OID")
|
39
39
|
|
40
40
|
return IdentifiableElement(**kwargs, odx_id=odx_id, oid=oid)
|
odxtools/endofpdufield.py
CHANGED
@@ -9,21 +9,20 @@ from .decodestate import DecodeState
|
|
9
9
|
from .encodestate import EncodeState
|
10
10
|
from .exceptions import EncodeError, odxassert, odxraise
|
11
11
|
from .field import Field
|
12
|
-
from .
|
12
|
+
from .odxdoccontext import OdxDocContext
|
13
13
|
from .odxtypes import ParameterValue
|
14
14
|
from .utils import dataclass_fields_asdict
|
15
15
|
|
16
16
|
|
17
|
-
@dataclass
|
17
|
+
@dataclass(kw_only=True)
|
18
18
|
class EndOfPduField(Field):
|
19
19
|
"""End of PDU fields are structures that are repeated until the end of the PDU"""
|
20
|
-
max_number_of_items: int | None
|
21
|
-
min_number_of_items: int | None
|
20
|
+
max_number_of_items: int | None = None
|
21
|
+
min_number_of_items: int | None = None
|
22
22
|
|
23
23
|
@staticmethod
|
24
|
-
def from_et(et_element: ElementTree.Element,
|
25
|
-
|
26
|
-
kwargs = dataclass_fields_asdict(Field.from_et(et_element, doc_frags))
|
24
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "EndOfPduField":
|
25
|
+
kwargs = dataclass_fields_asdict(Field.from_et(et_element, context))
|
27
26
|
|
28
27
|
if (max_n_str := et_element.findtext("MAX-NUMBER-OF-ITEMS")) is not None:
|
29
28
|
max_number_of_items = int(max_n_str)
|
odxtools/envdataconnector.py
CHANGED
@@ -7,12 +7,13 @@ from .element import NamedElement
|
|
7
7
|
from .environmentdata import EnvironmentData
|
8
8
|
from .environmentdatadescription import EnvironmentDataDescription
|
9
9
|
from .exceptions import odxrequire
|
10
|
-
from .
|
10
|
+
from .odxdoccontext import OdxDocContext
|
11
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef, resolve_snref
|
11
12
|
from .snrefcontext import SnRefContext
|
12
13
|
from .utils import dataclass_fields_asdict
|
13
14
|
|
14
15
|
|
15
|
-
@dataclass
|
16
|
+
@dataclass(kw_only=True)
|
16
17
|
class EnvDataConnector(NamedElement):
|
17
18
|
env_data_desc_ref: OdxLinkRef
|
18
19
|
env_data_snref: str
|
@@ -26,12 +27,11 @@ class EnvDataConnector(NamedElement):
|
|
26
27
|
return self._env_data
|
27
28
|
|
28
29
|
@staticmethod
|
29
|
-
def from_et(et_element: ElementTree.Element,
|
30
|
-
|
31
|
-
kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, doc_frags))
|
30
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "EnvDataConnector":
|
31
|
+
kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, context))
|
32
32
|
|
33
33
|
env_data_desc_ref = odxrequire(
|
34
|
-
OdxLinkRef.from_et(et_element.find("ENV-DATA-DESC-REF"),
|
34
|
+
OdxLinkRef.from_et(et_element.find("ENV-DATA-DESC-REF"), context))
|
35
35
|
env_data_snref_el = odxrequire(et_element.find("ENV-DATA-SNREF"))
|
36
36
|
env_data_snref = odxrequire(env_data_snref_el.get("SHORT-NAME"))
|
37
37
|
|
odxtools/environmentdata.py
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from dataclasses import dataclass
|
2
|
+
from dataclasses import dataclass, field
|
3
3
|
from xml.etree import ElementTree
|
4
4
|
|
5
5
|
from .basicstructure import BasicStructure
|
6
6
|
from .exceptions import odxrequire
|
7
|
-
from .
|
7
|
+
from .odxdoccontext import OdxDocContext
|
8
8
|
from .utils import dataclass_fields_asdict
|
9
9
|
|
10
10
|
|
11
|
-
@dataclass
|
11
|
+
@dataclass(kw_only=True)
|
12
12
|
class EnvironmentData(BasicStructure):
|
13
13
|
"""This class represents Environment Data that describes the
|
14
14
|
circumstances in which the error occurred.
|
@@ -19,14 +19,13 @@ class EnvironmentData(BasicStructure):
|
|
19
19
|
sense, it is quite similar to NRC-CONST parameters.)
|
20
20
|
"""
|
21
21
|
|
22
|
-
all_value: bool | None
|
23
|
-
dtc_values: list[int]
|
22
|
+
all_value: bool | None = None
|
23
|
+
dtc_values: list[int] = field(default_factory=list)
|
24
24
|
|
25
25
|
@staticmethod
|
26
|
-
def from_et(et_element: ElementTree.Element,
|
27
|
-
doc_frags: list[OdxDocFragment]) -> "EnvironmentData":
|
26
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "EnvironmentData":
|
28
27
|
"""Reads Environment Data from Diag Layer."""
|
29
|
-
kwargs = dataclass_fields_asdict(BasicStructure.from_et(et_element,
|
28
|
+
kwargs = dataclass_fields_asdict(BasicStructure.from_et(et_element, context))
|
30
29
|
|
31
30
|
all_value_elem = et_element.find("ALL-VALUE")
|
32
31
|
all_value = None if all_value_elem is None else True
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from dataclasses import dataclass
|
2
|
+
from dataclasses import dataclass, field
|
3
3
|
from typing import Any
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
@@ -13,7 +13,8 @@ from .encodestate import EncodeState
|
|
13
13
|
from .environmentdata import EnvironmentData
|
14
14
|
from .exceptions import odxraise, odxrequire
|
15
15
|
from .nameditemlist import NamedItemList
|
16
|
-
from .
|
16
|
+
from .odxdoccontext import OdxDocContext
|
17
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
17
18
|
from .odxtypes import DataType, ParameterValue, ParameterValueDict
|
18
19
|
from .parameters.codedconstparameter import CodedConstParameter
|
19
20
|
from .parameters.parameter import Parameter
|
@@ -24,7 +25,7 @@ from .snrefcontext import SnRefContext
|
|
24
25
|
from .utils import dataclass_fields_asdict
|
25
26
|
|
26
27
|
|
27
|
-
@dataclass
|
28
|
+
@dataclass(kw_only=True)
|
28
29
|
class EnvironmentDataDescription(ComplexDop):
|
29
30
|
"""This class represents environment data descriptions
|
30
31
|
|
@@ -35,20 +36,20 @@ class EnvironmentDataDescription(ComplexDop):
|
|
35
36
|
|
36
37
|
"""
|
37
38
|
|
38
|
-
param_snref: str | None
|
39
|
-
param_snpathref: str | None
|
39
|
+
param_snref: str | None = None
|
40
|
+
param_snpathref: str | None = None
|
40
41
|
|
41
42
|
# in ODX 2.0.0, ENV-DATAS seems to be a mandatory
|
42
43
|
# sub-element of ENV-DATA-DESC, in ODX 2.2 it is not
|
43
44
|
# present
|
44
|
-
env_datas: NamedItemList[EnvironmentData]
|
45
|
-
env_data_refs: list[OdxLinkRef]
|
45
|
+
env_datas: NamedItemList[EnvironmentData] = field(default_factory=NamedItemList)
|
46
|
+
env_data_refs: list[OdxLinkRef] = field(default_factory=list)
|
46
47
|
|
47
48
|
@staticmethod
|
48
49
|
def from_et(et_element: ElementTree.Element,
|
49
|
-
|
50
|
+
context: OdxDocContext) -> "EnvironmentDataDescription":
|
50
51
|
"""Reads Environment Data Description from Diag Layer."""
|
51
|
-
kwargs = dataclass_fields_asdict(ComplexDop.from_et(et_element,
|
52
|
+
kwargs = dataclass_fields_asdict(ComplexDop.from_et(et_element, context))
|
52
53
|
|
53
54
|
param_snref = None
|
54
55
|
if (param_snref_elem := et_element.find("PARAM-SNREF")) is not None:
|
@@ -63,11 +64,11 @@ class EnvironmentDataDescription(ComplexDop):
|
|
63
64
|
# empty and one non-empty list here. (Which is which depends
|
64
65
|
# on the version of the standard used by the file.)
|
65
66
|
env_datas = NamedItemList([
|
66
|
-
EnvironmentData.from_et(env_data_elem,
|
67
|
+
EnvironmentData.from_et(env_data_elem, context)
|
67
68
|
for env_data_elem in et_element.iterfind("ENV-DATAS/ENV-DATA")
|
68
69
|
])
|
69
70
|
env_data_refs = [
|
70
|
-
odxrequire(OdxLinkRef.from_et(env_data_ref,
|
71
|
+
odxrequire(OdxLinkRef.from_et(env_data_ref, context))
|
71
72
|
for env_data_ref in et_element.iterfind("ENV-DATA-REFS/ENV-DATA-REF")
|
72
73
|
]
|
73
74
|
|
@@ -207,7 +208,7 @@ class EnvironmentDataDescription(ComplexDop):
|
|
207
208
|
param_value: ParameterValue | None) -> int:
|
208
209
|
if isinstance(param, ParameterWithDOP):
|
209
210
|
dop = param.dop
|
210
|
-
if not isinstance(dop, DataObjectProperty
|
211
|
+
if not isinstance(dop, (DataObjectProperty, DtcDop)):
|
211
212
|
odxraise(f"The DOP of the parameter referenced by environment data descriptions "
|
212
213
|
f"must use either be DataObjectProperty or a DtcDop (encountered "
|
213
214
|
f"{type(param).__name__} for parameter '{param.short_name}' "
|
odxtools/externalaccessmethod.py
CHANGED
@@ -4,18 +4,17 @@ from xml.etree import ElementTree
|
|
4
4
|
|
5
5
|
from .element import IdentifiableElement
|
6
6
|
from .exceptions import odxrequire
|
7
|
-
from .
|
7
|
+
from .odxdoccontext import OdxDocContext
|
8
8
|
from .utils import dataclass_fields_asdict
|
9
9
|
|
10
10
|
|
11
|
-
@dataclass
|
11
|
+
@dataclass(kw_only=True)
|
12
12
|
class ExternalAccessMethod(IdentifiableElement):
|
13
13
|
method: str
|
14
14
|
|
15
15
|
@staticmethod
|
16
|
-
def from_et(et_element: ElementTree.Element,
|
17
|
-
|
18
|
-
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
|
16
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "ExternalAccessMethod":
|
17
|
+
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, context))
|
19
18
|
|
20
19
|
method = odxrequire(et_element.findtext("METHOD"))
|
21
20
|
|
odxtools/externaldoc.py
CHANGED
@@ -3,17 +3,17 @@ from typing import Optional
|
|
3
3
|
from xml.etree import ElementTree
|
4
4
|
|
5
5
|
from .exceptions import odxrequire
|
6
|
-
from .
|
6
|
+
from .odxdoccontext import OdxDocContext
|
7
7
|
|
8
8
|
|
9
|
-
@dataclass
|
9
|
+
@dataclass(kw_only=True)
|
10
10
|
class ExternalDoc:
|
11
|
-
description: str | None
|
11
|
+
description: str | None = None
|
12
12
|
href: str
|
13
13
|
|
14
14
|
@staticmethod
|
15
15
|
def from_et(et_element: ElementTree.Element | None,
|
16
|
-
|
16
|
+
context: OdxDocContext) -> Optional["ExternalDoc"]:
|
17
17
|
if et_element is None:
|
18
18
|
return None
|
19
19
|
|
odxtools/field.py
CHANGED
@@ -6,19 +6,20 @@ from .basicstructure import BasicStructure
|
|
6
6
|
from .complexdop import ComplexDop
|
7
7
|
from .environmentdatadescription import EnvironmentDataDescription
|
8
8
|
from .exceptions import odxassert, odxrequire
|
9
|
-
from .
|
9
|
+
from .odxdoccontext import OdxDocContext
|
10
|
+
from .odxlink import OdxLinkDatabase, OdxLinkRef, resolve_snref
|
10
11
|
from .odxtypes import odxstr_to_bool
|
11
12
|
from .snrefcontext import SnRefContext
|
12
13
|
from .utils import dataclass_fields_asdict
|
13
14
|
|
14
15
|
|
15
|
-
@dataclass
|
16
|
+
@dataclass(kw_only=True)
|
16
17
|
class Field(ComplexDop):
|
17
|
-
structure_ref: OdxLinkRef | None
|
18
|
-
structure_snref: str | None
|
19
|
-
env_data_desc_ref: OdxLinkRef | None
|
20
|
-
env_data_desc_snref: str | None
|
21
|
-
is_visible_raw: bool | None
|
18
|
+
structure_ref: OdxLinkRef | None = None
|
19
|
+
structure_snref: str | None = None
|
20
|
+
env_data_desc_ref: OdxLinkRef | None = None
|
21
|
+
env_data_desc_snref: str | None = None
|
22
|
+
is_visible_raw: bool | None = None
|
22
23
|
|
23
24
|
@property
|
24
25
|
def structure(self) -> BasicStructure:
|
@@ -30,15 +31,15 @@ class Field(ComplexDop):
|
|
30
31
|
return self.is_visible_raw in (None, True)
|
31
32
|
|
32
33
|
@staticmethod
|
33
|
-
def from_et(et_element: ElementTree.Element,
|
34
|
-
kwargs = dataclass_fields_asdict(ComplexDop.from_et(et_element,
|
34
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "Field":
|
35
|
+
kwargs = dataclass_fields_asdict(ComplexDop.from_et(et_element, context))
|
35
36
|
|
36
|
-
structure_ref = OdxLinkRef.from_et(et_element.find("BASIC-STRUCTURE-REF"),
|
37
|
+
structure_ref = OdxLinkRef.from_et(et_element.find("BASIC-STRUCTURE-REF"), context)
|
37
38
|
structure_snref = None
|
38
39
|
if (edsnr_elem := et_element.find("BASIC-STRUCTURE-SNREF")) is not None:
|
39
40
|
structure_snref = edsnr_elem.get("SHORT-NAME")
|
40
41
|
|
41
|
-
env_data_desc_ref = OdxLinkRef.from_et(et_element.find("ENV-DATA-DESC-REF"),
|
42
|
+
env_data_desc_ref = OdxLinkRef.from_et(et_element.find("ENV-DATA-DESC-REF"), context)
|
42
43
|
env_data_desc_snref = None
|
43
44
|
if (edsnr_elem := et_element.find("ENV-DATA-DESC-SNREF")) is not None:
|
44
45
|
env_data_desc_snref = edsnr_elem.get("SHORT-NAME")
|
odxtools/functionalclass.py
CHANGED
@@ -5,26 +5,26 @@ from xml.etree import ElementTree
|
|
5
5
|
|
6
6
|
from .admindata import AdminData
|
7
7
|
from .element import IdentifiableElement
|
8
|
-
from .
|
8
|
+
from .odxdoccontext import OdxDocContext
|
9
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId
|
9
10
|
from .snrefcontext import SnRefContext
|
10
11
|
from .utils import dataclass_fields_asdict
|
11
12
|
|
12
13
|
|
13
|
-
@dataclass
|
14
|
+
@dataclass(kw_only=True)
|
14
15
|
class FunctionalClass(IdentifiableElement):
|
15
16
|
"""
|
16
17
|
Corresponds to FUNCT-CLASS.
|
17
18
|
"""
|
18
19
|
|
19
|
-
admin_data: AdminData | None
|
20
|
+
admin_data: AdminData | None = None
|
20
21
|
|
21
22
|
@staticmethod
|
22
|
-
def from_et(et_element: ElementTree.Element,
|
23
|
-
doc_frags: list[OdxDocFragment]) -> "FunctionalClass":
|
23
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "FunctionalClass":
|
24
24
|
|
25
|
-
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element,
|
25
|
+
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, context))
|
26
26
|
|
27
|
-
admin_data = AdminData.from_et(et_element.find("ADMIN-DATA"),
|
27
|
+
admin_data = AdminData.from_et(et_element.find("ADMIN-DATA"), context)
|
28
28
|
|
29
29
|
return FunctionalClass(admin_data=admin_data, **kwargs)
|
30
30
|
|
odxtools/inputparam.py
CHANGED
@@ -8,17 +8,18 @@ from deprecation import deprecated
|
|
8
8
|
from .dopbase import DopBase
|
9
9
|
from .element import NamedElement
|
10
10
|
from .exceptions import odxrequire
|
11
|
-
from .
|
11
|
+
from .odxdoccontext import OdxDocContext
|
12
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
12
13
|
from .snrefcontext import SnRefContext
|
13
14
|
from .utils import dataclass_fields_asdict
|
14
15
|
|
15
16
|
|
16
|
-
@dataclass
|
17
|
+
@dataclass(kw_only=True)
|
17
18
|
class InputParam(NamedElement):
|
18
|
-
physical_default_value: str | None
|
19
|
+
physical_default_value: str | None = None
|
19
20
|
dop_base_ref: OdxLinkRef
|
20
|
-
oid: str | None
|
21
|
-
semantic: str | None
|
21
|
+
oid: str | None = None
|
22
|
+
semantic: str | None = None
|
22
23
|
|
23
24
|
@property
|
24
25
|
def dop(self) -> DopBase:
|
@@ -30,11 +31,11 @@ class InputParam(NamedElement):
|
|
30
31
|
return self._dop
|
31
32
|
|
32
33
|
@staticmethod
|
33
|
-
def from_et(et_element: ElementTree.Element,
|
34
|
-
kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element,
|
34
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "InputParam":
|
35
|
+
kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, context))
|
35
36
|
|
36
37
|
physical_default_value = et_element.findtext("PHYSICAL-DEFAULT-VALUE")
|
37
|
-
dop_base_ref = odxrequire(OdxLinkRef.from_et(et_element.find("DOP-BASE-REF"),
|
38
|
+
dop_base_ref = odxrequire(OdxLinkRef.from_et(et_element.find("DOP-BASE-REF"), context))
|
38
39
|
|
39
40
|
oid = et_element.get("OID")
|
40
41
|
semantic = et_element.get("SEMANTIC")
|
odxtools/internalconstr.py
CHANGED
@@ -1,37 +1,37 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from dataclasses import dataclass
|
2
|
+
from dataclasses import dataclass, field
|
3
3
|
from xml.etree import ElementTree
|
4
4
|
|
5
5
|
from .compumethods.limit import Limit
|
6
|
-
from .
|
6
|
+
from .odxdoccontext import OdxDocContext
|
7
7
|
from .odxtypes import DataType
|
8
8
|
from .scaleconstr import ScaleConstr
|
9
9
|
|
10
10
|
|
11
|
-
@dataclass
|
11
|
+
@dataclass(kw_only=True)
|
12
12
|
class InternalConstr:
|
13
13
|
"""This class represents INTERNAL-CONSTR objects.
|
14
14
|
"""
|
15
15
|
|
16
16
|
# TODO: Enforce the internal and physical constraints.
|
17
17
|
|
18
|
-
lower_limit: Limit | None
|
19
|
-
upper_limit: Limit | None
|
20
|
-
scale_constrs: list[ScaleConstr]
|
18
|
+
lower_limit: Limit | None = None
|
19
|
+
upper_limit: Limit | None = None
|
20
|
+
scale_constrs: list[ScaleConstr] = field(default_factory=list)
|
21
21
|
|
22
22
|
value_type: DataType
|
23
23
|
|
24
24
|
@staticmethod
|
25
|
-
def constr_from_et(et_element: ElementTree.Element,
|
25
|
+
def constr_from_et(et_element: ElementTree.Element, context: OdxDocContext, *,
|
26
26
|
value_type: DataType) -> "InternalConstr":
|
27
27
|
|
28
28
|
lower_limit = Limit.limit_from_et(
|
29
|
-
et_element.find("LOWER-LIMIT"),
|
29
|
+
et_element.find("LOWER-LIMIT"), context, value_type=value_type)
|
30
30
|
upper_limit = Limit.limit_from_et(
|
31
|
-
et_element.find("UPPER-LIMIT"),
|
31
|
+
et_element.find("UPPER-LIMIT"), context, value_type=value_type)
|
32
32
|
|
33
33
|
scale_constrs = [
|
34
|
-
ScaleConstr.scale_constr_from_et(sc_el,
|
34
|
+
ScaleConstr.scale_constr_from_et(sc_el, context, value_type=value_type)
|
35
35
|
for sc_el in et_element.iterfind("SCALE-CONSTRS/SCALE-CONSTR")
|
36
36
|
]
|
37
37
|
|
@@ -8,12 +8,12 @@ from .decodestate import DecodeState
|
|
8
8
|
from .diagcodedtype import DctType, DiagCodedType
|
9
9
|
from .encodestate import EncodeState
|
10
10
|
from .exceptions import EncodeError, odxassert, odxraise, odxrequire
|
11
|
-
from .
|
11
|
+
from .odxdoccontext import OdxDocContext
|
12
12
|
from .odxtypes import AtomicOdxType, DataType
|
13
13
|
from .utils import dataclass_fields_asdict
|
14
14
|
|
15
15
|
|
16
|
-
@dataclass
|
16
|
+
@dataclass(kw_only=True)
|
17
17
|
class LeadingLengthInfoType(DiagCodedType):
|
18
18
|
#: bit length of the length specifier field
|
19
19
|
#:
|
@@ -28,9 +28,8 @@ class LeadingLengthInfoType(DiagCodedType):
|
|
28
28
|
|
29
29
|
@staticmethod
|
30
30
|
@override
|
31
|
-
def from_et(et_element: ElementTree.Element,
|
32
|
-
|
33
|
-
kwargs = dataclass_fields_asdict(DiagCodedType.from_et(et_element, doc_frags))
|
31
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "LeadingLengthInfoType":
|
32
|
+
kwargs = dataclass_fields_asdict(DiagCodedType.from_et(et_element, context))
|
34
33
|
|
35
34
|
bit_length = int(odxrequire(et_element.findtext("BIT-LENGTH")))
|
36
35
|
|
@@ -52,7 +51,7 @@ class LeadingLengthInfoType(DiagCodedType):
|
|
52
51
|
@override
|
53
52
|
def encode_into_pdu(self, internal_value: AtomicOdxType, encode_state: EncodeState) -> None:
|
54
53
|
|
55
|
-
if not isinstance(internal_value, str
|
54
|
+
if not isinstance(internal_value, (str, bytes)):
|
56
55
|
odxraise(
|
57
56
|
f"LEADING-LENGTH-INFO types can only be used for strings and byte fields, "
|
58
57
|
f"not {type(internal_value).__name__}", EncodeError)
|