odxtools 10.0.0__py3-none-any.whl → 10.1.0__py3-none-any.whl

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