odxtools 9.7.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 (193) hide show
  1. odxtools/additionalaudience.py +7 -7
  2. odxtools/admindata.py +14 -13
  3. odxtools/audience.py +17 -17
  4. odxtools/basecomparam.py +9 -8
  5. odxtools/basevariantpattern.py +9 -10
  6. odxtools/basicstructure.py +15 -15
  7. odxtools/cli/_print_utils.py +34 -22
  8. odxtools/cli/browse.py +8 -8
  9. odxtools/cli/compare.py +24 -24
  10. odxtools/cli/decode.py +3 -4
  11. odxtools/cli/find.py +4 -5
  12. odxtools/cli/list.py +6 -6
  13. odxtools/cli/main.py +2 -2
  14. odxtools/cli/snoop.py +3 -3
  15. odxtools/codec.py +3 -3
  16. odxtools/commrelation.py +18 -17
  17. odxtools/companydata.py +13 -13
  18. odxtools/companydocinfo.py +15 -17
  19. odxtools/companyrevisioninfo.py +9 -9
  20. odxtools/companyspecificinfo.py +11 -13
  21. odxtools/comparam.py +8 -7
  22. odxtools/comparaminstance.py +14 -14
  23. odxtools/comparamspec.py +10 -11
  24. odxtools/comparamsubset.py +17 -25
  25. odxtools/complexcomparam.py +14 -14
  26. odxtools/complexdop.py +1 -1
  27. odxtools/compositecodec.py +8 -8
  28. odxtools/compumethods/compucodecompumethod.py +7 -7
  29. odxtools/compumethods/compuconst.py +5 -6
  30. odxtools/compumethods/compudefaultvalue.py +2 -3
  31. odxtools/compumethods/compuinternaltophys.py +13 -12
  32. odxtools/compumethods/compumethod.py +10 -9
  33. odxtools/compumethods/compuphystointernal.py +13 -12
  34. odxtools/compumethods/compurationalcoeffs.py +7 -7
  35. odxtools/compumethods/compuscale.py +15 -16
  36. odxtools/compumethods/createanycompumethod.py +12 -13
  37. odxtools/compumethods/identicalcompumethod.py +4 -5
  38. odxtools/compumethods/limit.py +14 -14
  39. odxtools/compumethods/linearcompumethod.py +5 -5
  40. odxtools/compumethods/linearsegment.py +10 -11
  41. odxtools/compumethods/ratfunccompumethod.py +6 -6
  42. odxtools/compumethods/ratfuncsegment.py +7 -8
  43. odxtools/compumethods/scalelinearcompumethod.py +9 -9
  44. odxtools/compumethods/scaleratfunccompumethod.py +7 -7
  45. odxtools/compumethods/tabintpcompumethod.py +10 -13
  46. odxtools/compumethods/texttablecompumethod.py +6 -6
  47. odxtools/createanycomparam.py +5 -7
  48. odxtools/createanydiagcodedtype.py +7 -8
  49. odxtools/database.py +34 -31
  50. odxtools/dataobjectproperty.py +19 -20
  51. odxtools/decodestate.py +5 -5
  52. odxtools/description.py +9 -9
  53. odxtools/determinenumberofitems.py +8 -7
  54. odxtools/diagcodedtype.py +10 -10
  55. odxtools/diagcomm.py +29 -30
  56. odxtools/diagdatadictionaryspec.py +36 -36
  57. odxtools/diaglayercontainer.py +35 -34
  58. odxtools/diaglayers/basevariant.py +14 -12
  59. odxtools/diaglayers/basevariantraw.py +22 -23
  60. odxtools/diaglayers/diaglayer.py +24 -22
  61. odxtools/diaglayers/diaglayerraw.py +43 -52
  62. odxtools/diaglayers/diaglayertype.py +1 -2
  63. odxtools/diaglayers/ecushareddata.py +9 -9
  64. odxtools/diaglayers/ecushareddataraw.py +15 -16
  65. odxtools/diaglayers/ecuvariant.py +15 -13
  66. odxtools/diaglayers/ecuvariantraw.py +21 -22
  67. odxtools/diaglayers/functionalgroup.py +12 -11
  68. odxtools/diaglayers/functionalgroupraw.py +17 -18
  69. odxtools/diaglayers/hierarchyelement.py +48 -54
  70. odxtools/diaglayers/hierarchyelementraw.py +10 -11
  71. odxtools/diaglayers/protocol.py +7 -7
  72. odxtools/diaglayers/protocolraw.py +13 -14
  73. odxtools/diagnostictroublecode.py +15 -17
  74. odxtools/diagservice.py +28 -27
  75. odxtools/diagvariable.py +24 -25
  76. odxtools/docrevision.py +18 -17
  77. odxtools/dopbase.py +13 -14
  78. odxtools/dtcconnector.py +8 -7
  79. odxtools/dtcdop.py +24 -20
  80. odxtools/dynamicendmarkerfield.py +10 -9
  81. odxtools/dynamiclengthfield.py +10 -9
  82. odxtools/dyndefinedspec.py +10 -10
  83. odxtools/dynenddopref.py +9 -9
  84. odxtools/dyniddefmodeinfo.py +21 -21
  85. odxtools/ecuvariantpattern.py +8 -10
  86. odxtools/element.py +12 -13
  87. odxtools/encodestate.py +11 -11
  88. odxtools/encoding.py +2 -3
  89. odxtools/endofpdufield.py +9 -10
  90. odxtools/envdataconnector.py +8 -8
  91. odxtools/environmentdata.py +7 -9
  92. odxtools/environmentdatadescription.py +18 -17
  93. odxtools/exceptions.py +5 -5
  94. odxtools/externalaccessmethod.py +4 -6
  95. odxtools/externaldoc.py +6 -6
  96. odxtools/field.py +15 -15
  97. odxtools/functionalclass.py +9 -9
  98. odxtools/inputparam.py +11 -10
  99. odxtools/internalconstr.py +10 -11
  100. odxtools/isotp_state_machine.py +12 -11
  101. odxtools/leadinglengthinfotype.py +4 -6
  102. odxtools/library.py +9 -8
  103. odxtools/linkeddtcdop.py +9 -8
  104. odxtools/loadfile.py +5 -6
  105. odxtools/matchingbasevariantparameter.py +5 -6
  106. odxtools/matchingparameter.py +10 -10
  107. odxtools/message.py +1 -1
  108. odxtools/minmaxlengthtype.py +6 -7
  109. odxtools/modification.py +7 -6
  110. odxtools/multiplexer.py +54 -18
  111. odxtools/multiplexercase.py +13 -13
  112. odxtools/multiplexerdefaultcase.py +11 -10
  113. odxtools/multiplexerswitchkey.py +8 -8
  114. odxtools/nameditemlist.py +13 -13
  115. odxtools/negoutputparam.py +8 -8
  116. odxtools/obd.py +1 -2
  117. odxtools/odxcategory.py +14 -26
  118. odxtools/odxdoccontext.py +16 -0
  119. odxtools/odxlink.py +23 -25
  120. odxtools/odxtypes.py +18 -15
  121. odxtools/outputparam.py +9 -8
  122. odxtools/parameterinfo.py +1 -1
  123. odxtools/parameters/codedconstparameter.py +10 -10
  124. odxtools/parameters/createanyparameter.py +15 -16
  125. odxtools/parameters/dynamicparameter.py +5 -7
  126. odxtools/parameters/lengthkeyparameter.py +10 -10
  127. odxtools/parameters/matchingrequestparameter.py +6 -7
  128. odxtools/parameters/nrcconstparameter.py +13 -13
  129. odxtools/parameters/parameter.py +17 -18
  130. odxtools/parameters/parameterwithdop.py +13 -13
  131. odxtools/parameters/physicalconstantparameter.py +8 -7
  132. odxtools/parameters/reservedparameter.py +6 -8
  133. odxtools/parameters/systemparameter.py +5 -7
  134. odxtools/parameters/tableentryparameter.py +8 -8
  135. odxtools/parameters/tablekeyparameter.py +17 -17
  136. odxtools/parameters/tablestructparameter.py +11 -11
  137. odxtools/parameters/valueparameter.py +11 -11
  138. odxtools/paramlengthinfotype.py +10 -9
  139. odxtools/parentref.py +15 -13
  140. odxtools/physicaldimension.py +15 -15
  141. odxtools/physicaltype.py +5 -6
  142. odxtools/posresponsesuppressible.py +11 -12
  143. odxtools/preconditionstateref.py +11 -11
  144. odxtools/progcode.py +11 -10
  145. odxtools/protstack.py +10 -9
  146. odxtools/relateddiagcommref.py +5 -6
  147. odxtools/relateddoc.py +11 -10
  148. odxtools/request.py +18 -19
  149. odxtools/response.py +19 -20
  150. odxtools/scaleconstr.py +8 -9
  151. odxtools/servicebinner.py +5 -5
  152. odxtools/singleecujob.py +16 -15
  153. odxtools/snrefcontext.py +3 -3
  154. odxtools/specialdata.py +8 -7
  155. odxtools/specialdatagroup.py +17 -17
  156. odxtools/specialdatagroupcaption.py +7 -6
  157. odxtools/standardlengthtype.py +14 -22
  158. odxtools/state.py +7 -6
  159. odxtools/statechart.py +12 -11
  160. odxtools/statemachine.py +4 -3
  161. odxtools/statetransition.py +9 -9
  162. odxtools/statetransitionref.py +19 -19
  163. odxtools/staticfield.py +9 -7
  164. odxtools/structure.py +5 -6
  165. odxtools/subcomponent.py +20 -18
  166. odxtools/subcomponentparamconnector.py +10 -9
  167. odxtools/subcomponentpattern.py +9 -9
  168. odxtools/swvariable.py +6 -7
  169. odxtools/table.py +25 -26
  170. odxtools/tablediagcommconnector.py +9 -8
  171. odxtools/tablerow.py +64 -43
  172. odxtools/tablerowconnector.py +8 -8
  173. odxtools/teammember.py +16 -15
  174. odxtools/templates/macros/printParentRef.xml.jinja2 +3 -1
  175. odxtools/text.py +4 -5
  176. odxtools/uds.py +2 -3
  177. odxtools/unit.py +14 -13
  178. odxtools/unitgroup.py +11 -10
  179. odxtools/unitspec.py +18 -19
  180. odxtools/utils.py +3 -3
  181. odxtools/variablegroup.py +5 -6
  182. odxtools/variantmatcher.py +10 -10
  183. odxtools/variantpattern.py +5 -6
  184. odxtools/version.py +2 -2
  185. odxtools/writepdxfile.py +5 -24
  186. odxtools/xdoc.py +13 -12
  187. {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/METADATA +4 -5
  188. odxtools-10.1.0.dist-info/RECORD +265 -0
  189. {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/WHEEL +1 -1
  190. odxtools-9.7.0.dist-info/RECORD +0 -264
  191. {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/entry_points.txt +0 -0
  192. {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/licenses/LICENSE +0 -0
  193. {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
- from copy import copy
3
- from dataclasses import dataclass
4
- from typing import Any, Dict, List, Optional, Union, cast
2
+ from dataclasses import dataclass, field
3
+ from typing import Any, cast
5
4
  from xml.etree import ElementTree
6
5
 
7
6
  from ..additionalaudience import AdditionalAudience
@@ -11,11 +10,12 @@ from ..diagcomm import DiagComm
11
10
  from ..diagdatadictionaryspec import DiagDataDictionarySpec
12
11
  from ..diagservice import DiagService
13
12
  from ..element import IdentifiableElement
14
- from ..exceptions import odxassert, odxraise, odxrequire
13
+ from ..exceptions import odxassert, odxraise
15
14
  from ..functionalclass import FunctionalClass
16
15
  from ..library import Library
17
16
  from ..nameditemlist import NamedItemList
18
- from ..odxlink import DocType, OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
17
+ from ..odxdoccontext import OdxDocContext
18
+ from ..odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
19
19
  from ..request import Request
20
20
  from ..response import Response
21
21
  from ..singleecujob import SingleEcuJob
@@ -27,7 +27,7 @@ from ..utils import dataclass_fields_asdict
27
27
  from .diaglayertype import DiagLayerType
28
28
 
29
29
 
30
- @dataclass
30
+ @dataclass(kw_only=True)
31
31
  class DiagLayerRaw(IdentifiableElement):
32
32
  """This class internalizes all data represented by the DIAG-LAYER
33
33
  XML tag and its derivatives.
@@ -36,21 +36,21 @@ class DiagLayerRaw(IdentifiableElement):
36
36
  """
37
37
 
38
38
  variant_type: DiagLayerType
39
- admin_data: Optional[AdminData]
40
- company_datas: NamedItemList[CompanyData]
41
- functional_classes: NamedItemList[FunctionalClass]
42
- diag_data_dictionary_spec: Optional[DiagDataDictionarySpec]
43
- diag_comms_raw: List[Union[OdxLinkRef, DiagComm]]
44
- requests: NamedItemList[Request]
45
- positive_responses: NamedItemList[Response]
46
- negative_responses: NamedItemList[Response]
47
- global_negative_responses: NamedItemList[Response]
48
- import_refs: List[OdxLinkRef]
49
- state_charts: NamedItemList[StateChart]
50
- additional_audiences: NamedItemList[AdditionalAudience]
51
- sub_components: NamedItemList[SubComponent]
52
- libraries: NamedItemList[Library]
53
- sdgs: List[SpecialDataGroup]
39
+ admin_data: AdminData | None = None
40
+ company_datas: NamedItemList[CompanyData] = field(default_factory=NamedItemList)
41
+ functional_classes: NamedItemList[FunctionalClass] = field(default_factory=NamedItemList)
42
+ diag_data_dictionary_spec: DiagDataDictionarySpec | None = None
43
+ diag_comms_raw: list[OdxLinkRef | DiagComm] = field(default_factory=list)
44
+ requests: NamedItemList[Request] = field(default_factory=NamedItemList)
45
+ positive_responses: NamedItemList[Response] = field(default_factory=NamedItemList)
46
+ negative_responses: NamedItemList[Response] = field(default_factory=NamedItemList)
47
+ global_negative_responses: NamedItemList[Response] = field(default_factory=NamedItemList)
48
+ import_refs: list[OdxLinkRef] = field(default_factory=list)
49
+ state_charts: NamedItemList[StateChart] = field(default_factory=NamedItemList)
50
+ additional_audiences: NamedItemList[AdditionalAudience] = field(default_factory=NamedItemList)
51
+ sub_components: NamedItemList[SubComponent] = field(default_factory=NamedItemList)
52
+ libraries: NamedItemList[Library] = field(default_factory=NamedItemList)
53
+ sdgs: list[SpecialDataGroup] = field(default_factory=list)
54
54
 
55
55
  @property
56
56
  def diag_comms(self) -> NamedItemList[DiagComm]:
@@ -70,98 +70,89 @@ class DiagLayerRaw(IdentifiableElement):
70
70
  return self._single_ecu_jobs
71
71
 
72
72
  @staticmethod
73
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "DiagLayerRaw":
73
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "DiagLayerRaw":
74
74
  try:
75
75
  variant_type = DiagLayerType(et_element.tag)
76
76
  except ValueError:
77
77
  variant_type = cast(DiagLayerType, None)
78
78
  odxraise(f"Encountered unknown diagnostic layer type '{et_element.tag}'")
79
79
 
80
- short_name = odxrequire(et_element.findtext("SHORT-NAME"))
81
-
82
- # extend the applicable ODX "document fragments" for the diag layer objects
83
- doc_frags = copy(doc_frags)
84
- doc_frags.append(OdxDocFragment(short_name, DocType.LAYER))
85
- kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
80
+ kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, context))
86
81
 
87
82
  admin_data = None
88
83
  if (admin_data_elem := et_element.find("ADMIN-DATA")) is not None:
89
- admin_data = AdminData.from_et(admin_data_elem, doc_frags)
84
+ admin_data = AdminData.from_et(admin_data_elem, context)
90
85
 
91
86
  company_datas = NamedItemList([
92
- CompanyData.from_et(cd_el, doc_frags)
87
+ CompanyData.from_et(cd_el, context)
93
88
  for cd_el in et_element.iterfind("COMPANY-DATAS/COMPANY-DATA")
94
89
  ])
95
90
 
96
91
  functional_classes = NamedItemList([
97
- FunctionalClass.from_et(fc_el, doc_frags)
92
+ FunctionalClass.from_et(fc_el, context)
98
93
  for fc_el in et_element.iterfind("FUNCT-CLASSS/FUNCT-CLASS")
99
94
  ])
100
95
 
101
96
  diag_data_dictionary_spec = None
102
97
  if (ddds_elem := et_element.find("DIAG-DATA-DICTIONARY-SPEC")) is not None:
103
- diag_data_dictionary_spec = DiagDataDictionarySpec.from_et(ddds_elem, doc_frags)
98
+ diag_data_dictionary_spec = DiagDataDictionarySpec.from_et(ddds_elem, context)
104
99
 
105
- diag_comms_raw: List[Union[OdxLinkRef, DiagComm]] = []
100
+ diag_comms_raw: list[OdxLinkRef | DiagComm] = []
106
101
  if (dc_elems := et_element.find("DIAG-COMMS")) is not None:
107
102
  for dc_proxy_elem in dc_elems:
108
- dc: Union[OdxLinkRef, DiagComm]
103
+ dc: OdxLinkRef | DiagComm
109
104
  if dc_proxy_elem.tag == "DIAG-COMM-REF":
110
- dc = OdxLinkRef.from_et(dc_proxy_elem, doc_frags)
105
+ dc = OdxLinkRef.from_et(dc_proxy_elem, context)
111
106
  elif dc_proxy_elem.tag == "DIAG-SERVICE":
112
- dc = DiagService.from_et(dc_proxy_elem, doc_frags)
107
+ dc = DiagService.from_et(dc_proxy_elem, context)
113
108
  else:
114
109
  odxassert(dc_proxy_elem.tag == "SINGLE-ECU-JOB")
115
- dc = SingleEcuJob.from_et(dc_proxy_elem, doc_frags)
110
+ dc = SingleEcuJob.from_et(dc_proxy_elem, context)
116
111
 
117
112
  diag_comms_raw.append(dc)
118
113
 
119
114
  requests = NamedItemList([
120
- Request.from_et(rq_elem, doc_frags)
121
- for rq_elem in et_element.iterfind("REQUESTS/REQUEST")
115
+ Request.from_et(rq_elem, context) for rq_elem in et_element.iterfind("REQUESTS/REQUEST")
122
116
  ])
123
117
 
124
118
  positive_responses = NamedItemList([
125
- Response.from_et(rs_elem, doc_frags)
119
+ Response.from_et(rs_elem, context)
126
120
  for rs_elem in et_element.iterfind("POS-RESPONSES/POS-RESPONSE")
127
121
  ])
128
122
 
129
123
  negative_responses = NamedItemList([
130
- Response.from_et(rs_elem, doc_frags)
124
+ Response.from_et(rs_elem, context)
131
125
  for rs_elem in et_element.iterfind("NEG-RESPONSES/NEG-RESPONSE")
132
126
  ])
133
127
 
134
128
  global_negative_responses = NamedItemList([
135
- Response.from_et(rs_elem, doc_frags)
129
+ Response.from_et(rs_elem, context)
136
130
  for rs_elem in et_element.iterfind("GLOBAL-NEG-RESPONSES/GLOBAL-NEG-RESPONSE")
137
131
  ])
138
132
 
139
133
  import_refs = [
140
- OdxLinkRef.from_et(el, doc_frags)
141
- for el in et_element.iterfind("IMPORT-REFS/IMPORT-REF")
134
+ OdxLinkRef.from_et(el, context) for el in et_element.iterfind("IMPORT-REFS/IMPORT-REF")
142
135
  ]
143
136
 
144
137
  state_charts = NamedItemList([
145
- StateChart.from_et(el, doc_frags)
138
+ StateChart.from_et(el, context)
146
139
  for el in et_element.iterfind("STATE-CHARTS/STATE-CHART")
147
140
  ])
148
141
 
149
142
  additional_audiences = NamedItemList([
150
- AdditionalAudience.from_et(el, doc_frags)
143
+ AdditionalAudience.from_et(el, context)
151
144
  for el in et_element.iterfind("ADDITIONAL-AUDIENCES/ADDITIONAL-AUDIENCE")
152
145
  ])
153
146
 
154
147
  sub_components = NamedItemList([
155
- SubComponent.from_et(el, doc_frags)
148
+ SubComponent.from_et(el, context)
156
149
  for el in et_element.iterfind("SUB-COMPONENTS/SUB-COMPONENT")
157
150
  ])
158
151
 
159
152
  libraries = NamedItemList(
160
- [Library.from_et(el, doc_frags) for el in et_element.iterfind("LIBRARYS/LIBRARY")])
153
+ [Library.from_et(el, context) for el in et_element.iterfind("LIBRARYS/LIBRARY")])
161
154
 
162
- sdgs = [
163
- SpecialDataGroup.from_et(sdge, doc_frags) for sdge in et_element.iterfind("SDGS/SDG")
164
- ]
155
+ sdgs = [SpecialDataGroup.from_et(sdge, context) for sdge in et_element.iterfind("SDGS/SDG")]
165
156
 
166
157
  # Create DiagLayer
167
158
  return DiagLayerRaw(
@@ -183,7 +174,7 @@ class DiagLayerRaw(IdentifiableElement):
183
174
  sdgs=sdgs,
184
175
  **kwargs)
185
176
 
186
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
177
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
187
178
  """Construct a mapping from IDs to all objects that are contained in this diagnostic layer."""
188
179
  odxlinks = {self.odx_id: self}
189
180
 
@@ -1,6 +1,5 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from enum import Enum
3
- from typing import Dict
4
3
 
5
4
 
6
5
  class DiagLayerType(Enum):
@@ -19,7 +18,7 @@ class DiagLayerType(Enum):
19
18
 
20
19
  """
21
20
 
22
- PRIORITY_OF_DIAG_LAYER_TYPE: Dict[DiagLayerType, int] = {
21
+ PRIORITY_OF_DIAG_LAYER_TYPE: dict[DiagLayerType, int] = {
23
22
  DiagLayerType.PROTOCOL:
24
23
  1,
25
24
  DiagLayerType.FUNCTIONAL_GROUP:
@@ -1,23 +1,24 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  from copy import deepcopy
3
3
  from dataclasses import dataclass
4
- from typing import TYPE_CHECKING, Any, Dict, List, Union, cast
4
+ from typing import TYPE_CHECKING, Any, cast
5
5
  from xml.etree import ElementTree
6
6
 
7
7
  from ..diagvariable import DiagVariable
8
8
  from ..exceptions import odxassert
9
9
  from ..nameditemlist import NamedItemList
10
- from ..odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkRef
10
+ from ..odxdoccontext import OdxDocContext
11
+ from ..odxlink import OdxLinkDatabase, OdxLinkRef
11
12
  from ..snrefcontext import SnRefContext
12
13
  from ..variablegroup import VariableGroup
13
14
  from .diaglayer import DiagLayer
14
15
  from .ecushareddataraw import EcuSharedDataRaw
15
16
 
16
17
  if TYPE_CHECKING:
17
- from .database import Database
18
+ from ..database import Database
18
19
 
19
20
 
20
- @dataclass
21
+ @dataclass(kw_only=True)
21
22
  class EcuSharedData(DiagLayer):
22
23
  """This is a diagnostic layer for data shared across others
23
24
  """
@@ -27,7 +28,7 @@ class EcuSharedData(DiagLayer):
27
28
  return cast(EcuSharedDataRaw, self.diag_layer_raw)
28
29
 
29
30
  @property
30
- def diag_variables_raw(self) -> List[Union[OdxLinkRef, DiagVariable]]:
31
+ def diag_variables_raw(self) -> list[OdxLinkRef | DiagVariable]:
31
32
  return self.ecu_shared_data_raw.diag_variables_raw
32
33
 
33
34
  @property
@@ -39,9 +40,8 @@ class EcuSharedData(DiagLayer):
39
40
  return self.ecu_shared_data_raw.variable_groups
40
41
 
41
42
  @staticmethod
42
- def from_et(et_element: ElementTree.Element,
43
- doc_frags: List[OdxDocFragment]) -> "EcuSharedData":
44
- ecu_shared_data_raw = EcuSharedDataRaw.from_et(et_element, doc_frags)
43
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "EcuSharedData":
44
+ ecu_shared_data_raw = EcuSharedDataRaw.from_et(et_element, context)
45
45
 
46
46
  return EcuSharedData(diag_layer_raw=ecu_shared_data_raw)
47
47
 
@@ -78,7 +78,7 @@ class EcuSharedData(DiagLayer):
78
78
  self._resolve_snrefs(context)
79
79
  context.diag_layer = None
80
80
 
81
- def __deepcopy__(self, memo: Dict[int, Any]) -> Any:
81
+ def __deepcopy__(self, memo: dict[int, Any]) -> Any:
82
82
  """Create a deep copy of the protocol layer
83
83
 
84
84
  Note that the copied diagnostic layer is not fully
@@ -1,56 +1,55 @@
1
1
  # SPDX-License-Identifier: MIT
2
- from dataclasses import dataclass
3
- from typing import Any, Dict, List, Union
2
+ from dataclasses import dataclass, field
3
+ from typing import Any
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from ..diagvariable import DiagVariable
7
7
  from ..exceptions import odxraise
8
8
  from ..nameditemlist import NamedItemList
9
- from ..odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
9
+ from ..odxdoccontext import OdxDocContext
10
+ from ..odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
10
11
  from ..snrefcontext import SnRefContext
11
12
  from ..utils import dataclass_fields_asdict
12
13
  from ..variablegroup import VariableGroup
13
14
  from .diaglayerraw import DiagLayerRaw
14
15
 
15
16
 
16
- @dataclass
17
+ @dataclass(kw_only=True)
17
18
  class EcuSharedDataRaw(DiagLayerRaw):
18
19
  """This is a diagnostic layer for data shared accross others
19
20
  """
20
21
 
21
- diag_variables_raw: List[Union[DiagVariable, OdxLinkRef]]
22
- variable_groups: NamedItemList[VariableGroup]
22
+ diag_variables_raw: list[DiagVariable | OdxLinkRef] = field(default_factory=list)
23
+ variable_groups: NamedItemList[VariableGroup] = field(default_factory=NamedItemList)
23
24
 
24
25
  @property
25
26
  def diag_variables(self) -> NamedItemList[DiagVariable]:
26
27
  return self._diag_variables
27
28
 
28
29
  @staticmethod
29
- def from_et(et_element: ElementTree.Element,
30
- doc_frags: List[OdxDocFragment]) -> "EcuSharedDataRaw":
30
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "EcuSharedDataRaw":
31
31
  # objects contained by diagnostic layers exibit an additional
32
32
  # document fragment for the diag layer, so we use the document
33
33
  # fragments of the odx id of the diag layer for IDs of
34
34
  # contained objects.
35
- dlr = DiagLayerRaw.from_et(et_element, doc_frags)
35
+ dlr = DiagLayerRaw.from_et(et_element, context)
36
36
  kwargs = dataclass_fields_asdict(dlr)
37
- doc_frags = dlr.odx_id.doc_fragments
38
37
 
39
- diag_variables_raw: List[Union[DiagVariable, OdxLinkRef]] = []
38
+ diag_variables_raw: list[DiagVariable | OdxLinkRef] = []
40
39
  if (dv_elems := et_element.find("DIAG-VARIABLES")) is not None:
41
40
  for dv_proxy_elem in dv_elems:
42
- dv_proxy: Union[OdxLinkRef, DiagVariable]
41
+ dv_proxy: OdxLinkRef | DiagVariable
43
42
  if dv_proxy_elem.tag == "DIAG-VARIABLE-REF":
44
- dv_proxy = OdxLinkRef.from_et(dv_proxy_elem, doc_frags)
43
+ dv_proxy = OdxLinkRef.from_et(dv_proxy_elem, context)
45
44
  elif dv_proxy_elem.tag == "DIAG-VARIABLE":
46
- dv_proxy = DiagVariable.from_et(dv_proxy_elem, doc_frags)
45
+ dv_proxy = DiagVariable.from_et(dv_proxy_elem, context)
47
46
  else:
48
47
  odxraise()
49
48
 
50
49
  diag_variables_raw.append(dv_proxy)
51
50
 
52
51
  variable_groups = NamedItemList([
53
- VariableGroup.from_et(vg_elem, doc_frags)
52
+ VariableGroup.from_et(vg_elem, context)
54
53
  for vg_elem in et_element.iterfind("VARIABLE-GROUPS/VARIABLE-GROUP")
55
54
  ])
56
55
 
@@ -58,7 +57,7 @@ class EcuSharedDataRaw(DiagLayerRaw):
58
57
  return EcuSharedDataRaw(
59
58
  diag_variables_raw=diag_variables_raw, variable_groups=variable_groups, **kwargs)
60
59
 
61
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
60
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
62
61
  result = super()._build_odxlinks()
63
62
  for dv_proxy in self.diag_variables_raw:
64
63
  if not isinstance(dv_proxy, OdxLinkRef):
@@ -1,7 +1,8 @@
1
1
  # SPDX-License-Identifier: MIT
2
+ from collections.abc import Iterable
2
3
  from copy import deepcopy
3
4
  from dataclasses import dataclass
4
- from typing import Any, Dict, Iterable, List, Optional, Union, cast
5
+ from typing import Any, cast
5
6
  from xml.etree import ElementTree
6
7
 
7
8
  from typing_extensions import override
@@ -11,7 +12,8 @@ from ..dyndefinedspec import DynDefinedSpec
11
12
  from ..ecuvariantpattern import EcuVariantPattern
12
13
  from ..exceptions import odxassert
13
14
  from ..nameditemlist import NamedItemList
14
- from ..odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkRef
15
+ from ..odxdoccontext import OdxDocContext
16
+ from ..odxlink import OdxLinkDatabase, OdxLinkRef
15
17
  from ..parentref import ParentRef
16
18
  from ..variablegroup import HasVariableGroups, VariableGroup
17
19
  from .basevariant import BaseVariant
@@ -20,7 +22,7 @@ from .ecuvariantraw import EcuVariantRaw
20
22
  from .hierarchyelement import HierarchyElement
21
23
 
22
24
 
23
- @dataclass
25
+ @dataclass(kw_only=True)
24
26
  class EcuVariant(HierarchyElement):
25
27
 
26
28
  @property
@@ -28,19 +30,19 @@ class EcuVariant(HierarchyElement):
28
30
  return cast(EcuVariantRaw, self.diag_layer_raw)
29
31
 
30
32
  @property
31
- def diag_variables_raw(self) -> List[Union[DiagVariable, OdxLinkRef]]:
33
+ def diag_variables_raw(self) -> list[DiagVariable | OdxLinkRef]:
32
34
  return self.ecu_variant_raw.diag_variables_raw
33
35
 
34
36
  @property
35
- def dyn_defined_spec(self) -> Optional[DynDefinedSpec]:
37
+ def dyn_defined_spec(self) -> DynDefinedSpec | None:
36
38
  return self.ecu_variant_raw.dyn_defined_spec
37
39
 
38
40
  @property
39
- def parent_refs(self) -> List[ParentRef]:
41
+ def parent_refs(self) -> list[ParentRef]:
40
42
  return self.ecu_variant_raw.parent_refs
41
43
 
42
44
  @property
43
- def base_variant(self) -> Optional[BaseVariant]:
45
+ def base_variant(self) -> BaseVariant | None:
44
46
  """Return the base variant for the ECU variant
45
47
 
46
48
  The ODX specification allows at a single base variant for each
@@ -55,7 +57,7 @@ class EcuVariant(HierarchyElement):
55
57
  return None
56
58
 
57
59
  @property
58
- def ecu_variant_patterns(self) -> List[EcuVariantPattern]:
60
+ def ecu_variant_patterns(self) -> list[EcuVariantPattern]:
59
61
  return self.ecu_variant_raw.ecu_variant_patterns
60
62
 
61
63
  #######
@@ -74,8 +76,8 @@ class EcuVariant(HierarchyElement):
74
76
  #######
75
77
 
76
78
  @staticmethod
77
- def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "EcuVariant":
78
- ecu_variant_raw = EcuVariantRaw.from_et(et_element, doc_frags)
79
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "EcuVariant":
80
+ ecu_variant_raw = EcuVariantRaw.from_et(et_element, context)
79
81
 
80
82
  return EcuVariant(diag_layer_raw=ecu_variant_raw)
81
83
 
@@ -87,7 +89,7 @@ class EcuVariant(HierarchyElement):
87
89
  "The raw diagnostic layer passed to EcuVariant "
88
90
  "must be a EcuVariantRaw")
89
91
 
90
- def __deepcopy__(self, memo: Dict[int, Any]) -> Any:
92
+ def __deepcopy__(self, memo: dict[int, Any]) -> Any:
91
93
  """Create a deep copy of the ECU variant
92
94
 
93
95
  Note that the copied diagnostic layer is not fully
@@ -120,7 +122,7 @@ class EcuVariant(HierarchyElement):
120
122
 
121
123
  return dl.diag_layer_raw.diag_variables
122
124
 
123
- def not_inherited_fn(parent_ref: ParentRef) -> List[str]:
125
+ def not_inherited_fn(parent_ref: ParentRef) -> list[str]:
124
126
  return parent_ref.not_inherited_variables
125
127
 
126
128
  return self._compute_available_objects(get_local_objects_fn, not_inherited_fn)
@@ -134,7 +136,7 @@ class EcuVariant(HierarchyElement):
134
136
 
135
137
  return dl.diag_layer_raw.variable_groups
136
138
 
137
- def not_inherited_fn(parent_ref: ParentRef) -> List[str]:
139
+ def not_inherited_fn(parent_ref: ParentRef) -> list[str]:
138
140
  return []
139
141
 
140
142
  return self._compute_available_objects(get_local_objects_fn, not_inherited_fn)
@@ -1,6 +1,6 @@
1
1
  # SPDX-License-Identifier: MIT
2
- from dataclasses import dataclass
3
- from typing import Any, Dict, List, Optional, Union
2
+ from dataclasses import dataclass, field
3
+ from typing import Any
4
4
  from xml.etree import ElementTree
5
5
 
6
6
  from ..diagvariable import DiagVariable
@@ -8,7 +8,8 @@ from ..dyndefinedspec import DynDefinedSpec
8
8
  from ..ecuvariantpattern import EcuVariantPattern
9
9
  from ..exceptions import odxraise
10
10
  from ..nameditemlist import NamedItemList
11
- from ..odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
11
+ from ..odxdoccontext import OdxDocContext
12
+ from ..odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
12
13
  from ..parentref import ParentRef
13
14
  from ..snrefcontext import SnRefContext
14
15
  from ..utils import dataclass_fields_asdict
@@ -16,59 +17,57 @@ from ..variablegroup import VariableGroup
16
17
  from .hierarchyelementraw import HierarchyElementRaw
17
18
 
18
19
 
19
- @dataclass
20
+ @dataclass(kw_only=True)
20
21
  class EcuVariantRaw(HierarchyElementRaw):
21
- diag_variables_raw: List[Union[DiagVariable, OdxLinkRef]]
22
- variable_groups: NamedItemList[VariableGroup]
23
- ecu_variant_patterns: List[EcuVariantPattern]
24
- dyn_defined_spec: Optional[DynDefinedSpec]
25
- parent_refs: List[ParentRef]
22
+ diag_variables_raw: list[DiagVariable | OdxLinkRef] = field(default_factory=list)
23
+ variable_groups: NamedItemList[VariableGroup] = field(default_factory=NamedItemList)
24
+ ecu_variant_patterns: list[EcuVariantPattern] = field(default_factory=list)
25
+ dyn_defined_spec: DynDefinedSpec | None = None
26
+ parent_refs: list[ParentRef] = field(default_factory=list)
26
27
 
27
28
  @property
28
29
  def diag_variables(self) -> NamedItemList[DiagVariable]:
29
30
  return self._diag_variables
30
31
 
31
32
  @staticmethod
32
- def from_et(et_element: ElementTree.Element,
33
- doc_frags: List[OdxDocFragment]) -> "EcuVariantRaw":
33
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "EcuVariantRaw":
34
34
  # objects contained by diagnostic layers exibit an additional
35
35
  # document fragment for the diag layer, so we use the document
36
36
  # fragments of the odx id of the diag layer for IDs of
37
37
  # contained objects.
38
- her = HierarchyElementRaw.from_et(et_element, doc_frags)
38
+ her = HierarchyElementRaw.from_et(et_element, context)
39
39
  kwargs = dataclass_fields_asdict(her)
40
- doc_frags = her.odx_id.doc_fragments
41
40
 
42
- diag_variables_raw: List[Union[DiagVariable, OdxLinkRef]] = []
41
+ diag_variables_raw: list[DiagVariable | OdxLinkRef] = []
43
42
  if (dv_elems := et_element.find("DIAG-VARIABLES")) is not None:
44
43
  for dv_proxy_elem in dv_elems:
45
- dv_proxy: Union[OdxLinkRef, DiagVariable]
44
+ dv_proxy: OdxLinkRef | DiagVariable
46
45
  if dv_proxy_elem.tag == "DIAG-VARIABLE-REF":
47
- dv_proxy = OdxLinkRef.from_et(dv_proxy_elem, doc_frags)
46
+ dv_proxy = OdxLinkRef.from_et(dv_proxy_elem, context)
48
47
  elif dv_proxy_elem.tag == "DIAG-VARIABLE":
49
- dv_proxy = DiagVariable.from_et(dv_proxy_elem, doc_frags)
48
+ dv_proxy = DiagVariable.from_et(dv_proxy_elem, context)
50
49
  else:
51
50
  odxraise()
52
51
 
53
52
  diag_variables_raw.append(dv_proxy)
54
53
 
55
54
  variable_groups = NamedItemList([
56
- VariableGroup.from_et(vg_elem, doc_frags)
55
+ VariableGroup.from_et(vg_elem, context)
57
56
  for vg_elem in et_element.iterfind("VARIABLE-GROUPS/VARIABLE-GROUP")
58
57
  ])
59
58
 
60
59
  ecu_variant_patterns = None
61
60
  ecu_variant_patterns = [
62
- EcuVariantPattern.from_et(varpat_elem, doc_frags)
61
+ EcuVariantPattern.from_et(varpat_elem, context)
63
62
  for varpat_elem in et_element.iterfind("ECU-VARIANT-PATTERNS/ECU-VARIANT-PATTERN")
64
63
  ]
65
64
 
66
65
  dyn_defined_spec = None
67
66
  if (dds_elem := et_element.find("DYN-DEFINED-SPEC")) is not None:
68
- dyn_defined_spec = DynDefinedSpec.from_et(dds_elem, doc_frags)
67
+ dyn_defined_spec = DynDefinedSpec.from_et(dds_elem, context)
69
68
 
70
69
  parent_refs = [
71
- ParentRef.from_et(pr_el, doc_frags)
70
+ ParentRef.from_et(pr_el, context)
72
71
  for pr_el in et_element.iterfind("PARENT-REFS/PARENT-REF")
73
72
  ]
74
73
 
@@ -81,7 +80,7 @@ class EcuVariantRaw(HierarchyElementRaw):
81
80
  parent_refs=parent_refs,
82
81
  **kwargs)
83
82
 
84
- def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
83
+ def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
85
84
  result = super()._build_odxlinks()
86
85
 
87
86
  for dv_proxy in self.diag_variables_raw:
@@ -1,7 +1,8 @@
1
1
  # SPDX-License-Identifier: MIT
2
+ from collections.abc import Iterable
2
3
  from copy import deepcopy
3
4
  from dataclasses import dataclass
4
- from typing import Any, Dict, Iterable, List, Union, cast
5
+ from typing import Any, cast
5
6
  from xml.etree import ElementTree
6
7
 
7
8
  from typing_extensions import override
@@ -9,7 +10,8 @@ from typing_extensions import override
9
10
  from ..diagvariable import DiagVariable
10
11
  from ..exceptions import odxassert
11
12
  from ..nameditemlist import NamedItemList
12
- from ..odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkRef
13
+ from ..odxdoccontext import OdxDocContext
14
+ from ..odxlink import OdxLinkDatabase, OdxLinkRef
13
15
  from ..parentref import ParentRef
14
16
  from ..variablegroup import VariableGroup
15
17
  from .diaglayer import DiagLayer
@@ -17,7 +19,7 @@ from .functionalgroupraw import FunctionalGroupRaw
17
19
  from .hierarchyelement import HierarchyElement
18
20
 
19
21
 
20
- @dataclass
22
+ @dataclass(kw_only=True)
21
23
  class FunctionalGroup(HierarchyElement):
22
24
  """This is a diagnostic layer for functionality shared between multiple ECU variants
23
25
  """
@@ -27,7 +29,7 @@ class FunctionalGroup(HierarchyElement):
27
29
  return cast(FunctionalGroupRaw, self.diag_layer_raw)
28
30
 
29
31
  @property
30
- def diag_variables_raw(self) -> List[Union[DiagVariable, OdxLinkRef]]:
32
+ def diag_variables_raw(self) -> list[DiagVariable | OdxLinkRef]:
31
33
  return self.functional_group_raw.diag_variables_raw
32
34
 
33
35
  @property
@@ -39,13 +41,12 @@ class FunctionalGroup(HierarchyElement):
39
41
  return self._variable_groups
40
42
 
41
43
  @property
42
- def parent_refs(self) -> List[ParentRef]:
44
+ def parent_refs(self) -> list[ParentRef]:
43
45
  return self.functional_group_raw.parent_refs
44
46
 
45
47
  @staticmethod
46
- def from_et(et_element: ElementTree.Element,
47
- doc_frags: List[OdxDocFragment]) -> "FunctionalGroup":
48
- functional_group_raw = FunctionalGroupRaw.from_et(et_element, doc_frags)
48
+ def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "FunctionalGroup":
49
+ functional_group_raw = FunctionalGroupRaw.from_et(et_element, context)
49
50
 
50
51
  return FunctionalGroup(diag_layer_raw=functional_group_raw)
51
52
 
@@ -73,7 +74,7 @@ class FunctionalGroup(HierarchyElement):
73
74
 
74
75
  return dl.diag_layer_raw.diag_variables # type: ignore[no-any-return]
75
76
 
76
- def not_inherited_fn(parent_ref: ParentRef) -> List[str]:
77
+ def not_inherited_fn(parent_ref: ParentRef) -> list[str]:
77
78
  return parent_ref.not_inherited_variables
78
79
 
79
80
  return self._compute_available_objects(get_local_objects_fn, not_inherited_fn)
@@ -87,12 +88,12 @@ class FunctionalGroup(HierarchyElement):
87
88
 
88
89
  return dl.diag_layer_raw.variable_groups # type: ignore[no-any-return]
89
90
 
90
- def not_inherited_fn(parent_ref: ParentRef) -> List[str]:
91
+ def not_inherited_fn(parent_ref: ParentRef) -> list[str]:
91
92
  return []
92
93
 
93
94
  return self._compute_available_objects(get_local_objects_fn, not_inherited_fn)
94
95
 
95
- def __deepcopy__(self, memo: Dict[int, Any]) -> Any:
96
+ def __deepcopy__(self, memo: dict[int, Any]) -> Any:
96
97
  """Create a deep copy of the functional group layer
97
98
 
98
99
  Note that the copied diagnostic layer is not fully