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/additionalaudience.py
CHANGED
@@ -4,21 +4,21 @@ from typing import Any
|
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from .element import IdentifiableElement
|
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 AdditionalAudience(IdentifiableElement):
|
14
15
|
"""
|
15
16
|
Corresponds to ADDITIONAL-AUDIENCE.
|
16
17
|
"""
|
17
18
|
|
18
19
|
@staticmethod
|
19
|
-
def from_et(et_element: ElementTree.Element,
|
20
|
-
|
21
|
-
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
|
20
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "AdditionalAudience":
|
21
|
+
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, context))
|
22
22
|
|
23
23
|
return AdditionalAudience(**kwargs)
|
24
24
|
|
odxtools/admindata.py
CHANGED
@@ -1,23 +1,24 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from dataclasses import dataclass
|
2
|
+
from dataclasses import dataclass, field
|
3
3
|
from typing import Any, Optional
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from .companydocinfo import CompanyDocInfo
|
7
7
|
from .docrevision import DocRevision
|
8
|
-
from .
|
8
|
+
from .odxdoccontext import OdxDocContext
|
9
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId
|
9
10
|
from .snrefcontext import SnRefContext
|
10
11
|
|
11
12
|
|
12
|
-
@dataclass
|
13
|
+
@dataclass(kw_only=True)
|
13
14
|
class AdminData:
|
14
|
-
language: str | None
|
15
|
-
company_doc_infos: list[CompanyDocInfo]
|
16
|
-
doc_revisions: list[DocRevision]
|
15
|
+
language: str | None = None
|
16
|
+
company_doc_infos: list[CompanyDocInfo] = field(default_factory=list)
|
17
|
+
doc_revisions: list[DocRevision] = field(default_factory=list)
|
17
18
|
|
18
19
|
@staticmethod
|
19
20
|
def from_et(et_element: ElementTree.Element | None,
|
20
|
-
|
21
|
+
context: OdxDocContext) -> Optional["AdminData"]:
|
21
22
|
|
22
23
|
if et_element is None:
|
23
24
|
return None
|
@@ -25,12 +26,12 @@ class AdminData:
|
|
25
26
|
language = et_element.findtext("LANGUAGE")
|
26
27
|
|
27
28
|
company_doc_infos = [
|
28
|
-
CompanyDocInfo.from_et(cdi_elem,
|
29
|
+
CompanyDocInfo.from_et(cdi_elem, context)
|
29
30
|
for cdi_elem in et_element.iterfind("COMPANY-DOC-INFOS/COMPANY-DOC-INFO")
|
30
31
|
]
|
31
32
|
|
32
33
|
doc_revisions = [
|
33
|
-
DocRevision.from_et(dr_elem,
|
34
|
+
DocRevision.from_et(dr_elem, context)
|
34
35
|
for dr_elem in et_element.iterfind("DOC-REVISIONS/DOC-REVISION")
|
35
36
|
]
|
36
37
|
|
odxtools/audience.py
CHANGED
@@ -1,25 +1,26 @@
|
|
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
|
|
6
6
|
from .additionalaudience import AdditionalAudience
|
7
7
|
from .nameditemlist import NamedItemList
|
8
|
-
from .
|
8
|
+
from .odxdoccontext import OdxDocContext
|
9
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
9
10
|
from .odxtypes import odxstr_to_bool
|
10
11
|
from .snrefcontext import SnRefContext
|
11
12
|
|
12
13
|
|
13
|
-
@dataclass
|
14
|
+
@dataclass(kw_only=True)
|
14
15
|
class Audience:
|
15
|
-
enabled_audience_refs: list[OdxLinkRef]
|
16
|
-
disabled_audience_refs: list[OdxLinkRef]
|
16
|
+
enabled_audience_refs: list[OdxLinkRef] = field(default_factory=list)
|
17
|
+
disabled_audience_refs: list[OdxLinkRef] = field(default_factory=list)
|
17
18
|
|
18
|
-
is_supplier_raw: bool | None
|
19
|
-
is_development_raw: bool | None
|
20
|
-
is_manufacturing_raw: bool | None
|
21
|
-
is_aftersales_raw: bool | None
|
22
|
-
is_aftermarket_raw: bool | None
|
19
|
+
is_supplier_raw: bool | None = None
|
20
|
+
is_development_raw: bool | None = None
|
21
|
+
is_manufacturing_raw: bool | None = None
|
22
|
+
is_aftersales_raw: bool | None = None
|
23
|
+
is_aftermarket_raw: bool | None = None
|
23
24
|
|
24
25
|
@property
|
25
26
|
def is_supplier(self) -> bool:
|
@@ -50,15 +51,14 @@ class Audience:
|
|
50
51
|
return self._disabled_audiences
|
51
52
|
|
52
53
|
@staticmethod
|
53
|
-
def from_et(et_element: ElementTree.Element,
|
54
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "Audience":
|
54
55
|
|
55
56
|
enabled_audience_refs = [
|
56
|
-
OdxLinkRef.from_et(ref,
|
57
|
-
|
58
|
-
"ENABLED-AUDIENCE-REF")
|
57
|
+
OdxLinkRef.from_et(ref, context) for ref in et_element.iterfind("ENABLED-AUDIENCE-REFS/"
|
58
|
+
"ENABLED-AUDIENCE-REF")
|
59
59
|
]
|
60
60
|
disabled_audience_refs = [
|
61
|
-
OdxLinkRef.from_et(ref,
|
61
|
+
OdxLinkRef.from_et(ref, context)
|
62
62
|
for ref in et_element.iterfind("DISABLED-AUDIENCE-REFS/"
|
63
63
|
"DISABLED-AUDIENCE-REF")
|
64
64
|
]
|
odxtools/basecomparam.py
CHANGED
@@ -5,23 +5,24 @@ from xml.etree import ElementTree
|
|
5
5
|
|
6
6
|
from .element import IdentifiableElement
|
7
7
|
from .exceptions import odxraise, odxrequire
|
8
|
-
from .
|
8
|
+
from .odxdoccontext import OdxDocContext
|
9
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId
|
9
10
|
from .snrefcontext import SnRefContext
|
10
11
|
from .standardizationlevel import StandardizationLevel
|
11
12
|
from .usage import Usage
|
12
13
|
from .utils import dataclass_fields_asdict
|
13
14
|
|
14
15
|
|
15
|
-
@dataclass
|
16
|
+
@dataclass(kw_only=True)
|
16
17
|
class BaseComparam(IdentifiableElement):
|
17
18
|
param_class: str
|
18
19
|
cptype: StandardizationLevel
|
19
|
-
display_level: int | None
|
20
|
-
cpusage: Usage | None # Required in ODX 2.2, missing in ODX 2.0
|
20
|
+
display_level: int | None = None
|
21
|
+
cpusage: Usage | None = None # Required in ODX 2.2, missing in ODX 2.0
|
21
22
|
|
22
23
|
@staticmethod
|
23
|
-
def from_et(et_element: ElementTree.Element,
|
24
|
-
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element,
|
24
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "BaseComparam":
|
25
|
+
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, context))
|
25
26
|
|
26
27
|
param_class = odxrequire(et_element.attrib.get("PARAM-CLASS"))
|
27
28
|
|
odxtools/basevariantpattern.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,23 +7,23 @@ 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 BaseVariantPattern(VariantPattern):
|
16
16
|
"""Base variant patterns are variant patterns used to identify the
|
17
17
|
base variant of an ECU.
|
18
18
|
"""
|
19
|
-
matching_base_variant_parameters: list[MatchingBaseVariantParameter]
|
19
|
+
matching_base_variant_parameters: list[MatchingBaseVariantParameter] = field(
|
20
|
+
default_factory=list)
|
20
21
|
|
21
22
|
@staticmethod
|
22
|
-
def from_et(et_element: ElementTree.Element,
|
23
|
-
doc_frags: list[OdxDocFragment]) -> "BaseVariantPattern":
|
23
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "BaseVariantPattern":
|
24
24
|
|
25
25
|
matching_base_variant_parameters = [
|
26
|
-
MatchingBaseVariantParameter.from_et(mbvp_el,
|
26
|
+
MatchingBaseVariantParameter.from_et(mbvp_el, context)
|
27
27
|
for mbvp_el in et_element.iterfind("MATCHING-BASE-VARIANT-PARAMETERS/"
|
28
28
|
"MATCHING-BASE-VARIANT-PARAMETER")
|
29
29
|
]
|
odxtools/basicstructure.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
|
|
@@ -14,7 +14,8 @@ from .decodestate import DecodeState
|
|
14
14
|
from .encodestate import EncodeState
|
15
15
|
from .exceptions import DecodeError, odxraise
|
16
16
|
from .nameditemlist import NamedItemList
|
17
|
-
from .
|
17
|
+
from .odxdoccontext import OdxDocContext
|
18
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId
|
18
19
|
from .odxtypes import ParameterValue
|
19
20
|
from .parameters.createanyparameter import create_any_parameter_from_et
|
20
21
|
from .parameters.parameter import Parameter
|
@@ -22,7 +23,7 @@ from .snrefcontext import SnRefContext
|
|
22
23
|
from .utils import dataclass_fields_asdict
|
23
24
|
|
24
25
|
|
25
|
-
@dataclass
|
26
|
+
@dataclass(kw_only=True)
|
26
27
|
class BasicStructure(ComplexDop):
|
27
28
|
"""Base class for structure-like objects
|
28
29
|
|
@@ -30,8 +31,8 @@ class BasicStructure(ComplexDop):
|
|
30
31
|
data objects. All structure-like objects adhere to the
|
31
32
|
`CompositeCodec` type protocol.
|
32
33
|
"""
|
33
|
-
byte_size: int | None
|
34
|
-
parameters: NamedItemList[Parameter]
|
34
|
+
byte_size: int | None = None
|
35
|
+
parameters: NamedItemList[Parameter] = field(default_factory=NamedItemList)
|
35
36
|
|
36
37
|
@property
|
37
38
|
def required_parameters(self) -> list[Parameter]:
|
@@ -42,15 +43,14 @@ class BasicStructure(ComplexDop):
|
|
42
43
|
return composite_codec_get_free_parameters(self)
|
43
44
|
|
44
45
|
@staticmethod
|
45
|
-
def from_et(et_element: ElementTree.Element,
|
46
|
-
doc_frags: list[OdxDocFragment]) -> "BasicStructure":
|
46
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "BasicStructure":
|
47
47
|
"""Read a BASIC-STRUCTURE."""
|
48
|
-
kwargs = dataclass_fields_asdict(ComplexDop.from_et(et_element,
|
48
|
+
kwargs = dataclass_fields_asdict(ComplexDop.from_et(et_element, context))
|
49
49
|
|
50
50
|
byte_size_str = et_element.findtext("BYTE-SIZE")
|
51
51
|
byte_size = int(byte_size_str) if byte_size_str is not None else None
|
52
52
|
parameters = NamedItemList([
|
53
|
-
create_any_parameter_from_et(et_parameter,
|
53
|
+
create_any_parameter_from_et(et_parameter, context)
|
54
54
|
for et_parameter in et_element.iterfind("PARAMS/PARAM")
|
55
55
|
])
|
56
56
|
|
odxtools/cli/_print_utils.py
CHANGED
@@ -214,7 +214,7 @@ def extract_parameter_tabulation_data(parameters: list[Parameter]) -> RichTable:
|
|
214
214
|
value_column.append(str(param.coded_values))
|
215
215
|
value_type_column.append('coded values')
|
216
216
|
dop_column.append("")
|
217
|
-
elif isinstance(param, PhysicalConstantParameter
|
217
|
+
elif isinstance(param, (PhysicalConstantParameter, SystemParameter, ValueParameter)):
|
218
218
|
# this is a hack to make this routine work for parameters
|
219
219
|
# which reference DOPs of a type that a is not yet
|
220
220
|
# internalized. (all parameter objects of the tested types
|
odxtools/cli/browse.py
CHANGED
@@ -370,7 +370,7 @@ def browse(odxdb: Database) -> None:
|
|
370
370
|
|
371
371
|
codec = answer.get("message_type")
|
372
372
|
if codec is not None:
|
373
|
-
assert isinstance(codec, Request
|
373
|
+
assert isinstance(codec, (Request, Response))
|
374
374
|
table = extract_parameter_tabulation_data(codec.parameters)
|
375
375
|
print(table)
|
376
376
|
|
odxtools/cli/list.py
CHANGED
@@ -61,7 +61,7 @@ def print_summary(odxdb: Database,
|
|
61
61
|
|
62
62
|
all_services: list[DiagComm] = sorted(dl.services, key=lambda x: x.short_name)
|
63
63
|
|
64
|
-
if isinstance(dl, BaseVariant
|
64
|
+
if isinstance(dl, (BaseVariant, EcuVariant)):
|
65
65
|
for proto in dl.protocols:
|
66
66
|
if (can_rx_id := dl.get_can_receive_id(proto.short_name)) is not None:
|
67
67
|
rich.print(
|
odxtools/commrelation.py
CHANGED
@@ -9,22 +9,23 @@ from .description import Description
|
|
9
9
|
from .diagcomm import DiagComm
|
10
10
|
from .diagservice import DiagService
|
11
11
|
from .exceptions import OdxWarning, odxraise, odxrequire
|
12
|
-
from .
|
12
|
+
from .odxdoccontext import OdxDocContext
|
13
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef, resolve_snref
|
13
14
|
from .parameters.parameter import Parameter
|
14
15
|
from .snrefcontext import SnRefContext
|
15
16
|
|
16
17
|
|
17
|
-
@dataclass
|
18
|
+
@dataclass(kw_only=True)
|
18
19
|
class CommRelation:
|
19
|
-
description: Description | None
|
20
|
+
description: Description | None = None
|
20
21
|
relation_type: str
|
21
|
-
diag_comm_ref: OdxLinkRef | None
|
22
|
-
diag_comm_snref: str | None
|
23
|
-
in_param_if_snref: str | None
|
24
|
-
#in_param_if_snpathref: Optional[str] # TODO
|
25
|
-
out_param_if_snref: str | None
|
26
|
-
#out_param_if_snpathref: Optional[str] # TODO
|
27
|
-
value_type_raw: CommRelationValueType | None
|
22
|
+
diag_comm_ref: OdxLinkRef | None = None
|
23
|
+
diag_comm_snref: str | None = None
|
24
|
+
in_param_if_snref: str | None = None
|
25
|
+
#in_param_if_snpathref: Optional[str] = None # TODO
|
26
|
+
out_param_if_snref: str | None = None
|
27
|
+
#out_param_if_snpathref: Optional[str] = None # TODO
|
28
|
+
value_type_raw: CommRelationValueType | None = None
|
28
29
|
|
29
30
|
@property
|
30
31
|
def diag_comm(self) -> DiagComm:
|
@@ -46,11 +47,11 @@ class CommRelation:
|
|
46
47
|
return self.value_type_raw
|
47
48
|
|
48
49
|
@staticmethod
|
49
|
-
def from_et(et_element: ElementTree.Element,
|
50
|
-
description = Description.from_et(et_element.find("DESC"),
|
50
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "CommRelation":
|
51
|
+
description = Description.from_et(et_element.find("DESC"), context)
|
51
52
|
relation_type = odxrequire(et_element.findtext("RELATION-TYPE"))
|
52
53
|
|
53
|
-
diag_comm_ref = OdxLinkRef.from_et(et_element.find("DIAG-COMM-REF"),
|
54
|
+
diag_comm_ref = OdxLinkRef.from_et(et_element.find("DIAG-COMM-REF"), context)
|
54
55
|
diag_comm_snref = None
|
55
56
|
if (diag_comm_snref_elem := et_element.find("DIAG-COMM-SNREF")) is not None:
|
56
57
|
diag_comm_snref = odxrequire(diag_comm_snref_elem.get("SHORT-NAME"))
|
odxtools/companydata.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,34 +7,34 @@ from .companyspecificinfo import CompanySpecificInfo
|
|
7
7
|
from .element import IdentifiableElement
|
8
8
|
from .exceptions import odxrequire
|
9
9
|
from .nameditemlist import NamedItemList
|
10
|
-
from .
|
10
|
+
from .odxdoccontext import OdxDocContext
|
11
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId
|
11
12
|
from .snrefcontext import SnRefContext
|
12
13
|
from .teammember import TeamMember
|
13
14
|
from .utils import dataclass_fields_asdict
|
14
15
|
|
15
16
|
|
16
|
-
@dataclass
|
17
|
+
@dataclass(kw_only=True)
|
17
18
|
class CompanyData(IdentifiableElement):
|
18
|
-
roles: list[str]
|
19
|
-
team_members: NamedItemList[TeamMember]
|
20
|
-
company_specific_info: CompanySpecificInfo | None
|
19
|
+
roles: list[str] = field(default_factory=list)
|
20
|
+
team_members: NamedItemList[TeamMember] = field(default_factory=NamedItemList)
|
21
|
+
company_specific_info: CompanySpecificInfo | None = None
|
21
22
|
|
22
23
|
@staticmethod
|
23
|
-
def from_et(et_element: ElementTree.Element,
|
24
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "CompanyData":
|
24
25
|
|
25
|
-
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element,
|
26
|
+
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, context))
|
26
27
|
|
27
28
|
roles = []
|
28
29
|
if (roles_elem := et_element.find("ROLES")) is not None:
|
29
30
|
roles = [odxrequire(role.text) for role in roles_elem.iterfind("ROLE")]
|
30
31
|
team_members = [
|
31
|
-
TeamMember.from_et(tm,
|
32
|
+
TeamMember.from_et(tm, context)
|
32
33
|
for tm in et_element.iterfind("TEAM-MEMBERS/TEAM-MEMBER")
|
33
34
|
]
|
34
35
|
company_specific_info = None
|
35
36
|
if (company_specific_info_elem := et_element.find("COMPANY-SPECIFIC-INFO")) is not None:
|
36
|
-
company_specific_info = CompanySpecificInfo.from_et(company_specific_info_elem,
|
37
|
-
doc_frags)
|
37
|
+
company_specific_info = CompanySpecificInfo.from_et(company_specific_info_elem, context)
|
38
38
|
|
39
39
|
return CompanyData(
|
40
40
|
roles=roles,
|
odxtools/companydocinfo.py
CHANGED
@@ -1,22 +1,23 @@
|
|
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
|
|
6
6
|
from .companydata import CompanyData
|
7
7
|
from .exceptions import odxrequire
|
8
|
-
from .
|
8
|
+
from .odxdoccontext import OdxDocContext
|
9
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
9
10
|
from .snrefcontext import SnRefContext
|
10
11
|
from .specialdatagroup import SpecialDataGroup
|
11
12
|
from .teammember import TeamMember
|
12
13
|
|
13
14
|
|
14
|
-
@dataclass
|
15
|
+
@dataclass(kw_only=True)
|
15
16
|
class CompanyDocInfo:
|
16
17
|
company_data_ref: OdxLinkRef
|
17
|
-
team_member_ref: OdxLinkRef | None
|
18
|
-
doc_label: str | None
|
19
|
-
sdgs: list[SpecialDataGroup]
|
18
|
+
team_member_ref: OdxLinkRef | None = None
|
19
|
+
doc_label: str | None = None
|
20
|
+
sdgs: list[SpecialDataGroup] = field(default_factory=list)
|
20
21
|
|
21
22
|
@property
|
22
23
|
def company_data(self) -> CompanyData:
|
@@ -27,16 +28,13 @@ class CompanyDocInfo:
|
|
27
28
|
return self._team_member
|
28
29
|
|
29
30
|
@staticmethod
|
30
|
-
def from_et(et_element: ElementTree.Element,
|
31
|
-
doc_frags: list[OdxDocFragment]) -> "CompanyDocInfo":
|
31
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "CompanyDocInfo":
|
32
32
|
# the company data reference is mandatory
|
33
33
|
company_data_ref = odxrequire(
|
34
|
-
OdxLinkRef.from_et(et_element.find("COMPANY-DATA-REF"),
|
35
|
-
team_member_ref = OdxLinkRef.from_et(et_element.find("TEAM-MEMBER-REF"),
|
34
|
+
OdxLinkRef.from_et(et_element.find("COMPANY-DATA-REF"), context))
|
35
|
+
team_member_ref = OdxLinkRef.from_et(et_element.find("TEAM-MEMBER-REF"), context)
|
36
36
|
doc_label = et_element.findtext("DOC-LABEL")
|
37
|
-
sdgs = [
|
38
|
-
SpecialDataGroup.from_et(sdge, doc_frags) for sdge in et_element.iterfind("SDGS/SDG")
|
39
|
-
]
|
37
|
+
sdgs = [SpecialDataGroup.from_et(sdge, context) for sdge in et_element.iterfind("SDGS/SDG")]
|
40
38
|
|
41
39
|
return CompanyDocInfo(
|
42
40
|
company_data_ref=company_data_ref,
|
odxtools/companyrevisioninfo.py
CHANGED
@@ -5,26 +5,26 @@ from xml.etree import ElementTree
|
|
5
5
|
|
6
6
|
from .companydata import CompanyData
|
7
7
|
from .exceptions import odxrequire
|
8
|
-
from .
|
8
|
+
from .odxdoccontext import OdxDocContext
|
9
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
9
10
|
from .snrefcontext import SnRefContext
|
10
11
|
|
11
12
|
|
12
|
-
@dataclass
|
13
|
+
@dataclass(kw_only=True)
|
13
14
|
class CompanyRevisionInfo:
|
14
15
|
company_data_ref: OdxLinkRef
|
15
|
-
revision_label: str | None
|
16
|
-
state: str | None
|
16
|
+
revision_label: str | None = None
|
17
|
+
state: str | None = None
|
17
18
|
|
18
19
|
@property
|
19
20
|
def company_data(self) -> CompanyData:
|
20
21
|
return self._company_data
|
21
22
|
|
22
23
|
@staticmethod
|
23
|
-
def from_et(et_element: ElementTree.Element,
|
24
|
-
doc_frags: list[OdxDocFragment]) -> "CompanyRevisionInfo":
|
24
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "CompanyRevisionInfo":
|
25
25
|
|
26
26
|
company_data_ref = odxrequire(
|
27
|
-
OdxLinkRef.from_et(et_element.find("COMPANY-DATA-REF"),
|
27
|
+
OdxLinkRef.from_et(et_element.find("COMPANY-DATA-REF"), context))
|
28
28
|
revision_label = et_element.findtext("REVISION-LABEL")
|
29
29
|
state = et_element.findtext("STATE")
|
30
30
|
|
odxtools/companyspecificinfo.py
CHANGED
@@ -1,30 +1,28 @@
|
|
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
|
|
6
|
-
from .
|
6
|
+
from .odxdoccontext import OdxDocContext
|
7
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId
|
7
8
|
from .relateddoc import RelatedDoc
|
8
9
|
from .snrefcontext import SnRefContext
|
9
10
|
from .specialdatagroup import SpecialDataGroup
|
10
11
|
|
11
12
|
|
12
|
-
@dataclass
|
13
|
+
@dataclass(kw_only=True)
|
13
14
|
class CompanySpecificInfo:
|
14
|
-
related_docs: list[RelatedDoc]
|
15
|
-
sdgs: list[SpecialDataGroup]
|
15
|
+
related_docs: list[RelatedDoc] = field(default_factory=list)
|
16
|
+
sdgs: list[SpecialDataGroup] = field(default_factory=list)
|
16
17
|
|
17
18
|
@staticmethod
|
18
|
-
def from_et(et_element: ElementTree.Element,
|
19
|
-
doc_frags: list[OdxDocFragment]) -> "CompanySpecificInfo":
|
19
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "CompanySpecificInfo":
|
20
20
|
related_docs = [
|
21
|
-
RelatedDoc.from_et(rd,
|
21
|
+
RelatedDoc.from_et(rd, context)
|
22
22
|
for rd in et_element.iterfind("RELATED-DOCS/RELATED-DOC")
|
23
23
|
]
|
24
24
|
|
25
|
-
sdgs = [
|
26
|
-
SpecialDataGroup.from_et(sdge, doc_frags) for sdge in et_element.iterfind("SDGS/SDG")
|
27
|
-
]
|
25
|
+
sdgs = [SpecialDataGroup.from_et(sdge, context) for sdge in et_element.iterfind("SDGS/SDG")]
|
28
26
|
|
29
27
|
return CompanySpecificInfo(related_docs=related_docs, sdgs=sdgs)
|
30
28
|
|
odxtools/comparam.py
CHANGED
@@ -6,13 +6,14 @@ from xml.etree import ElementTree
|
|
6
6
|
from .basecomparam import BaseComparam
|
7
7
|
from .dataobjectproperty import DataObjectProperty
|
8
8
|
from .exceptions import odxrequire
|
9
|
-
from .
|
9
|
+
from .odxdoccontext import OdxDocContext
|
10
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
10
11
|
from .odxtypes import AtomicOdxType
|
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 Comparam(BaseComparam):
|
17
18
|
physical_default_value_raw: str
|
18
19
|
dop_ref: OdxLinkRef
|
@@ -27,11 +28,11 @@ class Comparam(BaseComparam):
|
|
27
28
|
return self._dop
|
28
29
|
|
29
30
|
@staticmethod
|
30
|
-
def from_et(et_element: ElementTree.Element,
|
31
|
-
kwargs = dataclass_fields_asdict(BaseComparam.from_et(et_element,
|
31
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "Comparam":
|
32
|
+
kwargs = dataclass_fields_asdict(BaseComparam.from_et(et_element, context))
|
32
33
|
|
33
34
|
physical_default_value_raw = odxrequire(et_element.findtext("PHYSICAL-DEFAULT-VALUE"))
|
34
|
-
dop_ref = odxrequire(OdxLinkRef.from_et(et_element.find("DATA-OBJECT-PROP-REF"),
|
35
|
+
dop_ref = odxrequire(OdxLinkRef.from_et(et_element.find("DATA-OBJECT-PROP-REF"), context))
|
35
36
|
|
36
37
|
return Comparam(
|
37
38
|
dop_ref=dop_ref, physical_default_value_raw=physical_default_value_raw, **kwargs)
|
odxtools/comparaminstance.py
CHANGED
@@ -9,11 +9,12 @@ from .comparam import Comparam
|
|
9
9
|
from .complexcomparam import ComplexComparam, ComplexValue, create_complex_value_from_et
|
10
10
|
from .description import Description
|
11
11
|
from .exceptions import OdxWarning, odxraise, odxrequire
|
12
|
-
from .
|
12
|
+
from .odxdoccontext import OdxDocContext
|
13
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
13
14
|
from .snrefcontext import SnRefContext
|
14
15
|
|
15
16
|
|
16
|
-
@dataclass
|
17
|
+
@dataclass(kw_only=True)
|
17
18
|
class ComparamInstance:
|
18
19
|
"""
|
19
20
|
This class represents a communication parameter.
|
@@ -21,9 +22,9 @@ class ComparamInstance:
|
|
21
22
|
Be aware that the ODX specification calls this class COMPARAM-REF!
|
22
23
|
"""
|
23
24
|
value: str | ComplexValue
|
24
|
-
description: Description | None
|
25
|
-
protocol_snref: str | None
|
26
|
-
prot_stack_snref: str | None
|
25
|
+
description: Description | None = None
|
26
|
+
protocol_snref: str | None = None
|
27
|
+
prot_stack_snref: str | None = None
|
27
28
|
spec_ref: OdxLinkRef
|
28
29
|
|
29
30
|
@property
|
@@ -35,9 +36,8 @@ class ComparamInstance:
|
|
35
36
|
return self.spec.short_name
|
36
37
|
|
37
38
|
@staticmethod
|
38
|
-
def from_et(et_element: ElementTree.Element,
|
39
|
-
|
40
|
-
spec_ref = odxrequire(OdxLinkRef.from_et(et_element, doc_frags))
|
39
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "ComparamInstance":
|
40
|
+
spec_ref = odxrequire(OdxLinkRef.from_et(et_element, context))
|
41
41
|
|
42
42
|
# ODX standard v2.0.0 defined only VALUE. ODX v2.0.1 decided
|
43
43
|
# to break things and change it to a choice between SIMPLE-VALUE
|
@@ -50,7 +50,7 @@ class ComparamInstance:
|
|
50
50
|
else:
|
51
51
|
value = create_complex_value_from_et(odxrequire(et_element.find("COMPLEX-VALUE")))
|
52
52
|
|
53
|
-
description = Description.from_et(et_element.find("DESC"),
|
53
|
+
description = Description.from_et(et_element.find("DESC"), context)
|
54
54
|
|
55
55
|
protocol_snref = None
|
56
56
|
if (psnref_elem := et_element.find("PROTOCOL-SNREF")) is not None:
|
@@ -133,7 +133,7 @@ class ComparamInstance:
|
|
133
133
|
return None
|
134
134
|
|
135
135
|
result = value_list[idx]
|
136
|
-
if result is None and isinstance(subparam, Comparam
|
136
|
+
if result is None and isinstance(subparam, (Comparam, ComplexComparam)):
|
137
137
|
result = subparam.physical_default_value
|
138
138
|
if not isinstance(result, str):
|
139
139
|
odxraise()
|
odxtools/comparamspec.py
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from dataclasses import dataclass
|
2
|
+
from dataclasses import dataclass, field
|
3
3
|
from typing import TYPE_CHECKING, Any
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from .nameditemlist import NamedItemList
|
7
7
|
from .odxcategory import OdxCategory
|
8
|
-
from .
|
8
|
+
from .odxdoccontext import OdxDocContext
|
9
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId
|
9
10
|
from .protstack import ProtStack
|
10
11
|
from .snrefcontext import SnRefContext
|
11
12
|
from .utils import dataclass_fields_asdict
|
@@ -14,21 +15,19 @@ if TYPE_CHECKING:
|
|
14
15
|
from .database import Database
|
15
16
|
|
16
17
|
|
17
|
-
@dataclass
|
18
|
+
@dataclass(kw_only=True)
|
18
19
|
class ComparamSpec(OdxCategory):
|
19
20
|
|
20
|
-
prot_stacks: NamedItemList[ProtStack]
|
21
|
+
prot_stacks: NamedItemList[ProtStack] = field(default_factory=NamedItemList)
|
21
22
|
|
22
23
|
@staticmethod
|
23
|
-
def from_et(et_element: ElementTree.Element,
|
24
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "ComparamSpec":
|
24
25
|
|
25
|
-
base_obj = OdxCategory.
|
26
|
-
et_element, doc_frags, doc_type=DocType.COMPARAM_SPEC)
|
27
|
-
doc_frags = base_obj.odx_id.doc_fragments
|
26
|
+
base_obj = OdxCategory.from_et(et_element, context)
|
28
27
|
kwargs = dataclass_fields_asdict(base_obj)
|
29
28
|
|
30
29
|
prot_stacks = NamedItemList([
|
31
|
-
ProtStack.from_et(dl_element,
|
30
|
+
ProtStack.from_et(dl_element, context)
|
32
31
|
for dl_element in et_element.iterfind("PROT-STACKS/PROT-STACK")
|
33
32
|
])
|
34
33
|
|