odxtools 8.0.5__py3-none-any.whl → 8.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.
Files changed (49) hide show
  1. odxtools/compumethods/compuinternaltophys.py +1 -1
  2. odxtools/compumethods/compuphystointernal.py +1 -1
  3. odxtools/compumethods/compurationalcoeffs.py +20 -9
  4. odxtools/compumethods/compuscale.py +18 -12
  5. odxtools/compumethods/linearsegment.py +5 -6
  6. odxtools/database.py +16 -3
  7. odxtools/element.py +9 -12
  8. odxtools/nameditemlist.py +1 -2
  9. odxtools/outputparam.py +1 -3
  10. odxtools/parameters/parameter.py +3 -0
  11. odxtools/physicaldimension.py +1 -4
  12. odxtools/templates/index.xml.jinja2 +1 -1
  13. odxtools/templates/macros/printAudience.xml.jinja2 +1 -1
  14. odxtools/templates/macros/printCompanyData.xml.jinja2 +2 -2
  15. odxtools/templates/macros/printComparam.xml.jinja2 +2 -2
  16. odxtools/templates/macros/printDOP.xml.jinja2 +1 -1
  17. odxtools/templates/macros/printDescription.xml.jinja2 +1 -1
  18. odxtools/templates/macros/printDiagComm.xml.jinja2 +1 -1
  19. odxtools/templates/macros/printDiagLayer.xml.jinja2 +1 -1
  20. odxtools/templates/macros/printDiagVariable.xml.jinja2 +3 -3
  21. odxtools/templates/macros/printDynamicEndmarkerField.xml.jinja2 +1 -1
  22. odxtools/templates/macros/printDynamicLengthField.xml.jinja2 +1 -1
  23. odxtools/templates/macros/printElementId.xml.jinja2 +5 -0
  24. odxtools/templates/macros/printEndOfPdu.xml.jinja2 +1 -1
  25. odxtools/templates/macros/printEnvDataDesc.xml.jinja2 +1 -1
  26. odxtools/templates/macros/printFunctionalClass.xml.jinja2 +1 -1
  27. odxtools/templates/macros/printMux.xml.jinja2 +1 -1
  28. odxtools/templates/macros/printParam.xml.jinja2 +2 -2
  29. odxtools/templates/macros/printProtStack.xml.jinja2 +1 -1
  30. odxtools/templates/macros/printRequest.xml.jinja2 +1 -1
  31. odxtools/templates/macros/printResponse.xml.jinja2 +1 -1
  32. odxtools/templates/macros/printSingleEcuJob.xml.jinja2 +1 -1
  33. odxtools/templates/macros/printSpecialData.xml.jinja2 +1 -1
  34. odxtools/templates/macros/printState.xml.jinja2 +1 -1
  35. odxtools/templates/macros/printStateChart.xml.jinja2 +1 -1
  36. odxtools/templates/macros/printStateTransition.xml.jinja2 +1 -1
  37. odxtools/templates/macros/printStaticField.xml.jinja2 +1 -1
  38. odxtools/templates/macros/printStructure.xml.jinja2 +1 -1
  39. odxtools/templates/macros/printTable.xml.jinja2 +2 -2
  40. odxtools/templates/macros/printUnitSpec.xml.jinja2 +3 -5
  41. odxtools/unit.py +1 -3
  42. odxtools/version.py +2 -2
  43. odxtools/writepdxfile.py +1 -0
  44. {odxtools-8.0.5.dist-info → odxtools-8.1.0.dist-info}/METADATA +1 -1
  45. {odxtools-8.0.5.dist-info → odxtools-8.1.0.dist-info}/RECORD +49 -49
  46. {odxtools-8.0.5.dist-info → odxtools-8.1.0.dist-info}/WHEEL +1 -1
  47. {odxtools-8.0.5.dist-info → odxtools-8.1.0.dist-info}/LICENSE +0 -0
  48. {odxtools-8.0.5.dist-info → odxtools-8.1.0.dist-info}/entry_points.txt +0 -0
  49. {odxtools-8.0.5.dist-info → odxtools-8.1.0.dist-info}/top_level.txt +0 -0
@@ -22,7 +22,7 @@ class CompuInternalToPhys:
22
22
  physical_type: DataType) -> "CompuInternalToPhys":
23
23
  compu_scales = [
24
24
  CompuScale.compuscale_from_et(
25
- cse, doc_frags, internal_type=internal_type, physical_type=physical_type)
25
+ cse, doc_frags, domain_type=internal_type, range_type=physical_type)
26
26
  for cse in et_element.iterfind("COMPU-SCALES/COMPU-SCALE")
27
27
  ]
28
28
 
@@ -22,7 +22,7 @@ class CompuPhysToInternal:
22
22
  physical_type: DataType) -> "CompuPhysToInternal":
23
23
  compu_scales = [
24
24
  CompuScale.compuscale_from_et(
25
- cse, doc_frags, internal_type=internal_type, physical_type=physical_type)
25
+ cse, doc_frags, domain_type=physical_type, range_type=internal_type)
26
26
  for cse in et_element.iterfind("COMPU-SCALES/COMPU-SCALE")
27
27
  ]
28
28
 
@@ -1,25 +1,36 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import List
3
+ from typing import List, Union, cast
4
4
  from xml.etree import ElementTree
5
5
 
6
- from ..exceptions import odxrequire
6
+ from ..exceptions import odxassert, odxrequire
7
7
  from ..odxlink import OdxDocFragment
8
+ from ..odxtypes import DataType
8
9
 
9
10
 
10
11
  @dataclass
11
12
  class CompuRationalCoeffs:
12
- numerators: List[float]
13
- denominators: List[float]
13
+ value_type: DataType
14
+
15
+ numerators: List[Union[int, float]]
16
+ denominators: List[Union[int, float]]
14
17
 
15
18
  @staticmethod
16
- def from_et(et_element: ElementTree.Element,
17
- doc_frags: List[OdxDocFragment]) -> "CompuRationalCoeffs":
19
+ def coeffs_from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment], *,
20
+ value_type: DataType) -> "CompuRationalCoeffs":
21
+ odxassert(
22
+ value_type
23
+ in (DataType.A_UINT32, DataType.A_INT32, DataType.A_FLOAT32, DataType.A_FLOAT64),
24
+ "Rational coefficients must be of numeric type.")
25
+
18
26
  numerators = [
19
- float(odxrequire(elem.text)) for elem in et_element.iterfind("COMPU-NUMERATOR/V")
27
+ cast(float, value_type.from_string(odxrequire(elem.text)))
28
+ for elem in et_element.iterfind("COMPU-NUMERATOR/V")
20
29
  ]
21
30
  denominators = [
22
- float(odxrequire(elem.text)) for elem in et_element.iterfind("COMPU-DENOMINATOR/V")
31
+ cast(float, value_type.from_string(odxrequire(elem.text)))
32
+ for elem in et_element.iterfind("COMPU-DENOMINATOR/V")
23
33
  ]
24
34
 
25
- return CompuRationalCoeffs(numerators=numerators, denominators=denominators)
35
+ return CompuRationalCoeffs(
36
+ value_type=value_type, numerators=numerators, denominators=denominators)
@@ -27,33 +27,39 @@ class CompuScale:
27
27
 
28
28
  # the following two attributes are not specified for COMPU-SCALE
29
29
  # tags in the XML, but they are required to do anything useful
30
- # with it.
31
- internal_type: DataType
32
- physical_type: DataType
30
+ # with compu scales: The domain type is the input set of the
31
+ # function associated with the compu scale object, whilst the
32
+ # range type represents the output set. IOW, for scales contained
33
+ # by the internal-to-physical mapping function, the domain type is
34
+ # the internal and the range type is the physical type of the
35
+ # compu method. (Vice versa for scales specified by the
36
+ # physical-to-internal mapping function.)
37
+ domain_type: DataType
38
+ range_type: DataType
33
39
 
34
40
  @staticmethod
35
41
  def compuscale_from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment], *,
36
- internal_type: DataType, physical_type: DataType) -> "CompuScale":
42
+ domain_type: DataType, range_type: DataType) -> "CompuScale":
37
43
  short_label = et_element.findtext("SHORT-LABEL")
38
44
  description = Description.from_et(et_element.find("DESC"), doc_frags)
39
45
 
40
46
  lower_limit = Limit.limit_from_et(
41
- et_element.find("LOWER-LIMIT"), doc_frags, value_type=internal_type)
47
+ et_element.find("LOWER-LIMIT"), doc_frags, value_type=domain_type)
42
48
  upper_limit = Limit.limit_from_et(
43
- et_element.find("UPPER-LIMIT"), doc_frags, value_type=internal_type)
49
+ et_element.find("UPPER-LIMIT"), doc_frags, value_type=domain_type)
44
50
 
45
51
  compu_inverse_value = None
46
52
  if (cive := et_element.find("COMPU-INVERSE-VALUE")) is not None:
47
- compu_inverse_value = CompuInverseValue.compuvalue_from_et(
48
- cive, data_type=internal_type)
53
+ compu_inverse_value = CompuInverseValue.compuvalue_from_et(cive, data_type=domain_type)
49
54
 
50
55
  compu_const = None
51
56
  if (cce := et_element.find("COMPU-CONST")) is not None:
52
- compu_const = CompuConst.compuvalue_from_et(cce, data_type=physical_type)
57
+ compu_const = CompuConst.compuvalue_from_et(cce, data_type=range_type)
53
58
 
54
59
  compu_rational_coeffs: Optional[CompuRationalCoeffs] = None
55
60
  if (crc_elem := et_element.find("COMPU-RATIONAL-COEFFS")) is not None:
56
- compu_rational_coeffs = CompuRationalCoeffs.from_et(crc_elem, doc_frags)
61
+ compu_rational_coeffs = CompuRationalCoeffs.coeffs_from_et(
62
+ crc_elem, doc_frags, value_type=range_type)
57
63
 
58
64
  return CompuScale(
59
65
  short_label=short_label,
@@ -63,8 +69,8 @@ class CompuScale:
63
69
  compu_inverse_value=compu_inverse_value,
64
70
  compu_const=compu_const,
65
71
  compu_rational_coeffs=compu_rational_coeffs,
66
- internal_type=internal_type,
67
- physical_type=physical_type)
72
+ domain_type=domain_type,
73
+ range_type=range_type)
68
74
 
69
75
  def applies(self, internal_value: AtomicOdxType) -> bool:
70
76
 
@@ -115,8 +115,7 @@ class LinearSegment:
115
115
  This method is called by `__post_init__()`.
116
116
  """
117
117
 
118
- def convert_internal_to_physical_limit(internal_limit: Optional[Limit],
119
- is_upper_limit: bool) -> Optional[Limit]:
118
+ def convert_internal_to_physical_limit(internal_limit: Optional[Limit]) -> Optional[Limit]:
120
119
  """Helper method to convert a single internal limit
121
120
  """
122
121
  if internal_limit is None or internal_limit.value_raw is None:
@@ -137,16 +136,16 @@ class LinearSegment:
137
136
 
138
137
  if self.factor >= 0:
139
138
  self._physical_lower_limit = convert_internal_to_physical_limit(
140
- self.internal_lower_limit, False)
139
+ self.internal_lower_limit)
141
140
  self._physical_upper_limit = convert_internal_to_physical_limit(
142
- self.internal_upper_limit, True)
141
+ self.internal_upper_limit)
143
142
  else:
144
143
  # If the scaling factor is negative, the lower and upper
145
144
  # limit are swapped
146
145
  self._physical_lower_limit = convert_internal_to_physical_limit(
147
- self.internal_upper_limit, True)
146
+ self.internal_upper_limit)
148
147
  self._physical_upper_limit = convert_internal_to_physical_limit(
149
- self.internal_lower_limit, False)
148
+ self.internal_lower_limit)
150
149
 
151
150
  def physical_applies(self, physical_value: AtomicOdxType) -> bool:
152
151
  """Returns True iff the segment is applicable to a given physical value"""
odxtools/database.py CHANGED
@@ -1,10 +1,10 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from itertools import chain
3
+ from os import PathLike
3
4
  from pathlib import Path
4
5
  from typing import IO, Any, Dict, List, Optional, OrderedDict, Union
5
6
  from xml.etree import ElementTree
6
7
  from zipfile import ZipFile
7
- from os import PathLike
8
8
 
9
9
  from packaging.version import Version
10
10
 
@@ -17,7 +17,7 @@ from .diaglayers.ecushareddata import EcuSharedData
17
17
  from .diaglayers.ecuvariant import EcuVariant
18
18
  from .diaglayers.functionalgroup import FunctionalGroup
19
19
  from .diaglayers.protocol import Protocol
20
- from .exceptions import odxraise
20
+ from .exceptions import odxraise, odxrequire
21
21
  from .nameditemlist import NamedItemList
22
22
  from .odxlink import OdxLinkDatabase, OdxLinkId
23
23
 
@@ -36,6 +36,7 @@ class Database:
36
36
  self._diag_layer_containers = NamedItemList[DiagLayerContainer]()
37
37
  self._comparam_subsets = NamedItemList[ComparamSubset]()
38
38
  self._comparam_specs = NamedItemList[ComparamSpec]()
39
+ self._short_name = "odx_database"
39
40
 
40
41
  def add_pdx_file(self, pdx_file: Union[str, "PathLike[Any]", IO[bytes], ZipFile]) -> None:
41
42
  """Add PDX file to database.
@@ -54,7 +55,11 @@ class Database:
54
55
  if p.suffix.lower().startswith(".odx"):
55
56
  root = ElementTree.parse(pdx_zip.open(zip_member)).getroot()
56
57
  self._process_xml_tree(root)
57
- elif p.name.lower() != "index.xml":
58
+ elif p.name.lower() == "index.xml":
59
+ root = ElementTree.parse(pdx_zip.open(zip_member)).getroot()
60
+ db_short_name = odxrequire(root.findtext("SHORT-NAME"))
61
+ self.short_name = db_short_name
62
+ else:
58
63
  self.add_auxiliary_file(zip_member, pdx_zip.open(zip_member))
59
64
 
60
65
  def add_odx_file(self, odx_file_name: Union[str, "PathLike[Any]"]) -> None:
@@ -158,6 +163,14 @@ class Database:
158
163
  """A map from odx_id to object"""
159
164
  return self._odxlinks
160
165
 
166
+ @property
167
+ def short_name(self) -> str:
168
+ return self._short_name
169
+
170
+ @short_name.setter
171
+ def short_name(self, value: str) -> None:
172
+ self._short_name = value
173
+
161
174
  @property
162
175
  def ecu_shared_datas(self) -> NamedItemList[EcuSharedData]:
163
176
  """All ECU shared data layers defined by this database
odxtools/element.py CHANGED
@@ -15,10 +15,7 @@ class NamedElement:
15
15
  description: Optional[Description]
16
16
 
17
17
  @staticmethod
18
- def from_et(
19
- et_element: ElementTree.Element,
20
- doc_frags: List[OdxDocFragment],
21
- ) -> "NamedElement":
18
+ def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "NamedElement":
22
19
 
23
20
  return NamedElement(
24
21
  short_name=odxrequire(et_element.findtext("SHORT-NAME")),
@@ -30,15 +27,15 @@ class NamedElement:
30
27
  @dataclass
31
28
  class IdentifiableElement(NamedElement):
32
29
  odx_id: OdxLinkId
30
+ oid: Optional[str]
33
31
 
34
32
  @staticmethod
35
- def from_et(
36
- et_element: ElementTree.Element,
37
- doc_frags: List[OdxDocFragment],
38
- ) -> "IdentifiableElement":
33
+ def from_et(et_element: ElementTree.Element,
34
+ doc_frags: List[OdxDocFragment]) -> "IdentifiableElement":
39
35
 
40
36
  kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, doc_frags))
41
- return IdentifiableElement(
42
- **kwargs,
43
- odx_id=odxrequire(OdxLinkId.from_et(et_element, doc_frags)),
44
- )
37
+
38
+ odx_id = odxrequire(OdxLinkId.from_et(et_element, doc_frags))
39
+ oid = et_element.get("OID")
40
+
41
+ return IdentifiableElement(**kwargs, odx_id=odx_id, oid=oid)
odxtools/nameditemlist.py CHANGED
@@ -141,8 +141,7 @@ class ItemAttributeList(List[T]):
141
141
  def __getitem__(self, key: slice) -> List[T]:
142
142
  ...
143
143
 
144
- def __getitem__( # type: ignore
145
- self, key: Union[SupportsIndex, str, slice]) -> Union[T, List[T]]:
144
+ def __getitem__(self, key: Union[SupportsIndex, str, slice]) -> Union[T, List[T]]:
146
145
  if isinstance(key, (SupportsIndex, slice)):
147
146
  return super().__getitem__(key)
148
147
  else:
odxtools/outputparam.py CHANGED
@@ -16,7 +16,6 @@ from .utils import dataclass_fields_asdict
16
16
  @dataclass
17
17
  class OutputParam(IdentifiableElement):
18
18
  dop_base_ref: OdxLinkRef
19
- oid: Optional[str]
20
19
  semantic: Optional[str]
21
20
 
22
21
  @staticmethod
@@ -25,9 +24,8 @@ class OutputParam(IdentifiableElement):
25
24
  kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
26
25
  dop_base_ref = odxrequire(OdxLinkRef.from_et(et_element.find("DOP-BASE-REF"), doc_frags))
27
26
  semantic = et_element.get("SEMANTIC")
28
- oid = et_element.get("OID")
29
27
 
30
- return OutputParam(dop_base_ref=dop_base_ref, semantic=semantic, oid=oid, **kwargs)
28
+ return OutputParam(dop_base_ref=dop_base_ref, semantic=semantic, **kwargs)
31
29
 
32
30
  def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
33
31
  return {}
@@ -40,6 +40,7 @@ class Parameter(NamedElement):
40
40
  define any non-positionable parameter types.
41
41
 
42
42
  """
43
+ oid: Optional[str]
43
44
  byte_position: Optional[int]
44
45
  bit_position: Optional[int]
45
46
  semantic: Optional[str]
@@ -51,6 +52,7 @@ class Parameter(NamedElement):
51
52
 
52
53
  kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, doc_frags))
53
54
 
55
+ oid = et_element.get("OID")
54
56
  semantic = et_element.get("SEMANTIC")
55
57
  sdgs = [
56
58
  SpecialDataGroup.from_et(sdge, doc_frags) for sdge in et_element.iterfind("SDGS/SDG")
@@ -63,6 +65,7 @@ class Parameter(NamedElement):
63
65
  bit_position = int(bit_position_str) if bit_position_str is not None else None
64
66
 
65
67
  return Parameter(
68
+ oid=oid,
66
69
  byte_position=byte_position,
67
70
  bit_position=bit_position,
68
71
  semantic=semantic,
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from dataclasses import dataclass
3
- from typing import Any, Dict, List, Optional
3
+ from typing import Any, Dict, List
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from .element import IdentifiableElement
@@ -41,7 +41,6 @@ class PhysicalDimension(IdentifiableElement):
41
41
  )
42
42
  ```
43
43
  """
44
- oid: Optional[str]
45
44
  length_exp: int
46
45
  mass_exp: int
47
46
  time_exp: int
@@ -54,7 +53,6 @@ class PhysicalDimension(IdentifiableElement):
54
53
  def from_et(et_element: ElementTree.Element,
55
54
  doc_frags: List[OdxDocFragment]) -> "PhysicalDimension":
56
55
  kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
57
- oid = et_element.get("OID")
58
56
 
59
57
  def read_optional_int(element: ElementTree.Element, name: str) -> int:
60
58
  if val_str := element.findtext(name):
@@ -71,7 +69,6 @@ class PhysicalDimension(IdentifiableElement):
71
69
  luminous_intensity_exp = read_optional_int(et_element, "LUMINOUS-INTENSITY-EXP")
72
70
 
73
71
  return PhysicalDimension(
74
- oid=oid,
75
72
  length_exp=length_exp,
76
73
  mass_exp=mass_exp,
77
74
  time_exp=time_exp,
@@ -4,7 +4,7 @@
4
4
  -#}
5
5
  <?xml version="1.0" encoding="UTF-8"?>
6
6
  <CATALOG xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" F-DTD-VERSION="ODX-2.2.0" xsi:noNamespaceSchemaLocation="odx-cc.xsd">
7
- <SHORT-NAME>{{ecu_name}}</SHORT-NAME>
7
+ <SHORT-NAME>{{database.short_name}}</SHORT-NAME>
8
8
  <ABLOCKS>
9
9
  {%- for file_name, creation_date, mime_type in file_index %}
10
10
  <ABLOCK UPD="UNCHANGED">
@@ -6,7 +6,7 @@
6
6
  {%- import('macros/printElementId.xml.jinja2') as peid %}
7
7
 
8
8
  {%- macro printAdditionalAudience(audience) -%}
9
- <ADDITIONAL-AUDIENCE ID="{{audience.odx_id.local_id}}">
9
+ <ADDITIONAL-AUDIENCE {{-peid.printElementIdAttribs(audience)}}>
10
10
  {{ peid.printElementIdSubtags(audience)|indent(1) }}
11
11
  </ADDITIONAL-AUDIENCE>
12
12
  {%- endmacro -%}
@@ -8,7 +8,7 @@
8
8
  {%- import('macros/printDescription.xml.jinja2') as pd %}
9
9
 
10
10
  {%- macro printCompanyData(company_data) %}
11
- <COMPANY-DATA ID="{{company_data.odx_id.local_id}}">
11
+ <COMPANY-DATA {{-peid.printElementIdAttribs(company_data)}}>
12
12
  {{ peid.printElementIdSubtags(company_data)|indent(1) }}
13
13
  {%- if company_data.roles is not none %}
14
14
  <ROLES>
@@ -20,7 +20,7 @@
20
20
  {%- if company_data.team_members is not none %}
21
21
  <TEAM-MEMBERS>
22
22
  {%- for team_member in company_data.team_members %}
23
- <TEAM-MEMBER ID="{{team_member.odx_id.local_id}}">
23
+ <TEAM-MEMBER {{-peid.printElementIdAttribs(team_member)}}>
24
24
  {{ peid.printElementIdSubtags(team_member)|indent(3) }}
25
25
  {%- if team_member.roles is not none %}
26
26
  <ROLES>
@@ -38,7 +38,7 @@
38
38
  {%- endmacro %}
39
39
 
40
40
  {%- macro printSimpleComparam(cp) %}
41
- <COMPARAM ID="{{cp.odx_id.local_id}}"
41
+ <COMPARAM {{-peid.printElementIdAttribs(cp)}}
42
42
  PARAM-CLASS="{{cp.param_class}}"
43
43
  CPTYPE="{{cp.cptype.value}}"
44
44
  {{make_xml_attrib("DISPLAY-LEVEL", cp.display_level)}}{#- #}
@@ -52,7 +52,7 @@
52
52
  {%- endmacro %}
53
53
 
54
54
  {%- macro printComplexComparam(cp) %}
55
- <COMPLEX-COMPARAM ID="{{cp.odx_id.local_id}}"
55
+ <COMPLEX-COMPARAM {{-peid.printElementIdAttribs(cp)}}
56
56
  PARAM-CLASS="{{cp.param_class}}"
57
57
  CPTYPE="{{cp.cptype.value}}"
58
58
  {{make_xml_attrib("DISPLAY-LEVEL", cp.display_level)}}{#- #}
@@ -130,7 +130,7 @@
130
130
  {%- if hasattr(dtc, "ref_id") %}
131
131
  <DTC-REF ID-REF="{{dtc.ref_id}}" />
132
132
  {%- else %}
133
- <DTC ID="{{dtc.odx_id.local_id}}">
133
+ <DTC {{-peid.printElementIdAttribs(dtc)}}>
134
134
  <SHORT-NAME>{{dtc.short_name}}</SHORT-NAME>
135
135
  <TROUBLE-CODE>{{dtc.trouble_code}}</TROUBLE-CODE>
136
136
  {%- if dtc.display_trouble_code is not none %}
@@ -5,7 +5,7 @@
5
5
 
6
6
  {%- macro printDescription(desc) %}
7
7
  {%- if desc is not none %}
8
- <DESC {{make_xml_attrib("TI", desc.text_identifier)}}>{{desc.text}}
8
+ <DESC {{- make_xml_attrib("TI", desc.text_identifier)}}>{{desc.text}}
9
9
  {%- if desc.external_docs %}
10
10
  <EXTERNAL-DOCS>
11
11
  {%- for ed in desc.external_docs %}
@@ -9,7 +9,7 @@
9
9
  {%- import('macros/printSpecialData.xml.jinja2') as psd %}
10
10
 
11
11
  {%- macro printDiagCommAttribs(dc) -%}
12
- ID="{{dc.odx_id.local_id}}"
12
+ {{-peid.printElementIdAttribs(dc)}}
13
13
  {{-make_xml_attrib("SEMANTIC", dc.semantic)}}
14
14
  {{-make_xml_attrib("DIAGNOSTIC-CLASS", dc.diagnostic_class and dc.diagnostic_class.value)}}
15
15
  {{-make_bool_xml_attrib("IS-MANDATORY", dc.is_mandatory_raw)}}
@@ -27,7 +27,7 @@
27
27
  {%- import('macros/printAdminData.xml.jinja2') as pad %}
28
28
 
29
29
  {%- macro printDiagLayerAttribs(dl) -%}
30
- {#- #} ID="{{dl.diag_layer_raw.odx_id.local_id}}"{# -#}
30
+ {#- #} {{-peid.printElementIdAttribs(dl)}}{# -#}
31
31
  {%- endmacro -%}
32
32
 
33
33
  {%- macro printDiagLayerSubtags(dl) -%}
@@ -7,7 +7,7 @@
7
7
  {%- import('macros/printDescription.xml.jinja2') as pd %}
8
8
 
9
9
  {%- macro printDiagVariable(diag_var) -%}
10
- <DIAG-VARIABLE>
10
+ <DIAG-VARIABLE {{-peid.printElementIdAttribs(diag_var)}}>
11
11
  {{ peid.printElementIdSubtags(diag_variable)|indent(2) }}
12
12
  {%- if diag_variable.admin_data is not none %}
13
13
  {{ pad.printAdminData(diag_variable.admin_data)|indent(2) }}
@@ -16,7 +16,7 @@
16
16
  {%- if diag_variable.sw_variables %}
17
17
  <SW-VARIABLES>
18
18
  {%- for sw_var in diag_variable.sw_variables %}
19
- <SW-VARIABLE>
19
+ <SW-VARIABLE {{-peid.printElementIdAttribs(sw_var)}}>
20
20
  {{ peid.printElementIdSubtags(sw_var)|indent(6) }}
21
21
  {%- if sw_var.origin is not none %}
22
22
  <ORIGIN>{{ sw_var.origin }}</ORIGIN>
@@ -60,7 +60,7 @@
60
60
  {%- endmacro -%}
61
61
 
62
62
  {%- macro printVariableGroup(var_group) -%}
63
- <VARIABLE-GROUP>
63
+ <VARIABLE-GROUP {{-peid.printElementIdAttribs(var_group)}}>
64
64
  {{ peid.printElementIdSubtags(diag_variable)|indent(2) }}
65
65
  </VARIABLE-GROUP>
66
66
  {%- endmacro -%}
@@ -6,7 +6,7 @@
6
6
  {%- import('macros/printElementId.xml.jinja2') as peid %}
7
7
 
8
8
  {%- macro printStaticField(demf) -%}
9
- <DYNAMIC-ENDMARKER-FIELD ID="{{demf.odx_id.local_id}}">
9
+ <DYNAMIC-ENDMARKER-FIELD {{-peid.printElementIdAttribs(demf)}}>
10
10
  {{ peid.printElementIdSubtags(demf)|indent(1) }}
11
11
  <BASIC-STRUCTURE-REF ID-REF="{{demf.structure_ref.ref_id}}" />
12
12
  <DYN-END-DOP-REF ID-REF="{{demf.dyn_end_dop_ref.ref_id}}">
@@ -6,7 +6,7 @@
6
6
  {%- import('macros/printElementId.xml.jinja2') as peid %}
7
7
 
8
8
  {%- macro printDynamicLengthField(dlf) -%}
9
- <DYNAMIC-LENGTH-FIELD ID="{{dlf.odx_id.local_id}}">
9
+ <DYNAMIC-LENGTH-FIELD {{-peid.printElementIdAttribs(dlf)}}>
10
10
  {{ peid.printElementIdSubtags(dlf)|indent(1) }}
11
11
  <BASIC-STRUCTURE-REF ID-REF="{{dlf.structure_ref.ref_id}}" />
12
12
  <OFFSET>{{dlf.offset}}</OFFSET>
@@ -5,6 +5,11 @@
5
5
 
6
6
  {%- import('macros/printDescription.xml.jinja2') as pd %}
7
7
 
8
+ {%- macro printElementIdAttribs(obj) -%}
9
+ {#- #} {{- make_xml_attrib("ID", obj.odx_id.local_id) }}
10
+ {#- #} {{- make_xml_attrib("OID", getattr(obj, "oid", none)) -}}
11
+ {%- endmacro -%}
12
+
8
13
  {%- macro printElementIdSubtags(obj) -%}
9
14
  <SHORT-NAME>{{ obj.short_name }}</SHORT-NAME>
10
15
  {%- if obj.long_name %}
@@ -6,7 +6,7 @@
6
6
  {%- import('macros/printElementId.xml.jinja2') as peid %}
7
7
 
8
8
  {%- macro printEndOfPdu(eopdu) -%}
9
- <END-OF-PDU-FIELD ID="{{eopdu.odx_id.local_id}}">
9
+ <END-OF-PDU-FIELD {{-peid.printElementIdAttribs(eopdu)}}>
10
10
  {{ peid.printElementIdSubtags(eopdu)|indent(1) }}
11
11
  <BASIC-STRUCTURE-REF ID-REF="{{eopdu.structure_ref.ref_id}}" />
12
12
  {%- if eopdu.max_number_of_items is not none %}
@@ -6,7 +6,7 @@
6
6
  {%- import('macros/printElementId.xml.jinja2') as peid %}
7
7
 
8
8
  {%- macro printEnvDataDesc(env_data_desc) %}
9
- <ENV-DATA-DESC ID="{{env_data_desc.odx_id.local_id}}">
9
+ <ENV-DATA-DESC {{-peid.printElementIdAttribs(env_data_desc)}}>
10
10
  {{ peid.printElementIdSubtags(env_data_desc)|indent(1) }}
11
11
  <PARAM-SNREF SHORT-NAME="{{env_data_desc.param_snref}}"/>
12
12
  <ENV-DATA-REFS>
@@ -7,7 +7,7 @@
7
7
  {%- import('macros/printElementId.xml.jinja2') as peid %}
8
8
 
9
9
  {%- macro printFunctionalClass(fc) -%}
10
- <FUNCT-CLASS ID="{{fc.odx_id.local_id}}">
10
+ <FUNCT-CLASS {{-peid.printElementIdAttribs(fc)}}>
11
11
  {{ peid.printElementIdSubtags(fc)|indent(1) }}
12
12
  </FUNCT-CLASS>
13
13
  {%- endmacro -%}
@@ -8,7 +8,7 @@
8
8
  {%- import('macros/printDOP.xml.jinja2') as pdop %}
9
9
 
10
10
  {%- macro printMux(mux) %}
11
- <MUX ID="{{mux.odx_id.local_id}}"
11
+ <MUX {{-peid.printElementIdAttribs(mux)}}
12
12
  {{-make_bool_xml_attrib("IS-VISIBLE", mux.is_visible_raw)}}
13
13
  {#- #}>
14
14
  {{ peid.printElementIdSubtags(mux)|indent(1) }}
@@ -11,8 +11,8 @@
11
11
  {%- set semattrib = make_xml_attrib("SEMANTIC", param.semantic) -%}
12
12
  {%- if param.parameter_type == "TABLE-KEY" %}
13
13
  <PARAM {{ semattrib }}
14
- {{- make_xml_attrib("ID", param.odx_id and param.odx_id.local_id) }}
15
- xsi:type="{{param.parameter_type}}">
14
+ {{-peid.printElementIdAttribs(param)}}
15
+ xsi:type="{{param.parameter_type}}">
16
16
  {%- elif param.parameter_type == "SYSTEM" %}
17
17
  <PARAM {{ semattrib }}
18
18
  {{- make_xml_attrib("SYSPARAM", param.sysparam) }}
@@ -7,7 +7,7 @@
7
7
  {%- import('macros/printSpecialData.xml.jinja2') as psd %}
8
8
 
9
9
  {%- macro printProtStack(ps) %}
10
- <PROT-STACK ID="{{ps.odx_id.local_id}}">
10
+ <PROT-STACK {{-peid.printElementIdAttribs(ps)}}>
11
11
  {{ peid.printElementIdSubtags(ps) | indent(1) }}
12
12
  <PDU-PROTOCOL-TYPE>{{ ps.pdu_protocol_type }}</PDU-PROTOCOL-TYPE>
13
13
  <PHYSICAL-LINK-TYPE>{{ ps.physical_link_type }}</PHYSICAL-LINK-TYPE>
@@ -9,7 +9,7 @@
9
9
  {%- import('macros/printSpecialData.xml.jinja2') as psd %}
10
10
 
11
11
  {%- macro printRequest(request) -%}
12
- <REQUEST ID="{{request.odx_id.local_id}}">
12
+ <REQUEST {{-peid.printElementIdAttribs(request)}}>
13
13
  {{ peid.printElementIdSubtags(request)|indent(1) }}
14
14
  {%- if request.parameters %}
15
15
  <PARAMS>
@@ -8,7 +8,7 @@
8
8
  {%- import('macros/printSpecialData.xml.jinja2') as psd %}
9
9
 
10
10
  {%- macro printResponse(resp, tag_name="POS-RESPONSE") -%}
11
- <{{tag_name}} ID="{{resp.odx_id.local_id}}">
11
+ <{{tag_name}} {{-peid.printElementIdAttribs(resp)}}>
12
12
  {{ peid.printElementIdSubtags(resp)|indent(1) }}
13
13
  {%- if resp.parameters %}
14
14
  <PARAMS>
@@ -73,7 +73,7 @@
73
73
  {%- endmacro -%}
74
74
 
75
75
  {%- macro printOutputParam(param) -%}
76
- <OUTPUT-PARAM ID="{{param.odx_id.local_id}}"
76
+ <OUTPUT-PARAM {{-peid.printElementIdAttribs(param)}}
77
77
  {{-make_xml_attrib("OID", param.oid)}}
78
78
  {{-make_xml_attrib("SEMANTIC", param.semantic)}}>
79
79
  {{ peid.printElementIdSubtags(param)|indent(1) }}
@@ -17,7 +17,7 @@
17
17
  {%- endmacro %}
18
18
 
19
19
  {%- macro printSdgCaption(sdg_caption) %}
20
- <SDG-CAPTION ID="{{sdg_caption.odx_id.local_id}}">
20
+ <SDG-CAPTION {{-peid.printElementIdAttribs(sdg_caption)}}>
21
21
  {{ peid.printElementIdSubtags(sdg_caption)|indent(1) }}
22
22
  </SDG-CAPTION>
23
23
  {%- endmacro %}
@@ -6,7 +6,7 @@
6
6
  {%- import('macros/printElementId.xml.jinja2') as peid %}
7
7
 
8
8
  {%- macro printState(state) -%}
9
- <STATE ID="{{state.odx_id.local_id}}">
9
+ <STATE {{-peid.printElementIdAttribs(state)}}>
10
10
  {{ peid.printElementIdSubtags(state)|indent(1) }}
11
11
  </STATE>
12
12
  {%- endmacro -%}
@@ -8,7 +8,7 @@
8
8
  {%- import('macros/printStateTransition.xml.jinja2') as pst %}
9
9
 
10
10
  {%- macro printStateChart(state_chart) -%}
11
- <STATE-CHART ID="{{state_chart.odx_id.local_id}}">
11
+ <STATE-CHART {{-peid.printElementIdAttribs(state_chart)}}>
12
12
  {{ peid.printElementIdSubtags(state_chart)|indent(1) }}
13
13
  <SEMANTIC>{{state_chart.semantic}}</SEMANTIC>
14
14
  {%- if state_chart.state_transitions %}
@@ -6,7 +6,7 @@
6
6
  {%- import('macros/printElementId.xml.jinja2') as peid %}
7
7
 
8
8
  {%- macro printStateTransition(state_transition) -%}
9
- <STATE-TRANSITION ID="{{state_transition.odx_id.local_id}}">
9
+ <STATE-TRANSITION {{-peid.printElementIdAttribs(state_transition)}}>
10
10
  {{ peid.printElementIdSubtags(state_transition)|indent(1) }}
11
11
  <SOURCE-SNREF SHORT-NAME="{{state_transition.source_snref}}" />
12
12
  <TARGET-SNREF SHORT-NAME="{{state_transition.target_snref}}" />
@@ -6,7 +6,7 @@
6
6
  {%- import('macros/printElementId.xml.jinja2') as peid %}
7
7
 
8
8
  {%- macro printStaticField(sf) -%}
9
- <STATIC-FIELD ID="{{sf.odx_id.local_id}}">
9
+ <STATIC-FIELD {{-peid.printElementIdAttribs(sf)}}>
10
10
  {{ peid.printElementIdSubtags(sf)|indent(1) }}
11
11
  <BASIC-STRUCTURE-REF ID-REF="{{sf.structure_ref.ref_id}}" />
12
12
  <FIXED-NUMBER-OF-ITEMS>{{sf.fixed_number_of_items}}</FIXED-NUMBER-OF-ITEMS>
@@ -7,7 +7,7 @@
7
7
  {%- import('macros/printParam.xml.jinja2') as pp %}
8
8
 
9
9
  {%- macro printStructure(st) -%}
10
- <STRUCTURE ID="{{st.odx_id.local_id}}">
10
+ <STRUCTURE {{-peid.printElementIdAttribs(st)}}>
11
11
  {{ peid.printElementIdSubtags(st)|indent(1) }}
12
12
  {%- if st.byte_size is not none %}
13
13
  <BYTE-SIZE>{{st.byte_size}}</BYTE-SIZE>
@@ -8,7 +8,7 @@
8
8
  {%- import('macros/printDescription.xml.jinja2') as pd %}
9
9
 
10
10
  {%- macro printTable(table) %}
11
- <TABLE ID="{{table.odx_id.local_id}}"
11
+ <TABLE {{-peid.printElementIdAttribs(table)}}
12
12
  {{-make_xml_attrib("SEMANTIC", table.semantic)}}>
13
13
  {{ peid.printElementIdSubtags(table)|indent(1) }}
14
14
  {%- if table.key_dop_ref %}
@@ -16,7 +16,7 @@
16
16
  {%- endif %}
17
17
  {%- for table_row in table.table_rows_raw %}
18
18
  {%- if hasattr(table_row, "key") %}
19
- <TABLE-ROW ID="{{table_row.odx_id.local_id}}"
19
+ <TABLE-ROW {{-peid.printElementIdAttribs(table_row)}}
20
20
  {{-make_xml_attrib("SEMANTIC", table_row.semantic)}}>
21
21
  <SHORT-NAME>{{table_row.short_name}}</SHORT-NAME>
22
22
  {%- if table_row.long_name %}
@@ -35,8 +35,7 @@
35
35
 
36
36
 
37
37
  {%- macro printUnit(unit) -%}
38
- <UNIT ID="{{unit.odx_id.local_id}}"
39
- {{-make_xml_attrib("OID", unit.oid)}}>
38
+ <UNIT {{-peid.printElementIdAttribs(unit)}}>
40
39
  {{ peid.printElementIdSubtags(unit)|indent(1) }}
41
40
  <DISPLAY-NAME>{{ unit.display_name }}</DISPLAY-NAME>
42
41
  {%- if unit.factor_si_to_unit is not none %}
@@ -52,7 +51,7 @@
52
51
  {%- endmacro -%}
53
52
 
54
53
  {%- macro printUnitGroup(group) -%}
55
- <UNIT-GROUP {%- if group.oid %} OID="{{group.oid}}" {%- endif %}>
54
+ <UNIT-GROUP {{-make_xml_attrib("OID", group.oid)}}>
56
55
  {{ peid.printElementIdSubtags(group)|indent(1) }}
57
56
  <CATEGORY>{{ group.category.value }}</CATEGORY>
58
57
  {%- if group.unit_refs %}
@@ -66,8 +65,7 @@
66
65
  {%- endmacro -%}
67
66
 
68
67
  {%- macro printPhysicalDimesion(dim) -%}
69
- <PHYSICAL-DIMENSION ID="{{dim.odx_id.local_id}}"
70
- {{-make_xml_attrib("OID",dim.oid)}}>
68
+ <PHYSICAL-DIMENSION {{-peid.printElementIdAttribs(dim)}}>
71
69
  {{ peid.printElementIdSubtags(dim)|indent(1) }}
72
70
  {%- if dim.length_exp %}
73
71
  <LENGTH-EXP>{{ dim.length_exp }}</LENGTH-EXP>
odxtools/unit.py CHANGED
@@ -53,7 +53,6 @@ class Unit(IdentifiableElement):
53
53
  ```
54
54
  """
55
55
  display_name: str
56
- oid: Optional[str]
57
56
  factor_si_to_unit: Optional[float]
58
57
  offset_si_to_unit: Optional[float]
59
58
  physical_dimension_ref: Optional[OdxLinkRef]
@@ -64,7 +63,7 @@ class Unit(IdentifiableElement):
64
63
  @staticmethod
65
64
  def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "Unit":
66
65
  kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
67
- oid = et_element.get("OID")
66
+
68
67
  display_name = odxrequire(et_element.findtext("DISPLAY-NAME"))
69
68
 
70
69
  def read_optional_float(element: ElementTree.Element, name: str) -> Optional[float]:
@@ -80,7 +79,6 @@ class Unit(IdentifiableElement):
80
79
 
81
80
  return Unit(
82
81
  display_name=display_name,
83
- oid=oid,
84
82
  factor_si_to_unit=factor_si_to_unit,
85
83
  offset_si_to_unit=offset_si_to_unit,
86
84
  physical_dimension_ref=physical_dimension_ref,
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 = '8.0.5'
16
- __version_tuple__ = version_tuple = (8, 0, 5)
15
+ __version__ = version = '8.1.0'
16
+ __version_tuple__ = version_tuple = (8, 1, 0)
odxtools/writepdxfile.py CHANGED
@@ -140,6 +140,7 @@ def write_pdx_file(
140
140
  out_file.write(data_file.read())
141
141
 
142
142
  jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader(templates_dir))
143
+ jinja_env.globals["getattr"] = getattr
143
144
  jinja_env.globals["hasattr"] = hasattr
144
145
  jinja_env.globals["odxraise"] = jinja2_odxraise_helper
145
146
  jinja_env.globals["make_xml_attrib"] = make_xml_attrib
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: odxtools
3
- Version: 8.0.5
3
+ Version: 8.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>
@@ -19,7 +19,7 @@ odxtools/complexdop.py,sha256=AHkHMf_IEWfy-_zSiCuZXmdTNCXiCOpg5GRZ5uMVV5A,280
19
19
  odxtools/createanycomparam.py,sha256=RP0XA2Ut4GL2NWy05RvKBrTnpbvvCG2XuNL8OO-9rbI,617
20
20
  odxtools/createanydiagcodedtype.py,sha256=0DVmMj4UCDYIg0zu9pgTplyhHmRedz1KJcchq1uKMjg,1216
21
21
  odxtools/createecuvariantpatterns.py,sha256=FXHLGR4M791MRkpU2_keck88hoMYkuyPiCUxuGbUasQ,559
22
- odxtools/database.py,sha256=FlyIkTPGsJoVceJco4c_GBlMbV5YdM5nokfVVTia3vo,8832
22
+ odxtools/database.py,sha256=ktsm_tJOXXWKlD-EW_Flp_fSXJvQYzZKIzwLAZEoLTE,9284
23
23
  odxtools/dataobjectproperty.py,sha256=R5sOMIejzcTB-CXTRrL2dWnFwR08eInF531s3l9BQcI,5888
24
24
  odxtools/decodestate.py,sha256=jJxLUzUYZ0C4t18FhJzo2iRTP8DF7BzrWLtRTTlLsJI,4885
25
25
  odxtools/description.py,sha256=UoACftC_n7fQ1n9WDwCzizStMH0HCO2Qv0YLRaSjEgs,1484
@@ -40,7 +40,7 @@ odxtools/dyndefinedspec.py,sha256=ErtMIFVAB-E-ujTUwLXxsheGOOFkhNy6zCXs4cp7biE,76
40
40
  odxtools/dynenddopref.py,sha256=SYXrmRUQoLWD4UI3WV92oA5rNhxbDuRv6H1MeXeuWhM,1199
41
41
  odxtools/ecuvariantmatcher.py,sha256=muZfBcHVUQFXn3mBRwLtQ2asGV1oDYkDrBwZ9WYuLKU,6848
42
42
  odxtools/ecuvariantpattern.py,sha256=Xp2NpS13sVvyOjy2PgxLvXPptAfmYSH_KDIjqYByZHs,863
43
- odxtools/element.py,sha256=7JlWYW_KERDpYPfofdfRwT8UQBI94B_iEmhNCM7jUi8,1230
43
+ odxtools/element.py,sha256=nCJkQMIPC26XfD4w1VrTH3l7Cd_BemMM_5lALh5gC7E,1259
44
44
  odxtools/encodestate.py,sha256=yxeql949uvlB2WnsF0jVcMJ6PvaoYcGB7M0OuB4Afj0,10008
45
45
  odxtools/endofpdufield.py,sha256=mGkhTj-YGdJ4EHMsK3AlWV6G_KLWI4ymiFKbY8U2W50,3359
46
46
  odxtools/environmentdata.py,sha256=_wSKhV_NuMG6UPMnpOxz6mVjvrXsd2mtqqT7VKSSxHU,1414
@@ -62,16 +62,16 @@ odxtools/multiplexer.py,sha256=0xUdNSPSJuOzwnh6vyZyp8ycYKfg570R9kpHHoACrEE,10239
62
62
  odxtools/multiplexercase.py,sha256=ObUQIf41UM3tQuECwPLks2Iff_FbN7A-W4Vh6zxSKNs,3177
63
63
  odxtools/multiplexerdefaultcase.py,sha256=u3YxZZawhXTOdrC5ltt1YNNaDMGrbL9qsz6PTKrPdSM,2104
64
64
  odxtools/multiplexerswitchkey.py,sha256=fnCpPcg47JQZQsrqS2RAa_O-JrfUb0pvhKv8hhs1RXQ,1551
65
- odxtools/nameditemlist.py,sha256=kPNab44E3cSHXjih7MDgjLBARb98PGB2qcPnM_445O4,6550
65
+ odxtools/nameditemlist.py,sha256=IYN_OBVf_iIU6a5CQ-gCttiUMeJEe04uk9z6Ro6IGK8,6521
66
66
  odxtools/negoutputparam.py,sha256=u2IhJvy6n19t3nyADGG0H0XTm7JNdQ0-95FawGAdtiE,1373
67
67
  odxtools/obd.py,sha256=WsUbhdonqQJtxf972CUdYL78AMMTVjMQhoCJbaZhRIo,1860
68
68
  odxtools/odxlink.py,sha256=YoEovTx5T8c5YFJPa2CSxk_gwRfP8miGCwicHbpqQNg,9259
69
69
  odxtools/odxtypes.py,sha256=Cg1BxXAoOW-cqbbmePw3x-rZ2CW6qZGlFX2xdAanlKc,7541
70
- odxtools/outputparam.py,sha256=e9YvdJvKlX-GOdmu2vCPO6BZEyOLuOsYEdvtC5ISLHM,1636
70
+ odxtools/outputparam.py,sha256=_NVZj4YfU_RdPpGUnz659-70DaYwBxYxwktxZ5lSMsY,1568
71
71
  odxtools/parameterinfo.py,sha256=hsUqlTnMJ-s6QbA6-X7rN6b6NfdnagJ1u_1JLLuYRqo,8564
72
72
  odxtools/paramlengthinfotype.py,sha256=vhgvCPIRnyCF9t8yhkYf5MsHXQhWWeEgz_kS8AbiONQ,4700
73
73
  odxtools/parentref.py,sha256=kcY3VMyVaIUWD0iVNX8sD9qeI4peU8gijboquu0zD7E,3751
74
- odxtools/physicaldimension.py,sha256=iaf7LIJEiEoV3WniybEpDvGgL4Z_iWCjo1HlQy663GU,3359
74
+ odxtools/physicaldimension.py,sha256=CEH7Ura4gqsqlBUxBW08ea9Pxh_Od8JruYQ8o9qOGME,3269
75
75
  odxtools/physicaltype.py,sha256=oYjOhdrTVCJcLLBYgy6pxKsZHpuwm1vZ8svwSjsUB6E,2699
76
76
  odxtools/progcode.py,sha256=ZoGf6X7qH3TT8zSr3bQAYwPb0Il4V6vSLWgdTnlj88Y,2169
77
77
  odxtools/protstack.py,sha256=nb2RR4OEaGX6lJ6drHejJU-tkB1p0Ok0KLZhNMTdsEc,2012
@@ -97,13 +97,13 @@ odxtools/table.py,sha256=zgpVveH8neSNhdcsPp0jG4f6H00M0NKCuAME8MSrf-Q,4024
97
97
  odxtools/tablerow.py,sha256=hOi7FCX7TiCRxErCD1hKU6h2hT5_8V3ghtt8dJXOiQY,6307
98
98
  odxtools/teammember.py,sha256=xn1y6k42zQoyM2SlEkZ8UFyiqBvVI5FNZAm_xt2Vt_Y,1772
99
99
  odxtools/uds.py,sha256=69SyVnQDcyspzSf6QVfm_Uk9iCxczD6UcrO1PxhNo7E,5894
100
- odxtools/unit.py,sha256=zzQlQGAct6G0dARTlqBlhqnkg2iixkViI4VScLWrnP4,3667
100
+ odxtools/unit.py,sha256=PLMErZ6N9oA4z3fuwYsmqMajeVHFNtKhC-w7IzaTfvw,3588
101
101
  odxtools/unitgroup.py,sha256=_WNpnYFmkiHQnOY8XhIviiQLXziY3kplH--7ufAWXyI,2067
102
102
  odxtools/unitspec.py,sha256=bc3B6ysTXSxpNWyQ6cQVJgIGyxmeqRTeshc3bdym1iA,2948
103
103
  odxtools/utils.py,sha256=PJFXkG74BzoheurrDYOwHZ6EuIcr1sdxf1tQGk6zSgs,1122
104
104
  odxtools/variablegroup.py,sha256=--5sMDOMUg4I3hFyoVOFcGCTOrctrrMADdmH3Mn4wHk,848
105
- odxtools/version.py,sha256=FuDHlM0820mCxDF0l8iRRVBUG8T6ZmD0Oxf1Zetwp8U,411
106
- odxtools/writepdxfile.py,sha256=x3W2xiPVjzNZjfpJssY6ngkx74sZtb95OFmBHql1VY4,7766
105
+ odxtools/version.py,sha256=eiWyn2_6w1-A0TRBYVKm6NOjpOjm1AVjrofuhC156co,411
106
+ odxtools/writepdxfile.py,sha256=ZEoNkSxheqnXm836-HOpd04O6ipMXYKFzXZy6PM0YLc,7813
107
107
  odxtools/xdoc.py,sha256=gDq-8l8x-Tj1ZJOttPxZchcO5_jEPwcXxMgT29VgTS0,1433
108
108
  odxtools/cli/__init__.py,sha256=T7ano_FIyzBASxYpmcA5VJXU5bQLIy_Qk0HE_SDKelY,106
109
109
  odxtools/cli/_parser_utils.py,sha256=p0L9NYYnml5ydfD22oC04EMhz8PKHgU40GPOPkybZwg,1116
@@ -118,17 +118,17 @@ odxtools/cli/main.py,sha256=_zPCU6N2ofpj_jQuQ_BU5EafBpMW0srhahZI8BgAM-0,2335
118
118
  odxtools/cli/snoop.py,sha256=z8USSpmz18VAvkGpzepeaOlVJhi-8aeW10XRylsvZLU,10610
119
119
  odxtools/compumethods/compuconst.py,sha256=14JIJXVKSe4bPWb5JyKXB6tAASMcWznExE1w6z1SMoc,806
120
120
  odxtools/compumethods/compudefaultvalue.py,sha256=Lw8Fnm854dpNCvO8waKWg_hSRyW-NwvoQFFjyW3RHwY,980
121
- odxtools/compumethods/compuinternaltophys.py,sha256=7SCW_lpnBq-hlKBjkuc_wII3idxgHrsuB9K2vOJfTiI,1512
121
+ odxtools/compumethods/compuinternaltophys.py,sha256=x2dEeedf8DSJXM62JKQomGVMNTrsK5hFNnkt8gGyn1Q,1507
122
122
  odxtools/compumethods/compuinversevalue.py,sha256=oG5tWSJkvoDmJPmb9EAGGutslbTrwZok5nfG20iZ8vk,220
123
123
  odxtools/compumethods/compumethod.py,sha256=fKWFzoJXb1klB4W7FpKTw6gbhACb1v97tjAyGgCU3DY,3534
124
- odxtools/compumethods/compuphystointernal.py,sha256=D0_rT7KozvwqWkDJiabXBU636N_d-Md4Bybb9Zy8psk,1512
125
- odxtools/compumethods/compurationalcoeffs.py,sha256=gRD0B2Ut03Rg4ixVPh2Mh6PY20RXzozGMxoP75vMr0U,782
126
- odxtools/compumethods/compuscale.py,sha256=bEEsV0Vg_tGokgdivkFHqtRhczk1etS_44ryMyBrU0k,4057
124
+ odxtools/compumethods/compuphystointernal.py,sha256=scFQZCHk8B6t3OUrSYxG1Bf1Df-WB1Y2CezhQ0RzmpI,1507
125
+ odxtools/compumethods/compurationalcoeffs.py,sha256=N95JWi06Wkgk3zAK57ONy7mQ9prpLxecsbVD0gyGloE,1246
126
+ odxtools/compumethods/compuscale.py,sha256=xkwIfkoRF4faICy2jlfB6rx4xYRQb0jL5fq6NMNPX8k,4487
127
127
  odxtools/compumethods/createanycompumethod.py,sha256=_y5OwNXZiKeFUcueFCn_jgrQxML_rmOymA_CygWId_k,2085
128
128
  odxtools/compumethods/identicalcompumethod.py,sha256=VVQ0tAkmowXZMBFQd9-n0VnsodDFRHXWdWgpNxdHAkQ,2077
129
129
  odxtools/compumethods/limit.py,sha256=QjrY6dd0Kc7n4CcweMBrkwlX4hsmx0bkQEaQKmTxQ18,4164
130
130
  odxtools/compumethods/linearcompumethod.py,sha256=mKCHUOWgJgooegGrVIkK9J9xX0n01x-CYO2UyUaRvtM,3667
131
- odxtools/compumethods/linearsegment.py,sha256=Xc842uBq-fRopAymTbc3kKKb_wnvwsGj9Zi3fRTkkW8,7226
131
+ odxtools/compumethods/linearsegment.py,sha256=_P96JyY5hatNlFvj-yXbWVBrx3rIj83_nu8SPpLezGk,7131
132
132
  odxtools/compumethods/scalelinearcompumethod.py,sha256=o_Re17G4XlCn-XbStnvlTs9XVN4h71mkkYyIOii-7w4,5895
133
133
  odxtools/compumethods/tabintpcompumethod.py,sha256=Gyf2qV5y53SHIcum5d5HQVGszoZCdu47jxMCQ6yKdQk,8065
134
134
  odxtools/compumethods/texttablecompumethod.py,sha256=vDYafbM0YaipjfN0NSlCFMiIPvp8waMNj3thNcwuYgk,5929
@@ -153,7 +153,7 @@ odxtools/parameters/dynamicparameter.py,sha256=mdZx12XbhTSYVVuXEsPYRll3zaHjbHIYI
153
153
  odxtools/parameters/lengthkeyparameter.py,sha256=WSpSIbxFmEwBov6Jj5Ubj9gMr46OgrdNi5-UaahCjAo,5270
154
154
  odxtools/parameters/matchingrequestparameter.py,sha256=VNYIpmP_Yt_pzMHPgGWZk1XYH5liIdyawNIwIR1Cbvw,2897
155
155
  odxtools/parameters/nrcconstparameter.py,sha256=SjTHQlaBzvyUATyOzSFFWCcdkTeHcaoKO54kTomzb6Y,4823
156
- odxtools/parameters/parameter.py,sha256=K6UU0vQV010n-7oov9uibN7u5-cIp-r68Vfaz7jJqR0,5945
156
+ odxtools/parameters/parameter.py,sha256=vb74YXUKEffF6ISshYtlIACf8TV-AOlIzlSthBIkxXc,6025
157
157
  odxtools/parameters/parameterwithdop.py,sha256=k7yJABRmHQTZNTEEPjyq3tBXJD4Aey365HpP7SGsEgk,3283
158
158
  odxtools/parameters/physicalconstantparameter.py,sha256=2iC6EKVJZVHwVVmd4h8KJ6OLc7B5QOUawivQMqWPCRA,3593
159
159
  odxtools/parameters/reservedparameter.py,sha256=8XQocU3_ExRZzXYEkITj535TTEUCNK87wIkrUTizgvI,1989
@@ -165,53 +165,53 @@ odxtools/parameters/valueparameter.py,sha256=khsmiaLhpW2PjUKQaAkntwurxsml3TUzNwa
165
165
  odxtools/templates/comparam-spec.odx-c.xml.jinja2,sha256=esdk5C0rjG6azzA1uZYiC-9Hzhqtn_d654AFq8VRa6g,1525
166
166
  odxtools/templates/comparam-subset.odx-cs.xml.jinja2,sha256=9desdk8puFzysHAeLSoZOBxM1d3EzjbnlqlhVsU-Kmc,2481
167
167
  odxtools/templates/diag_layer_container.odx-d.xml.jinja2,sha256=YC4-jWVRoFqD_zd2Sd5FKnAlYsGYGVm9n2uXQ6kXqW8,2388
168
- odxtools/templates/index.xml.jinja2,sha256=dX7QZA3G5Au2BMbXWMMyF2K1aR6i3go-0E5dY3Z9hWE,636
168
+ odxtools/templates/index.xml.jinja2,sha256=Z1bcntvvky7NoH0Q0CRJgUORwf3g96PFPGeOpi7VATw,647
169
169
  odxtools/templates/macros/printAdminData.xml.jinja2,sha256=YTB_CbhnALF6RIbE0XKQHRbC6c0PSZ_DxdrRHgqMD_s,2590
170
- odxtools/templates/macros/printAudience.xml.jinja2,sha256=IiAogxtEIo6qg7iZm1plQtrM4nkl6jj9GhIv5QI5ETM,1278
170
+ odxtools/templates/macros/printAudience.xml.jinja2,sha256=vaYL_-GPVdlLc7WAQTbkVZZbFuQptnCbOhXJb3tsHv8,1286
171
171
  odxtools/templates/macros/printBaseVariant.xml.jinja2,sha256=l4Jp8v9ZfPXvIisqVLgTpzc5UdYGeIocY4vAcgCiiaE,1480
172
172
  odxtools/templates/macros/printBasicStructure.xml.jinja2,sha256=V5oWGZesU_U5pvPO3Rtlodc7sxe5mFWY-uURLnQ8OfQ,614
173
- odxtools/templates/macros/printCompanyData.xml.jinja2,sha256=-F5xfUbjFAee7E__lgLCXC8a9xn15t_MDfxv6BzbKGA,2965
174
- odxtools/templates/macros/printComparam.xml.jinja2,sha256=rhoJO78urhjO07kuX0p_PRwfRHPIp2BPRu-eQ-USe6I,2392
173
+ odxtools/templates/macros/printCompanyData.xml.jinja2,sha256=jcNmQBOGDw7wcKdam72NIJSOTxthfkPJvrmw24MBiYQ,2981
174
+ odxtools/templates/macros/printComparam.xml.jinja2,sha256=e3hPCswAymJteQIUNoc7FOwsK_FrbJOvJooWdEx_vuQ,2408
175
175
  odxtools/templates/macros/printComparamRef.xml.jinja2,sha256=rBhrdUnp605fsUN9SaljpyaAojzaLBvTbkOuduKod18,1274
176
176
  odxtools/templates/macros/printCompuMethod.xml.jinja2,sha256=6eW1IgjPDwtW9qvA24Tx1wFtGFfJ0k10Gne5HoQpy4U,4394
177
- odxtools/templates/macros/printDOP.xml.jinja2,sha256=1i8s6Z9zR6C5WRngxXPMGaHhoaZsJSEfWsggjfxnRqY,5138
178
- odxtools/templates/macros/printDescription.xml.jinja2,sha256=zsPzVuM4cZJr0RlUYKQ-tGVDNVRO0yAs_pYetFHme3s,450
179
- odxtools/templates/macros/printDiagComm.xml.jinja2,sha256=eIKtu3xEmoQllyNYOWQx5Iv2oljKSg3lR6V4As-SFE0,2231
180
- odxtools/templates/macros/printDiagLayer.xml.jinja2,sha256=V4CYnhnRLUPBhjE-l4kWpG3Hzym-9ddO0q9Kp2ypflU,6456
181
- odxtools/templates/macros/printDiagVariable.xml.jinja2,sha256=7Fa0DFyeEUDUxgM0IUsj_BXC2-csLSv1xjiUT1yauis,2531
177
+ odxtools/templates/macros/printDOP.xml.jinja2,sha256=t-6U0gZLdV2n6-YW5pkVFnHNVTAOnfqMch-mk_fGyjo,5146
178
+ odxtools/templates/macros/printDescription.xml.jinja2,sha256=7jcYEIXr7hbbKqSvIUIgXaQSXV4dKAR9UhY352BZct8,452
179
+ odxtools/templates/macros/printDiagComm.xml.jinja2,sha256=_SByYBYzPG9t7VNnAohFAXsgng9VrQcSacXH923wRzY,2239
180
+ odxtools/templates/macros/printDiagLayer.xml.jinja2,sha256=NKrQ9JTxxhdHTHYFo_ZzyoClJJkZC3ISObhWCJOXUq4,6449
181
+ odxtools/templates/macros/printDiagVariable.xml.jinja2,sha256=sQEU42Onf0WkRJZJyNUgeeGICc3MZaQJPQ0YKY6lRrU,2656
182
182
  odxtools/templates/macros/printDynDefinedSpec.xml.jinja2,sha256=uX3C40VmlbH7sndlJNyTvq8upzaoq8vCk6S93gtpFIY,1742
183
- odxtools/templates/macros/printDynamicEndmarkerField.xml.jinja2,sha256=EvUOkfVsNAT61B5OApyE7Yh45C_A_iBg9gCTiq_td7w,579
184
- odxtools/templates/macros/printDynamicLengthField.xml.jinja2,sha256=YCwgKV2na49mlHQQmI8L85ZYqUktaYuNil-K6rp4BR8,776
183
+ odxtools/templates/macros/printDynamicEndmarkerField.xml.jinja2,sha256=6BmxPKesQvfy46iTiPSFu_iJffC6umZ_YRsTEd-0y5Q,587
184
+ odxtools/templates/macros/printDynamicLengthField.xml.jinja2,sha256=bNvNh_4xyp4L6v7cxJ5cO1yOHYPnSFiaK9oY4l63fDU,784
185
185
  odxtools/templates/macros/printEcuSharedData.xml.jinja2,sha256=WK08eoDFEjj9o3eOuy__H0r9ioo688rTuQp6uXE6Tdo,820
186
186
  odxtools/templates/macros/printEcuVariant.xml.jinja2,sha256=Nsgj2VUWZvSDFPQsn6wv75M9TaryOB-tlQYCVq9hDEM,1594
187
187
  odxtools/templates/macros/printEcuVariantPattern.xml.jinja2,sha256=uSUrX1n2YVw6tt1-A0Lmlgy_W3dxW4r8bVErdrf_6vk,846
188
- odxtools/templates/macros/printElementId.xml.jinja2,sha256=wuCXYyXlg50zgUvukxScHN_SCH8YEATjkcqvwsC9aNw,389
189
- odxtools/templates/macros/printEndOfPdu.xml.jinja2,sha256=_BwCjD0iBya3JFRi_XcUrq8nwR96O7Tw6TeRu3t6Tgs,671
188
+ odxtools/templates/macros/printElementId.xml.jinja2,sha256=Oe4sgtBB_VhTz6uJzaiTCpQki2ulKKfpBq56FVgBC-I,570
189
+ odxtools/templates/macros/printEndOfPdu.xml.jinja2,sha256=ptjwOxyNTABATOajiitcvlJRKVGP_osh2wSJTCbaa38,679
190
190
  odxtools/templates/macros/printEnvData.xml.jinja2,sha256=2Goatqb66d-pCf9wqJDXn1EZWNhkQ8FJANKQMOnxuJs,609
191
- odxtools/templates/macros/printEnvDataDesc.xml.jinja2,sha256=23d4XOrHD6O-JHGVYbwnLVJWwaw3al1kneSsP2EIW0Q,580
192
- odxtools/templates/macros/printFunctionalClass.xml.jinja2,sha256=7Jtf_xB3bBcvjK_fXXHYTDXqcxMU4eBnJeZgLPKjFmg,321
191
+ odxtools/templates/macros/printEnvDataDesc.xml.jinja2,sha256=rBpPf51LFx5oNx_XjeTABast9hmru5hYbeJQ2axHntw,588
192
+ odxtools/templates/macros/printFunctionalClass.xml.jinja2,sha256=TpOQTj-hlNLtIfcSTVzU-gRrfaWrgsTrIFMqm_1M6Qs,329
193
193
  odxtools/templates/macros/printFunctionalGroup.xml.jinja2,sha256=zIeZbhf8haXhgJJUPiOnMe3lvqvfye4-zmwWDQJxFtQ,1159
194
194
  odxtools/templates/macros/printHierarchyElement.xml.jinja2,sha256=GD6iNIE0Wu0QsJ8uLtwEV8N9t6mIhI00_KpCVzOVQBM,651
195
- odxtools/templates/macros/printMux.xml.jinja2,sha256=EL9sCWzqC3iaBPsrTINUo03zGGMrU-bWbJ3f0U5CBIQ,1861
196
- odxtools/templates/macros/printParam.xml.jinja2,sha256=BKvKvswnelCynXmz_rAsejMdtce6Fji2CkSteX5x0jI,3203
195
+ odxtools/templates/macros/printMux.xml.jinja2,sha256=68IiPY_mIJQqQiqce3jUphqp3-xLfmEBL7CSb3Cz7eI,1869
196
+ odxtools/templates/macros/printParam.xml.jinja2,sha256=bdp-r1arWod-vV9ODUZn_QThtAAqkm31SqdJeGItJ1M,3183
197
197
  odxtools/templates/macros/printParentRef.xml.jinja2,sha256=RllVKt2RgrMnWfsujGnBUiABwV2y4_ZfINYy7LXenPM,896
198
- odxtools/templates/macros/printProtStack.xml.jinja2,sha256=abss3fNe-e5CbFBI0WcRopP7omIV2POzT0qJ6Az7dUE,765
198
+ odxtools/templates/macros/printProtStack.xml.jinja2,sha256=0FHHvuduiMPhAE19vpTHu3cQeM9kSybWj5FbybcXnGk,773
199
199
  odxtools/templates/macros/printProtocol.xml.jinja2,sha256=1DXoRSq6z4dhpZnXWH3x9JPKCWmAmghjVgVFfizo41s,1028
200
- odxtools/templates/macros/printRequest.xml.jinja2,sha256=GazGOinjHp72ZhIZ8LVKpRxYcyYyNlBmEUNuN0cgntg,709
201
- odxtools/templates/macros/printResponse.xml.jinja2,sha256=QVU8dVCJm_Tv_Cy6SEun-fJBs2w9ASEfJeRs0LynZdA,675
200
+ odxtools/templates/macros/printRequest.xml.jinja2,sha256=yq4xGSlQCioT7FRivyx40Cjs2CYr9EK6NLZf0W4wGW0,717
201
+ odxtools/templates/macros/printResponse.xml.jinja2,sha256=GsOYmnoh4ewhWg3FUdcovHuJxvuIjsSrXNtbcnnAQcM,683
202
202
  odxtools/templates/macros/printService.xml.jinja2,sha256=zvjOCELEx4yim2FtdNKiExTsDPkAfQAP4Gf_QsondfQ,1546
203
- odxtools/templates/macros/printSingleEcuJob.xml.jinja2,sha256=KQqp5TeKPEC3Z_kasE35n9SRw7KhjPulQ4ijyReKF-U,2637
204
- odxtools/templates/macros/printSpecialData.xml.jinja2,sha256=SrgPPQkZF5C4wdveJSiHk8QJVYZ2zbd6XFvkyt7NEBE,1378
205
- odxtools/templates/macros/printState.xml.jinja2,sha256=B-rhB7HgfZCoC_mGljgDaX9hU4X1tZ9DbS39WpffBu4,307
206
- odxtools/templates/macros/printStateChart.xml.jinja2,sha256=bOj9FWl-kZmlhoMskG71zS9NxtTimGwQvgDpKNaPw6s,943
207
- odxtools/templates/macros/printStateTransition.xml.jinja2,sha256=iO4fSCwFMLdX_VDdNnn8udiGE3vYU7tXPfbEBvoTFa4,502
208
- odxtools/templates/macros/printStaticField.xml.jinja2,sha256=JIXFhyNrnQ-2_vWy6RxikrYpp5ZMAITgWCVCnt7bOxQ,513
209
- odxtools/templates/macros/printStructure.xml.jinja2,sha256=uswYs2xse0B9hZut_FN1GvvR0xsZa_3pZRnlF0ElEEc,559
210
- odxtools/templates/macros/printTable.xml.jinja2,sha256=VsP01jqyQllLP-brQ6J1E8ubVntiToEb8Uk7HQEYqtY,1485
211
- odxtools/templates/macros/printUnitSpec.xml.jinja2,sha256=AJ5jWYKRmoIZkrd25R1KmjjgU6pfOqRiOQHtUAuS6GI,2813
212
- odxtools-8.0.5.dist-info/LICENSE,sha256=NeGPFQdTa6EKeON3aShVlPAIquJnbbiOfj0suz6rzyQ,1074
213
- odxtools-8.0.5.dist-info/METADATA,sha256=KrVsOJyd7fni3SPL2N98k906AKBzGkdkfE1gxDRi4K0,44084
214
- odxtools-8.0.5.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91
215
- odxtools-8.0.5.dist-info/entry_points.txt,sha256=_sBDzuNoT8LbbCjfc-OJiUt5WPrtOq_x-rr9txhrPjY,53
216
- odxtools-8.0.5.dist-info/top_level.txt,sha256=pdS02kE5ZdgsaBRZDpX3NBFlaSx3zotsqX4E4V6tXEI,9
217
- odxtools-8.0.5.dist-info/RECORD,,
203
+ odxtools/templates/macros/printSingleEcuJob.xml.jinja2,sha256=SXUgO57KQFahI3fv9tRWlEyWeSr0sYXwQ8vq8lqo0eI,2645
204
+ odxtools/templates/macros/printSpecialData.xml.jinja2,sha256=0eIFh9cWXfFrQN_f8G_lz3fUqmtysxY6tSN4DbuFY40,1386
205
+ odxtools/templates/macros/printState.xml.jinja2,sha256=BNnTEyczp43iP9Bn_plMLRsJsasra4sRyvmgODuZQYg,315
206
+ odxtools/templates/macros/printStateChart.xml.jinja2,sha256=XW1EhF1k8ogbEDt-QMjSOojKl4vjxXkq6BwJWR9GJsI,951
207
+ odxtools/templates/macros/printStateTransition.xml.jinja2,sha256=J2t0yU82UBegUSH9sAbnkdgEYPTUU0A7I-CokuPQxDo,510
208
+ odxtools/templates/macros/printStaticField.xml.jinja2,sha256=fkV07zrL2pTo6b5ZPD14V0uC1aEk2P4roXyDhp-ah38,521
209
+ odxtools/templates/macros/printStructure.xml.jinja2,sha256=CJUPZv_9lko63C5fNpOn5LlQqLCuS--qyhtx4NyD5Rk,567
210
+ odxtools/templates/macros/printTable.xml.jinja2,sha256=5DQjjJ-UxQ75ntov0S0LGnm_V7YWtKadBpNbmV1aBb8,1501
211
+ odxtools/templates/macros/printUnitSpec.xml.jinja2,sha256=opS6_Gr94WlAtREEyX4sLo-D-17Gni9Wvr3y1nfVgSA,2715
212
+ odxtools-8.1.0.dist-info/LICENSE,sha256=NeGPFQdTa6EKeON3aShVlPAIquJnbbiOfj0suz6rzyQ,1074
213
+ odxtools-8.1.0.dist-info/METADATA,sha256=dkjShZNAIkPd9u579phjMKQr1gGFWNyuMpng0dcqLrI,44084
214
+ odxtools-8.1.0.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
215
+ odxtools-8.1.0.dist-info/entry_points.txt,sha256=_sBDzuNoT8LbbCjfc-OJiUt5WPrtOq_x-rr9txhrPjY,53
216
+ odxtools-8.1.0.dist-info/top_level.txt,sha256=pdS02kE5ZdgsaBRZDpX3NBFlaSx3zotsqX4E4V6tXEI,9
217
+ odxtools-8.1.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (74.0.0)
2
+ Generator: setuptools (74.1.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5