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 CHANGED
@@ -1,66 +1,39 @@
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
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(IdentifiableElement):
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
- short_name = odxrequire(et_element.findtext("SHORT-NAME"))
29
- doc_frags = [OdxDocFragment(short_name, str(et_element.tag))]
30
- kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
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: Dict[OdxLinkId, Any] = {}
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
- if self.admin_data is not None:
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 _resolve_snrefs(self, context: SnRefContext) -> None:
84
- if self.admin_data is not None:
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
- for cd in self.company_datas:
88
- cd._resolve_snrefs(context)
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)
@@ -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(IdentifiableElement):
23
- # mandatory in ODX 2.2, but non existent in ODX 2.0
21
+ class ComparamSubset(OdxCategory):
22
+ # mandatory in ODX 2.2, but non-existent in ODX 2.0
24
23
  category: Optional[str]
25
- data_object_props: NamedItemList[DataObjectProperty]
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
- category = et_element.get("CATEGORY")
38
-
39
- short_name = odxrequire(et_element.findtext("SHORT-NAME"))
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
- 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
- ])
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: Dict[OdxLinkId, Any] = {}
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
- if self.admin_data is not None:
122
- self.admin_data._resolve_odxlinks(odxlinks)
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
- # let the diaglayers sort out the inherited objects and the
143
- # short name references
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
 
@@ -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, Optional, Union
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 .specialdatagroup import SpecialDataGroup
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(IdentifiableElement):
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
- short_name = odxrequire(et_element.findtext("SHORT-NAME"))
58
- # create the current ODX "document fragment" (description of the
59
- # current document for references and IDs)
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 = {self.odx_id: self}
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
- if self.admin_data is not None:
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
@@ -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
- self._table = self._table_row.table
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
- if self._table is not None:
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/printAdminData.xml.jinja2') as pad -%}
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
- <COMPARAM-SPEC ID="{{comparam_spec.odx_id.local_id}}">
18
- <SHORT-NAME>{{comparam_spec.short_name}}</SHORT-NAME>
19
- {%- if comparam_spec.long_name is not none %}
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
- <COMPARAM-SUBSET ID="{{comparam_subset.odx_id.local_id}}"
21
- CATEGORY="{{comparam_subset.category}}" >
22
- <SHORT-NAME>{{comparam_subset.short_name}}</SHORT-NAME>
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/printAdminData.xml.jinja2') as pad -%}
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
- <!-- Written using odxtools {{odxtools_version}} -->
19
- <DIAG-LAYER-CONTAINER ID="{{dlc.odx_id.local_id}}">
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
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '9.0.0'
16
- __version_tuple__ = version_tuple = (9, 0, 0)
15
+ __version__ = version = '9.1.0'
16
+ __version_tuple__ = version_tuple = (9, 1, 0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: odxtools
3
- Version: 9.0.0
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=0-ThV2XoyN9iGSVyt-2U0JtTeS39IE19YhkvGE1RIm0,3175
17
- odxtools/comparamsubset.py,sha256=zlu0_ph6mp0v1CcWkB-G6XxFR8ZQGDX2_9edRkGRCbk,5306
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=ktsm_tJOXXWKlD-EW_Flp_fSXJvQYzZKIzwLAZEoLTE,9284
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=0JC6ioUGe5c8FzXRotyGEGMMDz8fzKCsK204tGN3cAo,6524
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=JUhnhMDi5G11GnJKO5jPzthe0-jnAAo_Og_J2g7KSgc,411
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=WSpSIbxFmEwBov6Jj5Ubj9gMr46OgrdNi5-UaahCjAo,5270
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=6Icnr2EMwRoKWRiHct8nrUb56jJ4giVmWApharQDLCc,9955
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=esdk5C0rjG6azzA1uZYiC-9Hzhqtn_d654AFq8VRa6g,1525
173
- odxtools/templates/comparam-subset.odx-cs.xml.jinja2,sha256=9desdk8puFzysHAeLSoZOBxM1d3EzjbnlqlhVsU-Kmc,2481
174
- odxtools/templates/diag_layer_container.odx-d.xml.jinja2,sha256=YC4-jWVRoFqD_zd2Sd5FKnAlYsGYGVm9n2uXQ6kXqW8,2388
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.0.0.dist-info/LICENSE,sha256=NeGPFQdTa6EKeON3aShVlPAIquJnbbiOfj0suz6rzyQ,1074
222
- odxtools-9.0.0.dist-info/METADATA,sha256=tWTGI9ZkJVc1N19f-GHHD1VpCnDl7s1g-LSUA1fmJPE,44055
223
- odxtools-9.0.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
224
- odxtools-9.0.0.dist-info/entry_points.txt,sha256=_sBDzuNoT8LbbCjfc-OJiUt5WPrtOq_x-rr9txhrPjY,53
225
- odxtools-9.0.0.dist-info/top_level.txt,sha256=pdS02kE5ZdgsaBRZDpX3NBFlaSx3zotsqX4E4V6tXEI,9
226
- odxtools-9.0.0.dist-info/RECORD,,
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,,