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