odxtools 9.0.0__py3-none-any.whl → 9.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/comparamspec.py +16 -54
- odxtools/comparamsubset.py +20 -61
- odxtools/database.py +18 -2
- odxtools/diaglayercontainer.py +14 -40
- odxtools/odxcategory.py +83 -0
- odxtools/parameters/lengthkeyparameter.py +1 -2
- odxtools/parameters/tablekeyparameter.py +9 -8
- odxtools/templates/comparam-spec.odx-c.xml.jinja2 +4 -21
- odxtools/templates/comparam-subset.odx-cs.xml.jinja2 +4 -22
- odxtools/templates/diag_layer_container.odx-d.xml.jinja2 +4 -25
- odxtools/templates/macros/printOdxCategory.xml.jinja2 +28 -0
- odxtools/version.py +2 -2
- {odxtools-9.0.0.dist-info → odxtools-9.1.0.dist-info}/METADATA +1 -1
- {odxtools-9.0.0.dist-info → odxtools-9.1.0.dist-info}/RECORD +18 -16
- {odxtools-9.0.0.dist-info → odxtools-9.1.0.dist-info}/LICENSE +0 -0
- {odxtools-9.0.0.dist-info → odxtools-9.1.0.dist-info}/WHEEL +0 -0
- {odxtools-9.0.0.dist-info → odxtools-9.1.0.dist-info}/entry_points.txt +0 -0
- {odxtools-9.0.0.dist-info → odxtools-9.1.0.dist-info}/top_level.txt +0 -0
odxtools/comparamspec.py
CHANGED
@@ -1,66 +1,39 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from dataclasses import dataclass
|
3
|
-
from typing import Any, Dict, List
|
3
|
+
from typing import TYPE_CHECKING, Any, Dict, List
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
|
-
from .admindata import AdminData
|
7
|
-
from .companydata import CompanyData
|
8
|
-
from .element import IdentifiableElement
|
9
|
-
from .exceptions import odxrequire
|
10
6
|
from .nameditemlist import NamedItemList
|
7
|
+
from .odxcategory import OdxCategory
|
11
8
|
from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId
|
12
9
|
from .protstack import ProtStack
|
13
10
|
from .snrefcontext import SnRefContext
|
14
|
-
from .specialdatagroup import SpecialDataGroup
|
15
11
|
from .utils import dataclass_fields_asdict
|
16
12
|
|
13
|
+
if TYPE_CHECKING:
|
14
|
+
from .database import Database
|
15
|
+
|
17
16
|
|
18
17
|
@dataclass
|
19
|
-
class ComparamSpec(
|
20
|
-
admin_data: Optional[AdminData]
|
21
|
-
company_datas: NamedItemList[CompanyData]
|
22
|
-
sdgs: List[SpecialDataGroup]
|
18
|
+
class ComparamSpec(OdxCategory):
|
23
19
|
prot_stacks: NamedItemList[ProtStack]
|
24
20
|
|
25
21
|
@staticmethod
|
26
22
|
def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "ComparamSpec":
|
27
23
|
|
28
|
-
|
29
|
-
doc_frags =
|
30
|
-
kwargs = dataclass_fields_asdict(
|
24
|
+
cat = OdxCategory.category_from_et(et_element, doc_frags, doc_type="COMPARAM-SPEC")
|
25
|
+
doc_frags = cat.odx_id.doc_fragments
|
26
|
+
kwargs = dataclass_fields_asdict(cat)
|
31
27
|
|
32
|
-
admin_data = AdminData.from_et(et_element.find("ADMIN-DATA"), doc_frags)
|
33
|
-
company_datas = NamedItemList([
|
34
|
-
CompanyData.from_et(cde, doc_frags)
|
35
|
-
for cde in et_element.iterfind("COMPANY-DATAS/COMPANY-DATA")
|
36
|
-
])
|
37
|
-
sdgs = [
|
38
|
-
SpecialDataGroup.from_et(sdge, doc_frags) for sdge in et_element.iterfind("SDGS/SDG")
|
39
|
-
]
|
40
28
|
prot_stacks = NamedItemList([
|
41
29
|
ProtStack.from_et(dl_element, doc_frags)
|
42
30
|
for dl_element in et_element.iterfind("PROT-STACKS/PROT-STACK")
|
43
31
|
])
|
44
32
|
|
45
|
-
return ComparamSpec(
|
46
|
-
admin_data=admin_data,
|
47
|
-
company_datas=company_datas,
|
48
|
-
sdgs=sdgs,
|
49
|
-
prot_stacks=prot_stacks,
|
50
|
-
**kwargs)
|
33
|
+
return ComparamSpec(prot_stacks=prot_stacks, **kwargs)
|
51
34
|
|
52
35
|
def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
|
53
|
-
odxlinks
|
54
|
-
odxlinks[self.odx_id] = self
|
55
|
-
|
56
|
-
if self.admin_data is not None:
|
57
|
-
odxlinks.update(self.admin_data._build_odxlinks())
|
58
|
-
|
59
|
-
for cd in self.company_datas:
|
60
|
-
odxlinks.update(cd._build_odxlinks())
|
61
|
-
|
62
|
-
for sdg in self.sdgs:
|
63
|
-
odxlinks.update(sdg._build_odxlinks())
|
36
|
+
odxlinks = super()._build_odxlinks()
|
64
37
|
|
65
38
|
for ps in self.prot_stacks:
|
66
39
|
odxlinks.update(ps._build_odxlinks())
|
@@ -68,27 +41,16 @@ class ComparamSpec(IdentifiableElement):
|
|
68
41
|
return odxlinks
|
69
42
|
|
70
43
|
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
71
|
-
|
72
|
-
self.admin_data._resolve_odxlinks(odxlinks)
|
73
|
-
|
74
|
-
for cd in self.company_datas:
|
75
|
-
cd._resolve_odxlinks(odxlinks)
|
76
|
-
|
77
|
-
for sdg in self.sdgs:
|
78
|
-
sdg._resolve_odxlinks(odxlinks)
|
44
|
+
super()._resolve_odxlinks(odxlinks)
|
79
45
|
|
80
46
|
for ps in self.prot_stacks:
|
81
47
|
ps._resolve_odxlinks(odxlinks)
|
82
48
|
|
83
|
-
def
|
84
|
-
|
85
|
-
self.admin_data._resolve_snrefs(context)
|
49
|
+
def _finalize_init(self, database: "Database", odxlinks: OdxLinkDatabase) -> None:
|
50
|
+
super()._finalize_init(database, odxlinks)
|
86
51
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
for sdg in self.sdgs:
|
91
|
-
sdg._resolve_snrefs(context)
|
52
|
+
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
53
|
+
super()._resolve_snrefs(context)
|
92
54
|
|
93
55
|
for ps in self.prot_stacks:
|
94
56
|
ps._resolve_snrefs(context)
|
odxtools/comparamsubset.py
CHANGED
@@ -1,50 +1,41 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from dataclasses import dataclass
|
3
|
-
from typing import Any, Dict, List, Optional
|
3
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
|
-
from .admindata import AdminData
|
7
|
-
from .companydata import CompanyData
|
8
6
|
from .comparam import Comparam
|
9
7
|
from .complexcomparam import ComplexComparam
|
10
8
|
from .dataobjectproperty import DataObjectProperty
|
11
|
-
from .element import IdentifiableElement
|
12
|
-
from .exceptions import odxrequire
|
13
9
|
from .nameditemlist import NamedItemList
|
10
|
+
from .odxcategory import OdxCategory
|
14
11
|
from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId
|
15
12
|
from .snrefcontext import SnRefContext
|
16
|
-
from .specialdatagroup import SpecialDataGroup
|
17
13
|
from .unitspec import UnitSpec
|
18
14
|
from .utils import dataclass_fields_asdict
|
19
15
|
|
16
|
+
if TYPE_CHECKING:
|
17
|
+
from .database import Database
|
18
|
+
|
20
19
|
|
21
20
|
@dataclass
|
22
|
-
class ComparamSubset(
|
23
|
-
# mandatory in ODX 2.2, but non
|
21
|
+
class ComparamSubset(OdxCategory):
|
22
|
+
# mandatory in ODX 2.2, but non-existent in ODX 2.0
|
24
23
|
category: Optional[str]
|
25
|
-
|
24
|
+
|
26
25
|
comparams: NamedItemList[Comparam]
|
27
26
|
complex_comparams: NamedItemList[ComplexComparam]
|
27
|
+
data_object_props: NamedItemList[DataObjectProperty]
|
28
28
|
unit_spec: Optional[UnitSpec]
|
29
|
-
admin_data: Optional[AdminData]
|
30
|
-
company_datas: NamedItemList[CompanyData]
|
31
|
-
sdgs: List[SpecialDataGroup]
|
32
29
|
|
33
30
|
@staticmethod
|
34
31
|
def from_et(et_element: ElementTree.Element,
|
35
32
|
doc_frags: List[OdxDocFragment]) -> "ComparamSubset":
|
36
33
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
doc_frags = [OdxDocFragment(short_name, str(et_element.tag))]
|
41
|
-
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
|
34
|
+
cat = OdxCategory.category_from_et(et_element, doc_frags, doc_type="COMPARAM-SUBSET")
|
35
|
+
doc_frags = cat.odx_id.doc_fragments
|
36
|
+
kwargs = dataclass_fields_asdict(cat)
|
42
37
|
|
43
|
-
|
44
|
-
company_datas = NamedItemList([
|
45
|
-
CompanyData.from_et(cde, doc_frags)
|
46
|
-
for cde in et_element.iterfind("COMPANY-DATAS/COMPANY-DATA")
|
47
|
-
])
|
38
|
+
category = et_element.get("CATEGORY")
|
48
39
|
|
49
40
|
data_object_props = NamedItemList([
|
50
41
|
DataObjectProperty.from_et(el, doc_frags)
|
@@ -61,25 +52,16 @@ class ComparamSubset(IdentifiableElement):
|
|
61
52
|
else:
|
62
53
|
unit_spec = None
|
63
54
|
|
64
|
-
sdgs = [
|
65
|
-
SpecialDataGroup.from_et(sdge, doc_frags) for sdge in et_element.iterfind("SDGS/SDG")
|
66
|
-
]
|
67
|
-
|
68
55
|
return ComparamSubset(
|
69
56
|
category=category,
|
70
|
-
admin_data=admin_data,
|
71
|
-
company_datas=company_datas,
|
72
57
|
data_object_props=data_object_props,
|
73
58
|
comparams=comparams,
|
74
59
|
complex_comparams=complex_comparams,
|
75
60
|
unit_spec=unit_spec,
|
76
|
-
sdgs=sdgs,
|
77
61
|
**kwargs)
|
78
62
|
|
79
63
|
def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
|
80
|
-
odxlinks
|
81
|
-
if self.odx_id is not None:
|
82
|
-
odxlinks[self.odx_id] = self
|
64
|
+
odxlinks = super()._build_odxlinks()
|
83
65
|
|
84
66
|
for dop in self.data_object_props:
|
85
67
|
odxlinks[dop.odx_id] = dop
|
@@ -93,19 +75,11 @@ class ComparamSubset(IdentifiableElement):
|
|
93
75
|
if self.unit_spec:
|
94
76
|
odxlinks.update(self.unit_spec._build_odxlinks())
|
95
77
|
|
96
|
-
if self.admin_data is not None:
|
97
|
-
odxlinks.update(self.admin_data._build_odxlinks())
|
98
|
-
|
99
|
-
if self.company_datas is not None:
|
100
|
-
for cd in self.company_datas:
|
101
|
-
odxlinks.update(cd._build_odxlinks())
|
102
|
-
|
103
|
-
for sdg in self.sdgs:
|
104
|
-
odxlinks.update(sdg._build_odxlinks())
|
105
|
-
|
106
78
|
return odxlinks
|
107
79
|
|
108
80
|
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
81
|
+
super()._resolve_odxlinks(odxlinks)
|
82
|
+
|
109
83
|
for dop in self.data_object_props:
|
110
84
|
dop._resolve_odxlinks(odxlinks)
|
111
85
|
|
@@ -118,17 +92,12 @@ class ComparamSubset(IdentifiableElement):
|
|
118
92
|
if self.unit_spec:
|
119
93
|
self.unit_spec._resolve_odxlinks(odxlinks)
|
120
94
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
if self.company_datas is not None:
|
125
|
-
for cd in self.company_datas:
|
126
|
-
cd._resolve_odxlinks(odxlinks)
|
127
|
-
|
128
|
-
for sdg in self.sdgs:
|
129
|
-
sdg._resolve_odxlinks(odxlinks)
|
95
|
+
def _finalize_init(self, database: "Database", odxlinks: OdxLinkDatabase) -> None:
|
96
|
+
super()._finalize_init(database, odxlinks)
|
130
97
|
|
131
98
|
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
99
|
+
super()._resolve_snrefs(context)
|
100
|
+
|
132
101
|
for dop in self.data_object_props:
|
133
102
|
dop._resolve_snrefs(context)
|
134
103
|
|
@@ -140,13 +109,3 @@ class ComparamSubset(IdentifiableElement):
|
|
140
109
|
|
141
110
|
if self.unit_spec:
|
142
111
|
self.unit_spec._resolve_snrefs(context)
|
143
|
-
|
144
|
-
if self.admin_data is not None:
|
145
|
-
self.admin_data._resolve_snrefs(context)
|
146
|
-
|
147
|
-
if self.company_datas is not None:
|
148
|
-
for cd in self.company_datas:
|
149
|
-
cd._resolve_snrefs(context)
|
150
|
-
|
151
|
-
for sdg in self.sdgs:
|
152
|
-
sdg._resolve_snrefs(context)
|
odxtools/database.py
CHANGED
@@ -20,6 +20,7 @@ from .diaglayers.protocol import Protocol
|
|
20
20
|
from .exceptions import odxraise, odxrequire
|
21
21
|
from .nameditemlist import NamedItemList
|
22
22
|
from .odxlink import OdxLinkDatabase, OdxLinkId
|
23
|
+
from .snrefcontext import SnRefContext
|
23
24
|
|
24
25
|
|
25
26
|
class Database:
|
@@ -139,11 +140,26 @@ class Database:
|
|
139
140
|
for dlc in self.diag_layer_containers:
|
140
141
|
dlc._resolve_odxlinks(self._odxlinks)
|
141
142
|
|
142
|
-
#
|
143
|
-
#
|
143
|
+
# resolve short name references for containers which do not do
|
144
|
+
# inheritance (we can call directly call _resolve_snrefs())
|
145
|
+
context = SnRefContext()
|
146
|
+
context.database = self
|
147
|
+
|
148
|
+
# let the diaglayers sort out the inherited objects
|
149
|
+
for subset in self.comparam_subsets:
|
150
|
+
subset._finalize_init(self, self._odxlinks)
|
151
|
+
for spec in self.comparam_specs:
|
152
|
+
spec._finalize_init(self, self._odxlinks)
|
144
153
|
for dlc in self.diag_layer_containers:
|
145
154
|
dlc._finalize_init(self, self._odxlinks)
|
146
155
|
|
156
|
+
for subset in self.comparam_subsets:
|
157
|
+
subset._resolve_snrefs(context)
|
158
|
+
for spec in self.comparam_specs:
|
159
|
+
spec._resolve_snrefs(context)
|
160
|
+
for dlc in self.diag_layer_containers:
|
161
|
+
dlc._resolve_snrefs(context)
|
162
|
+
|
147
163
|
def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
|
148
164
|
result: Dict[OdxLinkId, Any] = {}
|
149
165
|
|
odxtools/diaglayercontainer.py
CHANGED
@@ -1,22 +1,19 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from dataclasses import dataclass
|
3
3
|
from itertools import chain
|
4
|
-
from typing import TYPE_CHECKING, Any, Dict, List,
|
4
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Union
|
5
5
|
from xml.etree import ElementTree
|
6
6
|
|
7
|
-
from .admindata import AdminData
|
8
|
-
from .companydata import CompanyData
|
9
7
|
from .diaglayers.basevariant import BaseVariant
|
10
8
|
from .diaglayers.diaglayer import DiagLayer
|
11
9
|
from .diaglayers.ecushareddata import EcuSharedData
|
12
10
|
from .diaglayers.ecuvariant import EcuVariant
|
13
11
|
from .diaglayers.functionalgroup import FunctionalGroup
|
14
12
|
from .diaglayers.protocol import Protocol
|
15
|
-
from .element import IdentifiableElement
|
16
|
-
from .exceptions import odxrequire
|
17
13
|
from .nameditemlist import NamedItemList
|
14
|
+
from .odxcategory import OdxCategory
|
18
15
|
from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId
|
19
|
-
from .
|
16
|
+
from .snrefcontext import SnRefContext
|
20
17
|
from .utils import dataclass_fields_asdict
|
21
18
|
|
22
19
|
if TYPE_CHECKING:
|
@@ -24,15 +21,12 @@ if TYPE_CHECKING:
|
|
24
21
|
|
25
22
|
|
26
23
|
@dataclass
|
27
|
-
class DiagLayerContainer(
|
28
|
-
admin_data: Optional[AdminData]
|
29
|
-
company_datas: NamedItemList[CompanyData]
|
24
|
+
class DiagLayerContainer(OdxCategory):
|
30
25
|
ecu_shared_datas: NamedItemList[EcuSharedData]
|
31
26
|
protocols: NamedItemList[Protocol]
|
32
27
|
functional_groups: NamedItemList[FunctionalGroup]
|
33
28
|
base_variants: NamedItemList[BaseVariant]
|
34
29
|
ecu_variants: NamedItemList[EcuVariant]
|
35
|
-
sdgs: List[SpecialDataGroup]
|
36
30
|
|
37
31
|
@property
|
38
32
|
def ecus(self) -> NamedItemList[EcuVariant]:
|
@@ -54,17 +48,10 @@ class DiagLayerContainer(IdentifiableElement):
|
|
54
48
|
def from_et(et_element: ElementTree.Element,
|
55
49
|
doc_frags: List[OdxDocFragment]) -> "DiagLayerContainer":
|
56
50
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
doc_frags = [OdxDocFragment(short_name, "CONTAINER")]
|
61
|
-
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
|
51
|
+
cat = OdxCategory.category_from_et(et_element, doc_frags, doc_type="CONTAINER")
|
52
|
+
doc_frags = cat.odx_id.doc_fragments
|
53
|
+
kwargs = dataclass_fields_asdict(cat)
|
62
54
|
|
63
|
-
admin_data = AdminData.from_et(et_element.find("ADMIN-DATA"), doc_frags)
|
64
|
-
company_datas = NamedItemList([
|
65
|
-
CompanyData.from_et(cde, doc_frags)
|
66
|
-
for cde in et_element.iterfind("COMPANY-DATAS/COMPANY-DATA")
|
67
|
-
])
|
68
55
|
ecu_shared_datas = NamedItemList([
|
69
56
|
EcuSharedData.from_et(dl_element, doc_frags)
|
70
57
|
for dl_element in et_element.iterfind("ECU-SHARED-DATAS/ECU-SHARED-DATA")
|
@@ -85,30 +72,17 @@ class DiagLayerContainer(IdentifiableElement):
|
|
85
72
|
EcuVariant.from_et(dl_element, doc_frags)
|
86
73
|
for dl_element in et_element.iterfind("ECU-VARIANTS/ECU-VARIANT")
|
87
74
|
])
|
88
|
-
sdgs = [
|
89
|
-
SpecialDataGroup.from_et(sdge, doc_frags) for sdge in et_element.iterfind("SDGS/SDG")
|
90
|
-
]
|
91
75
|
|
92
76
|
return DiagLayerContainer(
|
93
|
-
admin_data=admin_data,
|
94
|
-
company_datas=company_datas,
|
95
77
|
ecu_shared_datas=ecu_shared_datas,
|
96
78
|
protocols=protocols,
|
97
79
|
functional_groups=functional_groups,
|
98
80
|
base_variants=base_variants,
|
99
81
|
ecu_variants=ecu_variants,
|
100
|
-
sdgs=sdgs,
|
101
82
|
**kwargs)
|
102
83
|
|
103
84
|
def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
|
104
|
-
result =
|
105
|
-
|
106
|
-
if self.admin_data is not None:
|
107
|
-
result.update(self.admin_data._build_odxlinks())
|
108
|
-
for cd in self.company_datas:
|
109
|
-
result.update(cd._build_odxlinks())
|
110
|
-
for sdg in self.sdgs:
|
111
|
-
result.update(sdg._build_odxlinks())
|
85
|
+
result = super()._build_odxlinks()
|
112
86
|
|
113
87
|
for ecu_shared_data in self.ecu_shared_datas:
|
114
88
|
result.update(ecu_shared_data._build_odxlinks())
|
@@ -124,12 +98,7 @@ class DiagLayerContainer(IdentifiableElement):
|
|
124
98
|
return result
|
125
99
|
|
126
100
|
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
127
|
-
|
128
|
-
self.admin_data._resolve_odxlinks(odxlinks)
|
129
|
-
for cd in self.company_datas:
|
130
|
-
cd._resolve_odxlinks(odxlinks)
|
131
|
-
for sdg in self.sdgs:
|
132
|
-
sdg._resolve_odxlinks(odxlinks)
|
101
|
+
super()._resolve_odxlinks(odxlinks)
|
133
102
|
|
134
103
|
for ecu_shared_data in self.ecu_shared_datas:
|
135
104
|
ecu_shared_data._resolve_odxlinks(odxlinks)
|
@@ -143,6 +112,8 @@ class DiagLayerContainer(IdentifiableElement):
|
|
143
112
|
ecu_variant._resolve_odxlinks(odxlinks)
|
144
113
|
|
145
114
|
def _finalize_init(self, database: "Database", odxlinks: OdxLinkDatabase) -> None:
|
115
|
+
super()._finalize_init(database, odxlinks)
|
116
|
+
|
146
117
|
for ecu_shared_data in self.ecu_shared_datas:
|
147
118
|
ecu_shared_data._finalize_init(database, odxlinks)
|
148
119
|
for protocol in self.protocols:
|
@@ -154,6 +125,9 @@ class DiagLayerContainer(IdentifiableElement):
|
|
154
125
|
for ecu_variant in self.ecu_variants:
|
155
126
|
ecu_variant._finalize_init(database, odxlinks)
|
156
127
|
|
128
|
+
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
129
|
+
super()._resolve_snrefs(context)
|
130
|
+
|
157
131
|
@property
|
158
132
|
def diag_layers(self) -> NamedItemList[DiagLayer]:
|
159
133
|
return self._diag_layers
|
odxtools/odxcategory.py
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
2
|
+
from dataclasses import dataclass
|
3
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional
|
4
|
+
from xml.etree import ElementTree
|
5
|
+
|
6
|
+
from .admindata import AdminData
|
7
|
+
from .companydata import CompanyData
|
8
|
+
from .element import IdentifiableElement
|
9
|
+
from .exceptions import odxrequire
|
10
|
+
from .nameditemlist import NamedItemList
|
11
|
+
from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId
|
12
|
+
from .snrefcontext import SnRefContext
|
13
|
+
from .specialdatagroup import SpecialDataGroup
|
14
|
+
from .utils import dataclass_fields_asdict
|
15
|
+
|
16
|
+
if TYPE_CHECKING:
|
17
|
+
from .database import Database
|
18
|
+
|
19
|
+
|
20
|
+
@dataclass
|
21
|
+
class OdxCategory(IdentifiableElement):
|
22
|
+
"""This is the base class for all top-level container classes in ODX"""
|
23
|
+
|
24
|
+
admin_data: Optional[AdminData]
|
25
|
+
company_datas: NamedItemList[CompanyData]
|
26
|
+
sdgs: List[SpecialDataGroup]
|
27
|
+
|
28
|
+
@staticmethod
|
29
|
+
def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "OdxCategory":
|
30
|
+
raise Exception("Calling `._from_et()` is not allowed for OdxCategory. "
|
31
|
+
"Use `OdxCategory.category_from_et()`!")
|
32
|
+
|
33
|
+
@staticmethod
|
34
|
+
def category_from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment], *,
|
35
|
+
doc_type: str) -> "OdxCategory":
|
36
|
+
|
37
|
+
short_name = odxrequire(et_element.findtext("SHORT-NAME"))
|
38
|
+
# create the current ODX "document fragment" (description of the
|
39
|
+
# current document for references and IDs)
|
40
|
+
doc_frags = [OdxDocFragment(short_name, doc_type)]
|
41
|
+
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
|
42
|
+
|
43
|
+
admin_data = AdminData.from_et(et_element.find("ADMIN-DATA"), doc_frags)
|
44
|
+
company_datas = NamedItemList([
|
45
|
+
CompanyData.from_et(cde, doc_frags)
|
46
|
+
for cde in et_element.iterfind("COMPANY-DATAS/COMPANY-DATA")
|
47
|
+
])
|
48
|
+
sdgs = [
|
49
|
+
SpecialDataGroup.from_et(sdge, doc_frags) for sdge in et_element.iterfind("SDGS/SDG")
|
50
|
+
]
|
51
|
+
|
52
|
+
return OdxCategory(admin_data=admin_data, company_datas=company_datas, sdgs=sdgs, **kwargs)
|
53
|
+
|
54
|
+
def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
|
55
|
+
result = {self.odx_id: self}
|
56
|
+
|
57
|
+
if self.admin_data is not None:
|
58
|
+
result.update(self.admin_data._build_odxlinks())
|
59
|
+
for cd in self.company_datas:
|
60
|
+
result.update(cd._build_odxlinks())
|
61
|
+
for sdg in self.sdgs:
|
62
|
+
result.update(sdg._build_odxlinks())
|
63
|
+
|
64
|
+
return result
|
65
|
+
|
66
|
+
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
67
|
+
if self.admin_data is not None:
|
68
|
+
self.admin_data._resolve_odxlinks(odxlinks)
|
69
|
+
for cd in self.company_datas:
|
70
|
+
cd._resolve_odxlinks(odxlinks)
|
71
|
+
for sdg in self.sdgs:
|
72
|
+
sdg._resolve_odxlinks(odxlinks)
|
73
|
+
|
74
|
+
def _finalize_init(self, database: "Database", odxlinks: OdxLinkDatabase) -> None:
|
75
|
+
pass
|
76
|
+
|
77
|
+
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
78
|
+
if self.admin_data is not None:
|
79
|
+
self.admin_data._resolve_snrefs(context)
|
80
|
+
for cd in self.company_datas:
|
81
|
+
cd._resolve_snrefs(context)
|
82
|
+
for sdg in self.sdgs:
|
83
|
+
sdg._resolve_snrefs(context)
|
@@ -105,9 +105,8 @@ class LengthKeyParameter(ParameterWithDOP):
|
|
105
105
|
# emplace a value of zero into the encode state, but pretend the bits not to be used
|
106
106
|
n = odxrequire(self.dop.get_static_bit_length()) + encode_state.cursor_bit_position
|
107
107
|
tmp_val = b'\x00' * ((n + 7) // 8)
|
108
|
-
encode_state.emplace_bytes(tmp_val, obj_used_mask=tmp_val)
|
109
|
-
|
110
108
|
encode_state.cursor_bit_position = 0
|
109
|
+
encode_state.emplace_bytes(tmp_val, obj_used_mask=tmp_val)
|
111
110
|
|
112
111
|
def encode_value_into_pdu(self, encode_state: EncodeState) -> None:
|
113
112
|
|
@@ -80,18 +80,23 @@ class TableKeyParameter(Parameter):
|
|
80
80
|
super()._resolve_odxlinks(odxlinks)
|
81
81
|
|
82
82
|
# Either table_ref or table_row_ref will be defined
|
83
|
-
if self.table_ref:
|
83
|
+
if self.table_ref is not None:
|
84
84
|
if TYPE_CHECKING:
|
85
85
|
self._table = odxlinks.resolve(self.table_ref, Table)
|
86
86
|
else:
|
87
87
|
self._table = odxlinks.resolve(self.table_ref)
|
88
88
|
|
89
|
-
if self.table_row_ref:
|
89
|
+
if self.table_row_ref is not None:
|
90
90
|
if TYPE_CHECKING:
|
91
91
|
self._table_row = odxlinks.resolve(self.table_row_ref, TableRow)
|
92
92
|
else:
|
93
93
|
self._table_row = odxlinks.resolve(self.table_row_ref)
|
94
|
-
|
94
|
+
|
95
|
+
if self.table_ref is None and self.table_snref is None:
|
96
|
+
if TYPE_CHECKING:
|
97
|
+
self._table = odxlinks.resolve(self._table_row.table_ref, Table)
|
98
|
+
else:
|
99
|
+
self._table = odxlinks.resolve(self._table_row.table_ref)
|
95
100
|
|
96
101
|
@override
|
97
102
|
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
@@ -116,11 +121,7 @@ class TableKeyParameter(Parameter):
|
|
116
121
|
|
117
122
|
@property
|
118
123
|
def table(self) -> "Table":
|
119
|
-
|
120
|
-
return self._table
|
121
|
-
if self._table_row is not None:
|
122
|
-
return self._table_row.table
|
123
|
-
odxraise(f'Could not resolve the table of {self.short_name}')
|
124
|
+
return self._table
|
124
125
|
|
125
126
|
@property
|
126
127
|
def table_row(self) -> Optional["TableRow"]:
|
@@ -5,32 +5,15 @@
|
|
5
5
|
# This template writes an .odx-c file for a communication
|
6
6
|
# parameter specification.
|
7
7
|
-#}
|
8
|
-
{%- import('macros/
|
9
|
-
{%- import('macros/printCompanyData.xml.jinja2') as pcd -%}
|
8
|
+
{%- import('macros/printOdxCategory.xml.jinja2') as poc %}
|
10
9
|
{%- import('macros/printProtStack.xml.jinja2') as pps %}
|
11
|
-
{%- import('macros/printDescription.xml.jinja2') as pd %}
|
12
10
|
{#- -#}
|
13
11
|
|
14
12
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
15
|
-
<ODX MODEL-VERSION="2.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="odx.xsd">
|
16
13
|
<!-- Written using odxtools {{odxtools_version}} -->
|
17
|
-
|
18
|
-
|
19
|
-
{
|
20
|
-
<LONG-NAME>{{comparam_spec.long_name|e}}</LONG-NAME>
|
21
|
-
{%- endif %}
|
22
|
-
{{pd.printDescription(comparam_spec.description)}}
|
23
|
-
{%- if comparam_spec.admin_data is not none %}
|
24
|
-
{{- pad.printAdminData(comparam_spec.admin_data) | indent(3) }}
|
25
|
-
{%- endif %}
|
26
|
-
{%- if comparam_spec.company_datas %}
|
27
|
-
<COMPANY-DATAS>
|
28
|
-
{%- for cd in comparam_spec.company_datas %}
|
29
|
-
{{- pcd.printCompanyData(cd) | indent(5) -}}
|
30
|
-
{%- endfor %}
|
31
|
-
</COMPANY-DATAS>
|
32
|
-
{%- endif %}
|
33
|
-
|
14
|
+
<ODX MODEL-VERSION="2.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="odx.xsd">
|
15
|
+
<COMPARAM-SPEC {{- poc.printOdxCategoryAttribs(comparam_spec) }}>
|
16
|
+
{{- poc.printOdxCategorySubtags(comparam_spec)|indent(3) }}
|
34
17
|
{%- if comparam_spec.prot_stacks %}
|
35
18
|
<PROT-STACKS>
|
36
19
|
{%- for ps in comparam_spec.prot_stacks %}
|
@@ -5,36 +5,18 @@
|
|
5
5
|
# This template writes an .odx-cs file for a communication
|
6
6
|
# parameter subset.
|
7
7
|
-#}
|
8
|
+
{%- import('macros/printOdxCategory.xml.jinja2') as poc %}
|
8
9
|
{%- import('macros/printComparam.xml.jinja2') as pcp -%}
|
9
|
-
{%- import('macros/printAdminData.xml.jinja2') as pad -%}
|
10
|
-
{%- import('macros/printCompanyData.xml.jinja2') as pcd -%}
|
11
10
|
{%- import('macros/printDOP.xml.jinja2') as pdop %}
|
12
11
|
{%- import('macros/printUnitSpec.xml.jinja2') as pus %}
|
13
|
-
{%- import('macros/printSpecialData.xml.jinja2') as psd %}
|
14
12
|
{%- import('macros/printDescription.xml.jinja2') as pd %}
|
15
13
|
{#- -#}
|
16
14
|
|
17
15
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
18
|
-
<ODX MODEL-VERSION="2.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="odx.xsd">
|
19
16
|
<!-- Written using odxtools {{odxtools_version}} -->
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
{%- if comparam_subset.long_name is not none %}
|
24
|
-
<LONG-NAME>{{comparam_subset.long_name|e}}</LONG-NAME>
|
25
|
-
{%- endif %}
|
26
|
-
{{pd.printDescription(comparam_subset.description)}}
|
27
|
-
{%- if comparam_subset.admin_data is not none %}
|
28
|
-
{{- pad.printAdminData(comparam_subset.admin_data) | indent(3) }}
|
29
|
-
{%- endif %}
|
30
|
-
{%- if comparam_subset.company_datas %}
|
31
|
-
<COMPANY-DATAS>
|
32
|
-
{%- for cd in comparam_subset.company_datas %}
|
33
|
-
{{- pcd.printCompanyData(cd) | indent(5, first=True) }}
|
34
|
-
{%- endfor %}
|
35
|
-
</COMPANY-DATAS>
|
36
|
-
{%- endif %}
|
37
|
-
{{- psd.printSpecialDataGroups(comparam_subset.sdgs)|indent(3, first=True) }}
|
17
|
+
<ODX MODEL-VERSION="2.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="odx.xsd">
|
18
|
+
<COMPARAM-SUBSET {{- poc.printOdxCategoryAttribs(comparam_subset) }} {{make_xml_attrib("CATEGORY", comparam_subset.category)}}>
|
19
|
+
{{- poc.printOdxCategorySubtags(comparam_subset)|indent(3) }}
|
38
20
|
{%- if comparam_subset.comparams %}
|
39
21
|
<COMPARAMS>
|
40
22
|
{%- for cp in comparam_subset.comparams %}
|
@@ -2,9 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# SPDX-License-Identifier: MIT
|
4
4
|
-#}
|
5
|
-
{%- import('macros/
|
6
|
-
{%- import('macros/printCompanyData.xml.jinja2') as pcd -%}
|
7
|
-
{%- import('macros/printSpecialData.xml.jinja2') as psd %}
|
5
|
+
{%- import('macros/printOdxCategory.xml.jinja2') as poc %}
|
8
6
|
{%- import('macros/printEcuSharedData.xml.jinja2') as pecusd -%}
|
9
7
|
{%- import('macros/printProtocol.xml.jinja2') as pprot %}
|
10
8
|
{%- import('macros/printFunctionalGroup.xml.jinja2') as pfuncgroup %}
|
@@ -14,29 +12,10 @@
|
|
14
12
|
{#- -#}
|
15
13
|
|
16
14
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
15
|
+
<!-- Written using odxtools {{odxtools_version}} -->
|
17
16
|
<ODX MODEL-VERSION="2.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="odx.xsd">
|
18
|
-
|
19
|
-
|
20
|
-
<SHORT-NAME>{{dlc.short_name}}</SHORT-NAME>
|
21
|
-
{%- if dlc.long_name %}
|
22
|
-
<LONG-NAME>{{dlc.long_name|e}}</LONG-NAME>
|
23
|
-
{%- endif %}
|
24
|
-
{%- if dlc.description %}
|
25
|
-
<DESC>
|
26
|
-
{{dlc.description}}
|
27
|
-
</DESC>
|
28
|
-
{%- endif %}
|
29
|
-
{%- if dlc.admin_data %}
|
30
|
-
{{pad.printAdminData(dlc.admin_data)|indent(2)}}
|
31
|
-
{%- endif %}
|
32
|
-
{%- if dlc.company_datas %}
|
33
|
-
<COMPANY-DATAS>
|
34
|
-
{%- for cd in dlc.company_datas %}
|
35
|
-
{{pcd.printCompanyData(cd)|indent(3)}}
|
36
|
-
{%- endfor %}
|
37
|
-
</COMPANY-DATAS>
|
38
|
-
{%- endif %}
|
39
|
-
{{- psd.printSpecialDataGroups(dlc.sdgs)|indent(2, first=True) }}
|
17
|
+
<DIAG-LAYER-CONTAINER {{- poc.printOdxCategoryAttribs(dlc) }}>
|
18
|
+
{{- poc.printOdxCategorySubtags(dlc)|indent(3) }}
|
40
19
|
{%- if dlc.protocols %}
|
41
20
|
<PROTOCOLS>
|
42
21
|
{%- for dl in dlc.protocols %}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
{#- -*- mode: sgml; tab-width: 1; indent-tabs-mode: nil -*-
|
2
|
+
#
|
3
|
+
# SPDX-License-Identifier: MIT
|
4
|
+
-#}
|
5
|
+
|
6
|
+
{%- import('macros/printElementId.xml.jinja2') as peid %}
|
7
|
+
{%- import('macros/printAdminData.xml.jinja2') as pad -%}
|
8
|
+
{%- import('macros/printCompanyData.xml.jinja2') as pcd -%}
|
9
|
+
{%- import('macros/printSpecialData.xml.jinja2') as psd %}
|
10
|
+
|
11
|
+
{%- macro printOdxCategoryAttribs(obj) -%}
|
12
|
+
{#- #} {{- peid.printElementIdAttribs(obj) }}
|
13
|
+
{%- endmacro -%}
|
14
|
+
|
15
|
+
{%- macro printOdxCategorySubtags(obj) -%}
|
16
|
+
{{ peid.printElementIdSubtags(obj) }}
|
17
|
+
{%- if obj.admin_data %}
|
18
|
+
{{pad.printAdminData(obj.admin_data)|indent(2)}}
|
19
|
+
{%- endif %}
|
20
|
+
{%- if obj.company_datas %}
|
21
|
+
<COMPANY-DATAS>
|
22
|
+
{%- for cd in obj.company_datas %}
|
23
|
+
{{pcd.printCompanyData(cd)|indent(3)}}
|
24
|
+
{%- endfor %}
|
25
|
+
</COMPANY-DATAS>
|
26
|
+
{%- endif %}
|
27
|
+
{{- psd.printSpecialDataGroups(obj.sdgs)|indent(2, first=True) }}
|
28
|
+
{%- endmacro -%}
|
odxtools/version.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: odxtools
|
3
|
-
Version: 9.
|
3
|
+
Version: 9.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>
|
@@ -13,14 +13,14 @@ odxtools/companyrevisioninfo.py,sha256=rim57tX4jFoJq4Xvdet7UUHMA7MpcIjMQQrL-YTWA
|
|
13
13
|
odxtools/companyspecificinfo.py,sha256=Fww7CqQmU-4HUtyaJatcgg9VV8iZzj4YQ5M0UqJVs2c,1537
|
14
14
|
odxtools/comparam.py,sha256=uVThBbKO8_aoTWYFH5OhyKdAnq1Psq2gifEmvfL0-I0,1592
|
15
15
|
odxtools/comparaminstance.py,sha256=NZImeN3HSfjUx_xyRghH8yDPD8wd5_RadNGWeQD16KI,4949
|
16
|
-
odxtools/comparamspec.py,sha256=
|
17
|
-
odxtools/comparamsubset.py,sha256=
|
16
|
+
odxtools/comparamspec.py,sha256=RvkFc9rcxDL_S8bGnTRVJOW1DzHXLXIr_VoHs4feijQ,1822
|
17
|
+
odxtools/comparamsubset.py,sha256=uy7ZxtTjAtTK-9Uh7AD-J0-LcgECJCsyAboWbQMo1rQ,3796
|
18
18
|
odxtools/complexcomparam.py,sha256=4EJQXVmi_i3Eas5LAF-sEC5XnAUMZKr2sS6LoDNskk0,3729
|
19
19
|
odxtools/complexdop.py,sha256=AHkHMf_IEWfy-_zSiCuZXmdTNCXiCOpg5GRZ5uMVV5A,280
|
20
20
|
odxtools/createanycomparam.py,sha256=RP0XA2Ut4GL2NWy05RvKBrTnpbvvCG2XuNL8OO-9rbI,617
|
21
21
|
odxtools/createanydiagcodedtype.py,sha256=0DVmMj4UCDYIg0zu9pgTplyhHmRedz1KJcchq1uKMjg,1216
|
22
22
|
odxtools/createecuvariantpatterns.py,sha256=FXHLGR4M791MRkpU2_keck88hoMYkuyPiCUxuGbUasQ,559
|
23
|
-
odxtools/database.py,sha256=
|
23
|
+
odxtools/database.py,sha256=VJk-EOzHHtxjkhP7o0h470B0oyg73ZafK3w1UjnwRNM,9945
|
24
24
|
odxtools/dataobjectproperty.py,sha256=otbbtGadW_W9nr5sL9Fug5_bU91eYeOYyfBWa7sb3B0,6052
|
25
25
|
odxtools/decodestate.py,sha256=jJxLUzUYZ0C4t18FhJzo2iRTP8DF7BzrWLtRTTlLsJI,4885
|
26
26
|
odxtools/description.py,sha256=UoACftC_n7fQ1n9WDwCzizStMH0HCO2Qv0YLRaSjEgs,1484
|
@@ -28,7 +28,7 @@ odxtools/determinenumberofitems.py,sha256=DxM9udr1MQfEojiLdc35bbjniQl1fkeHcTMpoo
|
|
28
28
|
odxtools/diagcodedtype.py,sha256=LeL4UzaDM70XN2ec-4c7pdE6Z671TQTS7ivC8XNbd8M,4620
|
29
29
|
odxtools/diagcomm.py,sha256=j8esUkogoxHBwIEUBkAoXe28jX3vaRnnrgCR_gdP6VY,8110
|
30
30
|
odxtools/diagdatadictionaryspec.py,sha256=2zy5f-xnfGI0bnjPOEwG_IJxfsHhXZoOfdIS_fOr3L0,10552
|
31
|
-
odxtools/diaglayercontainer.py,sha256=
|
31
|
+
odxtools/diaglayercontainer.py,sha256=giiRUB_wlirogJLpJ3qrbUXgM_5JhHD6VXPPhDGTiDk,5318
|
32
32
|
odxtools/diagnostictroublecode.py,sha256=jKtO8JqU0HRpeSyrcHn4s21N4Jj-p19WVP-qw2H98gY,2459
|
33
33
|
odxtools/diagservice.py,sha256=y1_qKI7kJXDWpjpw91loIdf-K7Ozo45BsYiOhVYGuXg,10291
|
34
34
|
odxtools/diagvariable.py,sha256=KUyRCV-H5xKITWYk9wxDnaS_N2nwDFGQzHaQRfNndKA,3829
|
@@ -67,6 +67,7 @@ odxtools/multiplexerswitchkey.py,sha256=fnCpPcg47JQZQsrqS2RAa_O-JrfUb0pvhKv8hhs1
|
|
67
67
|
odxtools/nameditemlist.py,sha256=IYN_OBVf_iIU6a5CQ-gCttiUMeJEe04uk9z6Ro6IGK8,6521
|
68
68
|
odxtools/negoutputparam.py,sha256=u2IhJvy6n19t3nyADGG0H0XTm7JNdQ0-95FawGAdtiE,1373
|
69
69
|
odxtools/obd.py,sha256=WsUbhdonqQJtxf972CUdYL78AMMTVjMQhoCJbaZhRIo,1860
|
70
|
+
odxtools/odxcategory.py,sha256=85geAwJqInPSLjSBx-rtuRdx_m1ACuzZtRl_BcAkyss,3208
|
70
71
|
odxtools/odxlink.py,sha256=7_O8pZB9prgjN-2rJHPMkce1RwV7PT988EmOONgxfng,9414
|
71
72
|
odxtools/odxtypes.py,sha256=MKfusVSYma_OZYmxCVm-kx7WBK8OHjeU3DnJhet4zeg,8055
|
72
73
|
odxtools/outputparam.py,sha256=reBgrSE7fORxfSVSTuim0FyxHrE6OsQOGIFUjhn5FlE,1394
|
@@ -105,7 +106,7 @@ odxtools/unitgroup.py,sha256=_WNpnYFmkiHQnOY8XhIviiQLXziY3kplH--7ufAWXyI,2067
|
|
105
106
|
odxtools/unitspec.py,sha256=RMdEQoLrPhGt9vo32fkwbTqymicHFkFQnydFoi3uBog,2924
|
106
107
|
odxtools/utils.py,sha256=PJFXkG74BzoheurrDYOwHZ6EuIcr1sdxf1tQGk6zSgs,1122
|
107
108
|
odxtools/variablegroup.py,sha256=--5sMDOMUg4I3hFyoVOFcGCTOrctrrMADdmH3Mn4wHk,848
|
108
|
-
odxtools/version.py,sha256=
|
109
|
+
odxtools/version.py,sha256=T8IeUojKPHVUvKrkCJUUWMIrF2e2gsmEkdmYjMJYZ1g,411
|
109
110
|
odxtools/writepdxfile.py,sha256=ZEoNkSxheqnXm836-HOpd04O6ipMXYKFzXZy6PM0YLc,7813
|
110
111
|
odxtools/xdoc.py,sha256=gDq-8l8x-Tj1ZJOttPxZchcO5_jEPwcXxMgT29VgTS0,1433
|
111
112
|
odxtools/cli/__init__.py,sha256=T7ano_FIyzBASxYpmcA5VJXU5bQLIy_Qk0HE_SDKelY,106
|
@@ -157,7 +158,7 @@ odxtools/diaglayers/protocolraw.py,sha256=Wf1q2l11mxw61gnveVVEZqgR0yj2RCxoaB3QLz
|
|
157
158
|
odxtools/parameters/codedconstparameter.py,sha256=g34JJxQkyL5R27XiGCgkXyt7UzxFtBhZgv_FbTe2aiQ,3893
|
158
159
|
odxtools/parameters/createanyparameter.py,sha256=m26HHUQrxwDak3eBBciVBLic768Qlo4F2xn1z3r0boM,2566
|
159
160
|
odxtools/parameters/dynamicparameter.py,sha256=mdZx12XbhTSYVVuXEsPYRll3zaHjbHIYIzA6yUy4zck,1569
|
160
|
-
odxtools/parameters/lengthkeyparameter.py,sha256=
|
161
|
+
odxtools/parameters/lengthkeyparameter.py,sha256=r9beVso1DQRJ81CU6e8Dxqexbp8W4QksDcc_BtItSCQ,5269
|
161
162
|
odxtools/parameters/matchingrequestparameter.py,sha256=VNYIpmP_Yt_pzMHPgGWZk1XYH5liIdyawNIwIR1Cbvw,2897
|
162
163
|
odxtools/parameters/nrcconstparameter.py,sha256=SjTHQlaBzvyUATyOzSFFWCcdkTeHcaoKO54kTomzb6Y,4823
|
163
164
|
odxtools/parameters/parameter.py,sha256=0WhCvULPzvZ07g9Nz-0NyHt1Y8E8Q4YsW0VF-EUg2ow,6145
|
@@ -166,12 +167,12 @@ odxtools/parameters/physicalconstantparameter.py,sha256=2iC6EKVJZVHwVVmd4h8KJ6OL
|
|
166
167
|
odxtools/parameters/reservedparameter.py,sha256=8XQocU3_ExRZzXYEkITj535TTEUCNK87wIkrUTizgvI,1989
|
167
168
|
odxtools/parameters/systemparameter.py,sha256=CX5YeAcLs0ffDpksTOMXHSGvuPmRIF2Il_lnuCmbNI8,3593
|
168
169
|
odxtools/parameters/tableentryparameter.py,sha256=SuNAFn1wN_hyO2MVd1lT3oQllZ6nLjAIBJHX0HYRyko,2414
|
169
|
-
odxtools/parameters/tablekeyparameter.py,sha256=
|
170
|
+
odxtools/parameters/tablekeyparameter.py,sha256=zT49Ci0lGZgMFlswdZR3CRKh7x6CtzQ2Rk-VmZkxQvk,10028
|
170
171
|
odxtools/parameters/tablestructparameter.py,sha256=Doym0Tybi_t8w7nqM9n_ZAFwRWm-yJOnsaSqi4u5KiU,7032
|
171
172
|
odxtools/parameters/valueparameter.py,sha256=khsmiaLhpW2PjUKQaAkntwurxsml3TUzNwaZCaWNS50,3063
|
172
|
-
odxtools/templates/comparam-spec.odx-c.xml.jinja2,sha256=
|
173
|
-
odxtools/templates/comparam-subset.odx-cs.xml.jinja2,sha256=
|
174
|
-
odxtools/templates/diag_layer_container.odx-d.xml.jinja2,sha256=
|
173
|
+
odxtools/templates/comparam-spec.odx-c.xml.jinja2,sha256=A9q0SQCGhBaV2xUcXHFVkmZIBpbl9OP2x6JD0umzrdU,904
|
174
|
+
odxtools/templates/comparam-subset.odx-cs.xml.jinja2,sha256=xL4vy0yAsSajJRF_w7wCQFSklUIgyHwCHgGPlLTGK_A,1751
|
175
|
+
odxtools/templates/diag_layer_container.odx-d.xml.jinja2,sha256=fDH9K2IdGfX-dVV0pEpn2kkHIBQTT9B0Sb5dF4vGWco,1798
|
175
176
|
odxtools/templates/index.xml.jinja2,sha256=Z1bcntvvky7NoH0Q0CRJgUORwf3g96PFPGeOpi7VATw,647
|
176
177
|
odxtools/templates/macros/printAdminData.xml.jinja2,sha256=YTB_CbhnALF6RIbE0XKQHRbC6c0PSZ_DxdrRHgqMD_s,2590
|
177
178
|
odxtools/templates/macros/printAudience.xml.jinja2,sha256=vaYL_-GPVdlLc7WAQTbkVZZbFuQptnCbOhXJb3tsHv8,1286
|
@@ -201,6 +202,7 @@ odxtools/templates/macros/printFunctionalGroup.xml.jinja2,sha256=zIeZbhf8haXhgJJ
|
|
201
202
|
odxtools/templates/macros/printHierarchyElement.xml.jinja2,sha256=GD6iNIE0Wu0QsJ8uLtwEV8N9t6mIhI00_KpCVzOVQBM,651
|
202
203
|
odxtools/templates/macros/printLibrary.xml.jinja2,sha256=wp8vZzHPLZayWZh6BOQ56kGyHSeyrlNacdlxBw9d0N0,683
|
203
204
|
odxtools/templates/macros/printMux.xml.jinja2,sha256=68IiPY_mIJQqQiqce3jUphqp3-xLfmEBL7CSb3Cz7eI,1869
|
205
|
+
odxtools/templates/macros/printOdxCategory.xml.jinja2,sha256=SatvRj0yafePV_Xg6Un1d5KXq3yZyqV9f5YZU1wlzws,856
|
204
206
|
odxtools/templates/macros/printParam.xml.jinja2,sha256=U96BZDgcG8O0ewTXY8DHY8z29I8BkD4ndX0r7JAk54w,3197
|
205
207
|
odxtools/templates/macros/printParentRef.xml.jinja2,sha256=RllVKt2RgrMnWfsujGnBUiABwV2y4_ZfINYy7LXenPM,896
|
206
208
|
odxtools/templates/macros/printProtStack.xml.jinja2,sha256=0FHHvuduiMPhAE19vpTHu3cQeM9kSybWj5FbybcXnGk,773
|
@@ -218,9 +220,9 @@ odxtools/templates/macros/printStructure.xml.jinja2,sha256=CJUPZv_9lko63C5fNpOn5
|
|
218
220
|
odxtools/templates/macros/printSubComponent.xml.jinja2,sha256=ETo-k0K7px5nu9kgVjgDnjPoy8rYRfzq5ojvsZhM3Rw,3416
|
219
221
|
odxtools/templates/macros/printTable.xml.jinja2,sha256=5DQjjJ-UxQ75ntov0S0LGnm_V7YWtKadBpNbmV1aBb8,1501
|
220
222
|
odxtools/templates/macros/printUnitSpec.xml.jinja2,sha256=opS6_Gr94WlAtREEyX4sLo-D-17Gni9Wvr3y1nfVgSA,2715
|
221
|
-
odxtools-9.
|
222
|
-
odxtools-9.
|
223
|
-
odxtools-9.
|
224
|
-
odxtools-9.
|
225
|
-
odxtools-9.
|
226
|
-
odxtools-9.
|
223
|
+
odxtools-9.1.0.dist-info/LICENSE,sha256=NeGPFQdTa6EKeON3aShVlPAIquJnbbiOfj0suz6rzyQ,1074
|
224
|
+
odxtools-9.1.0.dist-info/METADATA,sha256=lWlcXTPndP5lltnstBDfgcNnDFdvatfp5eMZrTENDRM,44055
|
225
|
+
odxtools-9.1.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
226
|
+
odxtools-9.1.0.dist-info/entry_points.txt,sha256=_sBDzuNoT8LbbCjfc-OJiUt5WPrtOq_x-rr9txhrPjY,53
|
227
|
+
odxtools-9.1.0.dist-info/top_level.txt,sha256=pdS02kE5ZdgsaBRZDpX3NBFlaSx3zotsqX4E4V6tXEI,9
|
228
|
+
odxtools-9.1.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|