armodel 1.7.0__py3-none-any.whl → 1.7.1__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.
- armodel/models/M2/AUTOSARTemplates/AutosarTopLevelStructure.py +50 -13
- armodel/models/M2/AUTOSARTemplates/CommonStructure/Filter.py +14 -14
- armodel/models/M2/AUTOSARTemplates/ECUCDescriptionTemplate.py +1 -1
- armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/ARPackage.py +93 -13
- armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/Identifiable.py +14 -4
- armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/PrimitiveTypes.py +35 -10
- armodel/models/M2/AUTOSARTemplates/GenericStructure/LifeCycles.py +5 -0
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/__init__.py +1 -1
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Multiplatform.py +1 -1
- armodel/models/M2/MSR/AsamHdo/AdminData.py +34 -8
- armodel/models/M2/MSR/Documentation/Annotation.py +1 -1
- armodel/models/M2/MSR/Documentation/TextModel/BlockElements/ListElements.py +54 -0
- armodel/models/M2/MSR/Documentation/TextModel/BlockElements/PaginationAndView.py +9 -0
- armodel/models/M2/MSR/Documentation/TextModel/BlockElements/__init__.py +25 -0
- armodel/models/M2/MSR/Documentation/TextModel/LanguageDataModel.py +33 -5
- armodel/models/M2/MSR/Documentation/TextModel/MultilanguageData.py +15 -2
- armodel/models/M2/MSR/Documentation/__init__.py +1 -1
- armodel/models/__init__.py +3 -1
- armodel/parser/abstract_arxml_parser.py +5 -2
- armodel/parser/arxml_parser.py +101 -27
- armodel/tests/test_armodel/models/test_ar_ref.py +7 -4
- armodel/tests/test_armodel/parser/test_sw_components.py +10 -1
- armodel/writer/abstract_arxml_writer.py +8 -8
- armodel/writer/arxml_writer.py +79 -23
- {armodel-1.7.0.dist-info → armodel-1.7.1.dist-info}/METADATA +9 -1
- {armodel-1.7.0.dist-info → armodel-1.7.1.dist-info}/RECORD +30 -26
- {armodel-1.7.0.dist-info → armodel-1.7.1.dist-info}/LICENSE +0 -0
- {armodel-1.7.0.dist-info → armodel-1.7.1.dist-info}/WHEEL +0 -0
- {armodel-1.7.0.dist-info → armodel-1.7.1.dist-info}/entry_points.txt +0 -0
- {armodel-1.7.0.dist-info → armodel-1.7.1.dist-info}/top_level.txt +0 -0
|
@@ -35,11 +35,24 @@ class MultilanguageLongName(ARObject):
|
|
|
35
35
|
def __init__(self):
|
|
36
36
|
super().__init__()
|
|
37
37
|
|
|
38
|
-
self.l4 = []
|
|
38
|
+
self.l4 = [] # type:List[LLongName]
|
|
39
39
|
|
|
40
40
|
def addL4(self, l4: LLongName):
|
|
41
41
|
self.l4.append(l4)
|
|
42
42
|
return self
|
|
43
43
|
|
|
44
44
|
def getL4s(self) -> List[LLongName]:
|
|
45
|
-
return self.l4
|
|
45
|
+
return self.l4
|
|
46
|
+
|
|
47
|
+
class MultiLanguagePlainText(ARObject):
|
|
48
|
+
def __init__(self):
|
|
49
|
+
super().__init__()
|
|
50
|
+
|
|
51
|
+
self.l10s = [] # type: List[LPlainText]
|
|
52
|
+
|
|
53
|
+
def getL10s(self):
|
|
54
|
+
return self.l10s
|
|
55
|
+
|
|
56
|
+
def addL10(self, value):
|
|
57
|
+
self.l10s.append(value)
|
|
58
|
+
return self
|
armodel/models/__init__.py
CHANGED
|
@@ -8,8 +8,10 @@ from .M2.MSR.AsamHdo.Constraints.GlobalConstraints import *
|
|
|
8
8
|
from .M2.MSR.DataDictionary import *
|
|
9
9
|
from .M2.MSR.Documentation import *
|
|
10
10
|
from .M2.MSR.Documentation.Annotation import *
|
|
11
|
-
from .M2.MSR.Documentation.BlockElements import *
|
|
12
11
|
from .M2.MSR.Documentation.TextModel import *
|
|
12
|
+
from .M2.MSR.Documentation.TextModel.BlockElements import *
|
|
13
|
+
from .M2.MSR.Documentation.TextModel.BlockElements.ListElements import *
|
|
14
|
+
from .M2.MSR.Documentation.TextModel.BlockElements.PaginationAndView import *
|
|
13
15
|
from .M2.MSR.Documentation.TextModel.LanguageDataModel import *
|
|
14
16
|
from .M2.MSR.Documentation.TextModel.MultilanguageData import *
|
|
15
17
|
from .M2.AUTOSARTemplates.AutosarTopLevelStructure import *
|
|
@@ -228,8 +228,11 @@ class AbstractARXMLParser:
|
|
|
228
228
|
|
|
229
229
|
def _getChildElementRefTypeDestAndValue(self, element) -> RefType:
|
|
230
230
|
ref = RefType()
|
|
231
|
-
|
|
232
|
-
|
|
231
|
+
if 'BASE' in element.attrib:
|
|
232
|
+
ref.setBase(element.attrib['BASE'])
|
|
233
|
+
if 'DEST' in element.attrib:
|
|
234
|
+
ref.setDest(element.attrib['DEST'])
|
|
235
|
+
ref.setValue(element.text)
|
|
233
236
|
return ref
|
|
234
237
|
|
|
235
238
|
def getChildElementRefType(self, short_name: str, element: ET.Element, key: str) -> RefType:
|
armodel/parser/arxml_parser.py
CHANGED
|
@@ -2,10 +2,6 @@ from typing import List
|
|
|
2
2
|
import xml.etree.ElementTree as ET
|
|
3
3
|
import os
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
5
|
from ..models.M2.MSR.AsamHdo.AdminData import AdminData
|
|
10
6
|
from ..models.M2.MSR.AsamHdo.BaseTypes import BaseTypeDirectDefinition
|
|
11
7
|
from ..models.M2.MSR.AsamHdo.Constraints.GlobalConstraints import DataConstrRule, InternalConstrs, PhysConstrs, DataConstr
|
|
@@ -20,9 +16,10 @@ from ..models.M2.MSR.DataDictionary.DataDefProperties import ValueList
|
|
|
20
16
|
from ..models.M2.MSR.DataDictionary.RecordLayout import SwRecordLayoutGroup
|
|
21
17
|
from ..models.M2.MSR.DataDictionary.CalibrationParameter import SwCalprmAxisSet
|
|
22
18
|
from ..models.M2.MSR.Documentation.Annotation import Annotation, GeneralAnnotation
|
|
23
|
-
from ..models.M2.MSR.Documentation.BlockElements import DocumentationBlock
|
|
24
|
-
from ..models.M2.MSR.Documentation.TextModel.
|
|
25
|
-
from ..models.M2.MSR.Documentation.TextModel.
|
|
19
|
+
from ..models.M2.MSR.Documentation.TextModel.BlockElements import DocumentationBlock
|
|
20
|
+
from ..models.M2.MSR.Documentation.TextModel.BlockElements.ListElements import ListElement
|
|
21
|
+
from ..models.M2.MSR.Documentation.TextModel.LanguageDataModel import LLongName, LOverviewParagraph, LParagraph, LanguageSpecific
|
|
22
|
+
from ..models.M2.MSR.Documentation.TextModel.MultilanguageData import MultiLanguageOverviewParagraph, MultiLanguageParagraph, MultiLanguagePlainText, MultilanguageLongName
|
|
26
23
|
|
|
27
24
|
from ..models.M2.AUTOSARTemplates.AutosarTopLevelStructure import AUTOSAR
|
|
28
25
|
from ..models.M2.AUTOSARTemplates.BswModuleTemplate.BswBehavior import BswInternalBehavior, BswModuleEntity, BswScheduleEvent, BswModeSenderPolicy
|
|
@@ -45,7 +42,7 @@ from ..models.M2.AUTOSARTemplates.ECUCDescriptionTemplate import EcucAbstractRef
|
|
|
45
42
|
from ..models.M2.AUTOSARTemplates.GenericStructure.AbstractStructure import AnyInstanceRef
|
|
46
43
|
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.Identifiable import Identifiable, MultilanguageReferrable
|
|
47
44
|
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.EngineeringObject import AutosarEngineeringObject, EngineeringObject
|
|
48
|
-
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.ARPackage import ARPackage
|
|
45
|
+
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.ARPackage import ARPackage, ReferenceBase
|
|
49
46
|
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.PrimitiveTypes import RefType, ARLiteral
|
|
50
47
|
from ..models.M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.PortAPIOptions import PortAPIOption, PortDefinedArgumentValue
|
|
51
48
|
from ..models.M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.RTEEvents import DataReceivedEvent, OperationInvokedEvent, RTEEvent, SwcModeSwitchEvent
|
|
@@ -117,13 +114,17 @@ class ARXMLParser(AbstractARXMLParser):
|
|
|
117
114
|
for child_element in self.findall(element, "./SDGS/SDG"):
|
|
118
115
|
admin_data.addSdg(self.getSdg(child_element))
|
|
119
116
|
|
|
120
|
-
def
|
|
121
|
-
|
|
117
|
+
def getAdminData(self, element: ET.Element, key: str) -> AdminData:
|
|
118
|
+
admin_data = None
|
|
119
|
+
child_element = self.find(element, key)
|
|
122
120
|
if child_element is not None:
|
|
123
121
|
self.logger.debug("readAdminData")
|
|
124
122
|
admin_data = AdminData()
|
|
123
|
+
admin_data.setLanguage(self.getChildElementOptionalLiteral(child_element, "LANGUAGE")) \
|
|
124
|
+
.setUsedLanguages(self.getMultiLanguagePlainText(child_element, "USED-LANGUAGES"))
|
|
125
|
+
|
|
125
126
|
self.readSdgs(child_element, admin_data)
|
|
126
|
-
|
|
127
|
+
return admin_data
|
|
127
128
|
|
|
128
129
|
def readMultilanguageReferrable(self, element: ET.Element, referrable: MultilanguageReferrable):
|
|
129
130
|
self.readElementAttributes(element, referrable)
|
|
@@ -136,9 +137,10 @@ class ARXMLParser(AbstractARXMLParser):
|
|
|
136
137
|
identifiable.addAnnotation(annotation)
|
|
137
138
|
|
|
138
139
|
identifiable.setCategory(self.getChildElementOptionalLiteral(element, "CATEGORY")) \
|
|
139
|
-
.setDesc(self.getMultiLanguageOverviewParagraph(element, "DESC"))
|
|
140
|
+
.setDesc(self.getMultiLanguageOverviewParagraph(element, "DESC")) \
|
|
141
|
+
.setIntroduction(self.getDocumentationBlock(element, "INTRODUCTION"))
|
|
140
142
|
|
|
141
|
-
self.
|
|
143
|
+
identifiable.setAdminData(self.getAdminData(element, "ADMIN-DATA"))
|
|
142
144
|
|
|
143
145
|
def readLLongName(self, element: ET.Element, long_name: MultilanguageLongName):
|
|
144
146
|
for child_element in self.findall(element, "./L-4"):
|
|
@@ -933,33 +935,84 @@ class ARXMLParser(AbstractARXMLParser):
|
|
|
933
935
|
sw_pointer_target_props.sw_data_def_props = self.getSwDataDefProps(child_element, "SW-DATA-DEF-PROPS")
|
|
934
936
|
parent.swPointerTargetProps = sw_pointer_target_props
|
|
935
937
|
|
|
936
|
-
def
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
938
|
+
def readLanguageSpecific(self, element: ET.Element, specific: LanguageSpecific):
|
|
939
|
+
self.readElementAttributes(element, specific)
|
|
940
|
+
specific.value = element.text
|
|
941
|
+
if 'L' in element.attrib:
|
|
942
|
+
specific.l = element.attrib['L']
|
|
943
|
+
|
|
944
|
+
def getLParagraphs(self, element: ET.Element, key: str) -> List[LParagraph]:
|
|
945
|
+
results = []
|
|
946
|
+
for child_element in self.findall(element, key):
|
|
947
|
+
l1 = LParagraph()
|
|
948
|
+
self.readLanguageSpecific(child_element, l1)
|
|
949
|
+
results.append(l1)
|
|
950
|
+
return results
|
|
944
951
|
|
|
945
952
|
def getMultiLanguageParagraphs(self, element: ET.Element, key: str) -> List[MultiLanguageParagraph]:
|
|
946
953
|
paragraphs = []
|
|
947
954
|
for child_element in self.findall(element, key):
|
|
948
955
|
paragraph = MultiLanguageParagraph()
|
|
949
956
|
self.readElementAttributes(child_element, paragraph)
|
|
950
|
-
self.
|
|
957
|
+
for l1 in self.getLParagraphs(child_element, "L-1"):
|
|
958
|
+
paragraph.addL1(l1)
|
|
951
959
|
paragraphs.append(paragraph)
|
|
952
960
|
return paragraphs
|
|
961
|
+
|
|
962
|
+
def getLPlainTexts(self, element: ET.Element, key: str) -> List[LParagraph]:
|
|
963
|
+
results = []
|
|
964
|
+
for child_element in self.findall(element, key):
|
|
965
|
+
l1 = LParagraph()
|
|
966
|
+
self.readLanguageSpecific(child_element, l1)
|
|
967
|
+
results.append(l1)
|
|
968
|
+
return results
|
|
969
|
+
|
|
970
|
+
def getListElements(self, element: ET.Element, key: str) -> List[ListElement]:
|
|
971
|
+
'''
|
|
972
|
+
Read the DocumentationBlock List
|
|
973
|
+
'''
|
|
974
|
+
result = []
|
|
975
|
+
for child_element in self.findall(element, key):
|
|
976
|
+
list = ListElement()
|
|
977
|
+
if 'TYPE' in child_element.attrib:
|
|
978
|
+
list.setType(child_element.attrib['TYPE'])
|
|
979
|
+
for block in self.getDocumentationBlockList(child_element, "ITEM"):
|
|
980
|
+
list.addItem(block)
|
|
981
|
+
result.append(list)
|
|
982
|
+
return result
|
|
983
|
+
|
|
984
|
+
def getMultiLanguagePlainText(self, element: ET.Element, key: str) -> MultiLanguagePlainText:
|
|
985
|
+
paragraph = None
|
|
986
|
+
child_element = self.find(element, key)
|
|
987
|
+
if child_element is not None:
|
|
988
|
+
paragraph = MultiLanguagePlainText()
|
|
989
|
+
self.readElementAttributes(child_element, paragraph)
|
|
990
|
+
for l10 in self.getLPlainTexts(child_element, "L-10"):
|
|
991
|
+
paragraph.addL10(l10)
|
|
992
|
+
return paragraph
|
|
993
|
+
|
|
994
|
+
def readDocumentationBlock(self, element: ET.Element, block: DocumentationBlock):
|
|
995
|
+
self.readElementAttributes(element, block)
|
|
996
|
+
for paragraph in self.getMultiLanguageParagraphs(element, "P"):
|
|
997
|
+
block.addP(paragraph)
|
|
998
|
+
for list in self.getListElements(element, "LIST"):
|
|
999
|
+
block.addList(list)
|
|
953
1000
|
|
|
954
1001
|
def getDocumentationBlock(self, element: ET.Element, key: str) -> DocumentationBlock:
|
|
955
1002
|
block = None
|
|
956
1003
|
child_element = self.find(element, key)
|
|
957
1004
|
if child_element is not None:
|
|
958
1005
|
block = DocumentationBlock()
|
|
959
|
-
self.
|
|
960
|
-
for paragraph in self.getMultiLanguageParagraphs(child_element, "P"):
|
|
961
|
-
block.addP(paragraph)
|
|
1006
|
+
self.readDocumentationBlock(child_element, block)
|
|
962
1007
|
return block
|
|
1008
|
+
|
|
1009
|
+
def getDocumentationBlockList(self, element: ET.Element, key: str) -> List[DocumentationBlock]:
|
|
1010
|
+
blocks = []
|
|
1011
|
+
for child_element in self.findall(element, key):
|
|
1012
|
+
block = DocumentationBlock()
|
|
1013
|
+
self.readDocumentationBlock(child_element, block)
|
|
1014
|
+
blocks.append(block)
|
|
1015
|
+
return blocks
|
|
963
1016
|
|
|
964
1017
|
def readGeneralAnnotation(self, element: ET.Element, annotation: GeneralAnnotation):
|
|
965
1018
|
annotation.setAnnotationOrigin(self.getChildElementOptionalLiteral(element, 'ANNOTATION-ORIGIN')) \
|
|
@@ -1031,6 +1084,7 @@ class ARXMLParser(AbstractARXMLParser):
|
|
|
1031
1084
|
.setDataConstrRef(self.getChildElementOptionalRefType(conditional_tag, "DATA-CONSTR-REF")) \
|
|
1032
1085
|
.setCompuMethodRef(self.getChildElementOptionalRefType(conditional_tag, "COMPU-METHOD-REF")) \
|
|
1033
1086
|
.setSwImplPolicy(self.getChildElementOptionalLiteral(conditional_tag, "SW-IMPL-POLICY")) \
|
|
1087
|
+
.setSwIntendedResolution(self.getChildElementOptionalNumericalValue(conditional_tag, "SW-INTENDED-RESOLUTION")) \
|
|
1034
1088
|
.setImplementationDataTypeRef(self.getChildElementOptionalRefType(conditional_tag, "IMPLEMENTATION-DATA-TYPE-REF")) \
|
|
1035
1089
|
.setSwCalibrationAccess(self.getChildElementOptionalLiteral(conditional_tag, "SW-CALIBRATION-ACCESS")) \
|
|
1036
1090
|
.setSwCalprmAxisSet(self.getSwCalprmAxisSet(conditional_tag, "SW-CALPRM-AXIS-SET")) \
|
|
@@ -2827,6 +2881,12 @@ class ARXMLParser(AbstractARXMLParser):
|
|
|
2827
2881
|
frame = parent.createGenericEthernetFrame(short_name)
|
|
2828
2882
|
self.readFrame(element, frame)
|
|
2829
2883
|
|
|
2884
|
+
def readLifeCycleInfoSet(self, element: ET.Element, parent: ARPackage):
|
|
2885
|
+
short_name = self.getShortName(element)
|
|
2886
|
+
self.logger.debug("Read LifeCycleInfoSet %s" % short_name)
|
|
2887
|
+
frame = parent.createLifeCycleInfoSet(short_name)
|
|
2888
|
+
self.readIdentifiable(element, frame)
|
|
2889
|
+
|
|
2830
2890
|
def readARPackageElements(self, element: ET.Element, parent: ARPackage):
|
|
2831
2891
|
for child_element in self.findall(element, "./ELEMENTS/*"):
|
|
2832
2892
|
tag_name = self.getTagName(child_element.tag)
|
|
@@ -2940,9 +3000,22 @@ class ARXMLParser(AbstractARXMLParser):
|
|
|
2940
3000
|
self.readParameterInterface(child_element, parent)
|
|
2941
3001
|
elif tag_name == "ETHERNET-FRAME":
|
|
2942
3002
|
self.readGenericEthernetFrame(child_element, parent)
|
|
3003
|
+
elif tag_name == "LIFE-CYCLE-INFO-SET":
|
|
3004
|
+
self.readLifeCycleInfoSet(child_element, parent)
|
|
2943
3005
|
else:
|
|
2944
3006
|
self._raiseError("Unsupported element type of ARPackage <%s>" % tag_name)
|
|
2945
3007
|
|
|
3008
|
+
def readReferenceBases(self, element: ET.Element, parent: ARPackage):
|
|
3009
|
+
self.logger.debug("Read ReferenceBases")
|
|
3010
|
+
for child_element in self.findall(element, "REFERENCE-BASES/REFERENCE-BASE"):
|
|
3011
|
+
base = ReferenceBase()
|
|
3012
|
+
base.setShortLabel(self.getChildElementOptionalLiteral(child_element, "SHORT-LABEL")) \
|
|
3013
|
+
.setIsDefault(self.getChildElementOptionalBooleanValue(child_element, "IS-DEFAULT")) \
|
|
3014
|
+
.setIsGlobal(self.getChildElementOptionalBooleanValue(child_element, "IS-GLOBAL")) \
|
|
3015
|
+
.setBaseIsThisPackage(self.getChildElementOptionalBooleanValue(child_element, "BASE-IS-THIS-PACKAGE")) \
|
|
3016
|
+
.setPackageRef(self.getChildElementOptionalRefType(child_element, "PACKAGE-REF"))
|
|
3017
|
+
parent.addReferenceBase(base)
|
|
3018
|
+
|
|
2946
3019
|
def readARPackages(self, element: ET.Element, parent: ARPackage):
|
|
2947
3020
|
for child_element in element.findall("./xmlns:AR-PACKAGES/xmlns:AR-PACKAGE", self.nsmap):
|
|
2948
3021
|
short_name = self.getShortName(child_element)
|
|
@@ -2951,9 +3024,9 @@ class ARXMLParser(AbstractARXMLParser):
|
|
|
2951
3024
|
self.logger.debug("readARPackages %s" % ar_package.full_name)
|
|
2952
3025
|
|
|
2953
3026
|
self.readIdentifiable(child_element, ar_package)
|
|
2954
|
-
self.readARPackageElements(child_element, ar_package)
|
|
2955
3027
|
self.readARPackages(child_element, ar_package)
|
|
2956
|
-
|
|
3028
|
+
self.readARPackageElements(child_element, ar_package)
|
|
3029
|
+
self.readReferenceBases(child_element, ar_package)
|
|
2957
3030
|
|
|
2958
3031
|
def load(self, filename, document: AUTOSAR):
|
|
2959
3032
|
self.logger.info("Load %s ..." % os.path.realpath(filename))
|
|
@@ -2964,6 +3037,7 @@ class ARXMLParser(AbstractARXMLParser):
|
|
|
2964
3037
|
self._raiseError("Invalid ARXML file <%s>" % filename)
|
|
2965
3038
|
|
|
2966
3039
|
self.getAUTOSARInfo(root, document)
|
|
3040
|
+
document.setAdminData(self.getAdminData(root, "ADMIN-DATA"))
|
|
2967
3041
|
self.readARPackages(root, document)
|
|
2968
3042
|
|
|
2969
3043
|
document.reload()
|
|
@@ -14,13 +14,16 @@ from ....models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.ArOb
|
|
|
14
14
|
class TestARRef:
|
|
15
15
|
def test_RefType(self):
|
|
16
16
|
ref_type = RefType()
|
|
17
|
-
assert(ref_type.
|
|
18
|
-
assert(ref_type.
|
|
17
|
+
assert(ref_type.getBase() == None)
|
|
18
|
+
assert(ref_type.getValue() == None)
|
|
19
|
+
assert(ref_type.getDest() == None)
|
|
19
20
|
|
|
20
21
|
def test_TRefType(self):
|
|
21
22
|
ref_type = TRefType()
|
|
22
|
-
assert(ref_type.
|
|
23
|
-
assert(ref_type.
|
|
23
|
+
assert(ref_type.getBase() == None)
|
|
24
|
+
assert(ref_type.getValue() == None)
|
|
25
|
+
assert(ref_type.getDest() == None)
|
|
26
|
+
|
|
24
27
|
|
|
25
28
|
def test_AutosarVariableRef(self):
|
|
26
29
|
ref_type = AutosarVariableRef()
|
|
@@ -64,7 +64,16 @@ class TestSWComponents:
|
|
|
64
64
|
|
|
65
65
|
assert(filecmp.cmp("src/armodel/tests/test_files/BswMMode.arxml", "data/generated_AUTOSAR_Datatypes.arxml", shallow = False) == True)
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
def test_bswm_mode_arxml_loading_and_saving(self):
|
|
68
|
+
document = AUTOSAR.getInstance()
|
|
69
|
+
document.clear()
|
|
70
|
+
parser = ARXMLParser()
|
|
71
|
+
parser.load("test_files/AUTOSAR_MOD_AISpecification_ApplicationDataType_Blueprint.arxml", document)
|
|
72
|
+
|
|
73
|
+
writer = ARXMLWriter()
|
|
74
|
+
writer.save("data/generated_AUTOSAR_MOD_AISpecification_ApplicationDataType_Blueprint.arxml", document)
|
|
75
|
+
|
|
76
|
+
assert(filecmp.cmp("test_files/AUTOSAR_MOD_AISpecification_ApplicationDataType_Blueprint.arxml", "data/generated_AUTOSAR_MOD_AISpecification_ApplicationDataType_Blueprint.arxml", shallow = False) == True)
|
|
68
77
|
|
|
69
78
|
|
|
70
79
|
|
|
@@ -8,11 +8,7 @@ import logging
|
|
|
8
8
|
import xml.etree.cElementTree as ET
|
|
9
9
|
|
|
10
10
|
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.ArObject import ARObject
|
|
11
|
-
|
|
12
|
-
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.PrimitiveTypes import ARFloat, ARLiteral, ARNumerical, Integer, TimeValue
|
|
13
|
-
from armodel.models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.PrimitiveTypes import TRefType
|
|
14
|
-
|
|
15
|
-
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.PrimitiveTypes import ARBoolean
|
|
11
|
+
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.PrimitiveTypes import ARFloat, ARLiteral, ARNumerical, Integer, TimeValue, RefType, ARBoolean
|
|
16
12
|
|
|
17
13
|
class AbstractARXMLWriter:
|
|
18
14
|
__metaclass__ = ABCMeta
|
|
@@ -84,11 +80,15 @@ class AbstractARXMLWriter:
|
|
|
84
80
|
def setChildElementOptionalRevisionLabelString(self, element: ET.Element, key: str, literal: ARLiteral):
|
|
85
81
|
self.setChildElementOptionalLiteral(element, key, literal)
|
|
86
82
|
|
|
87
|
-
def setChildElementOptionalRefType(self, parent: ET.Element, child_tag_name: str, ref:
|
|
83
|
+
def setChildElementOptionalRefType(self, parent: ET.Element, child_tag_name: str, ref: RefType):
|
|
88
84
|
if ref is not None:
|
|
89
85
|
child_tag = ET.SubElement(parent, child_tag_name)
|
|
90
|
-
|
|
91
|
-
|
|
86
|
+
base = ref.getBase()
|
|
87
|
+
if base is not None:
|
|
88
|
+
child_tag.attrib['BASE'] = base
|
|
89
|
+
dest = ref.getDest()
|
|
90
|
+
if dest is not None:
|
|
91
|
+
child_tag.attrib['DEST'] = dest
|
|
92
92
|
if ref.value is not None:
|
|
93
93
|
child_tag.text = ref.value
|
|
94
94
|
|
armodel/writer/arxml_writer.py
CHANGED
|
@@ -2,6 +2,7 @@ import xml.etree.cElementTree as ET
|
|
|
2
2
|
|
|
3
3
|
from typing import List
|
|
4
4
|
|
|
5
|
+
from armodel.models.M2.AUTOSARTemplates.GenericStructure.LifeCycles import LifeCycleInfoSet
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
|
|
@@ -19,8 +20,10 @@ from ..models.M2.MSR.DataDictionary.CalibrationParameter import SwCalprmAxis, Sw
|
|
|
19
20
|
from ..models.M2.MSR.DataDictionary.DataDefProperties import SwDataDefProps, ValueList
|
|
20
21
|
from ..models.M2.MSR.DataDictionary.RecordLayout import SwRecordLayout, SwRecordLayoutGroup, SwRecordLayoutV
|
|
21
22
|
from ..models.M2.MSR.Documentation.Annotation import Annotation
|
|
22
|
-
from ..models.M2.MSR.Documentation.BlockElements import DocumentationBlock
|
|
23
|
-
from ..models.M2.MSR.Documentation.TextModel.
|
|
23
|
+
from ..models.M2.MSR.Documentation.TextModel.BlockElements import DocumentationBlock
|
|
24
|
+
from ..models.M2.MSR.Documentation.TextModel.BlockElements.ListElements import ListElement
|
|
25
|
+
from ..models.M2.MSR.Documentation.TextModel.LanguageDataModel import LLongName, LPlainText, LanguageSpecific
|
|
26
|
+
from ..models.M2.MSR.Documentation.TextModel.MultilanguageData import MultiLanguageOverviewParagraph, MultiLanguageParagraph, MultiLanguagePlainText, MultilanguageLongName
|
|
24
27
|
|
|
25
28
|
from ..models.M2.AUTOSARTemplates.AutosarTopLevelStructure import AUTOSAR
|
|
26
29
|
from ..models.M2.AUTOSARTemplates.BswModuleTemplate.BswOverview import BswModuleDescription
|
|
@@ -44,7 +47,7 @@ from ..models.M2.AUTOSARTemplates.ECUCDescriptionTemplate import EcucAbstractRef
|
|
|
44
47
|
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.EngineeringObject import AutosarEngineeringObject, EngineeringObject
|
|
45
48
|
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.Identifiable import ARElement, Identifiable, MultilanguageReferrable, Referrable
|
|
46
49
|
from ..models.M2.AUTOSARTemplates.GenericStructure.AbstractStructure import AnyInstanceRef
|
|
47
|
-
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.ARPackage import ARPackage
|
|
50
|
+
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.ARPackage import ARPackage, ReferenceBase
|
|
48
51
|
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.PrimitiveTypes import RefType, ARLiteral, Limit
|
|
49
52
|
|
|
50
53
|
from ..models.M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.PortAPIOptions import PortAPIOption
|
|
@@ -138,44 +141,62 @@ class ARXMLWriter(AbstractARXMLWriter):
|
|
|
138
141
|
self.setARObjectAttributes(element, referrable)
|
|
139
142
|
self.setShortName(element, referrable.short_name)
|
|
140
143
|
|
|
144
|
+
def setLanguageSpecific(self, element: ET.Element, key: str, specific: LanguageSpecific):
|
|
145
|
+
child_element = ET.SubElement(element, key)
|
|
146
|
+
self.setARObjectAttributes(child_element, specific)
|
|
147
|
+
if specific.l is not None:
|
|
148
|
+
child_element.attrib['L'] = specific.l
|
|
149
|
+
child_element.text = specific.value
|
|
150
|
+
|
|
151
|
+
def setLLongName(self, element: ET.Element, name: LLongName):
|
|
152
|
+
self.setLanguageSpecific(element, "L-4", name)
|
|
153
|
+
|
|
141
154
|
def setMultiLongName(self, element: ET.Element, key: str, long_name: MultilanguageLongName):
|
|
142
155
|
if long_name is not None:
|
|
143
|
-
|
|
144
|
-
self.setARObjectAttributes(
|
|
156
|
+
child_element = ET.SubElement(element, key)
|
|
157
|
+
self.setARObjectAttributes(child_element, long_name)
|
|
145
158
|
for l4 in long_name.getL4s():
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
l4_tag.text = l4.value
|
|
159
|
+
self.setLLongName(child_element, l4)
|
|
160
|
+
|
|
161
|
+
def setLOverviewParagraph(self, element: ET.Element, name: LLongName):
|
|
162
|
+
self.setLanguageSpecific(element, "L-2", name)
|
|
151
163
|
|
|
152
164
|
def setMultiLanguageOverviewParagraph(self, element: ET.Element, key: str, paragraph: MultiLanguageOverviewParagraph):
|
|
153
165
|
if paragraph is not None:
|
|
154
|
-
|
|
155
|
-
self.setARObjectAttributes(
|
|
166
|
+
child_element = ET.SubElement(element, key)
|
|
167
|
+
self.setARObjectAttributes(child_element, paragraph)
|
|
156
168
|
for l2 in paragraph.getL2s():
|
|
157
|
-
|
|
158
|
-
self.setARObjectAttributes(l2_tag, l2)
|
|
159
|
-
if l2.l is not None:
|
|
160
|
-
l2_tag.attrib['L'] = l2.l
|
|
161
|
-
l2_tag.text = l2.value
|
|
169
|
+
self.setLOverviewParagraph(child_element, l2)
|
|
162
170
|
|
|
163
171
|
def setMultilanguageReferrable(self, element: ET.Element, referrable: MultilanguageReferrable):
|
|
164
172
|
self.setReferable(element, referrable)
|
|
165
173
|
if referrable.longName is not None:
|
|
166
174
|
self.setMultiLongName(element, "LONG-NAME", referrable.longName)
|
|
167
175
|
|
|
176
|
+
def setLPlainText(self, element: ET.Element, text: LPlainText):
|
|
177
|
+
self.setLanguageSpecific(element, "L-10", text)
|
|
178
|
+
|
|
179
|
+
def setMultiLanguagePlainText(self, element: ET.Element, key: str, paragraph: MultiLanguagePlainText):
|
|
180
|
+
if paragraph is not None:
|
|
181
|
+
child_element = ET.SubElement(element, key)
|
|
182
|
+
self.setARObjectAttributes(child_element, paragraph)
|
|
183
|
+
for l10 in paragraph.getL10s():
|
|
184
|
+
self.setLPlainText(child_element, l10)
|
|
185
|
+
|
|
168
186
|
def setAdminData(self, element: ET.Element, admin_data: AdminData):
|
|
169
|
-
|
|
170
|
-
|
|
187
|
+
if admin_data is not None:
|
|
188
|
+
child_element = ET.SubElement(element, "ADMIN-DATA")
|
|
189
|
+
self.setChildElementOptionalLiteral(child_element, "LANGUAGE", admin_data.getLanguage())
|
|
190
|
+
self.setMultiLanguagePlainText(child_element, "USED-LANGUAGES", admin_data.getUsedLanguages())
|
|
191
|
+
self.writeSdgs(child_element, admin_data)
|
|
171
192
|
|
|
172
193
|
def setIdentifiable(self, element: ET.Element, identifiable: Identifiable):
|
|
173
194
|
self.setMultilanguageReferrable(element, identifiable)
|
|
174
195
|
self.setAnnotations(element, identifiable.getAnnotations())
|
|
175
196
|
self.setMultiLanguageOverviewParagraph(element, "DESC", identifiable.getDesc())
|
|
176
197
|
self.setChildElementOptionalLiteral(element, "CATEGORY", identifiable.getCategory())
|
|
177
|
-
|
|
178
|
-
|
|
198
|
+
self.setDocumentationBlock(element, "INTRODUCTION", identifiable.getIntroduction())
|
|
199
|
+
self.setAdminData(element, identifiable.getAdminData())
|
|
179
200
|
|
|
180
201
|
def setARElement(self, parent: ET.Element, ar_element: ARElement):
|
|
181
202
|
self.setIdentifiable(parent, ar_element)
|
|
@@ -573,12 +594,23 @@ class ARXMLWriter(AbstractARXMLWriter):
|
|
|
573
594
|
self.setARObjectAttributes(child_element, paragraph)
|
|
574
595
|
self.writeLParagraphs(child_element, paragraph)
|
|
575
596
|
return paragraphs
|
|
597
|
+
|
|
598
|
+
def setListElement(self, element: ET.Element, key: str, list: ListElement):
|
|
599
|
+
if list is not None:
|
|
600
|
+
child_element = ET.SubElement(element, key)
|
|
601
|
+
type = list.getType()
|
|
602
|
+
if type is not None:
|
|
603
|
+
child_element.attrib['TYPE'] = type
|
|
604
|
+
for item in list.getItems():
|
|
605
|
+
self.setDocumentationBlock(child_element, "ITEM", item)
|
|
576
606
|
|
|
577
607
|
def setDocumentationBlock(self, element: ET.Element, key: str, block: DocumentationBlock):
|
|
578
608
|
if block is not None:
|
|
579
609
|
child_element = ET.SubElement(element, key)
|
|
580
610
|
self.setARObjectAttributes(child_element, block)
|
|
581
611
|
self.setMultiLanguageParagraphs(child_element, "P", block.getPs())
|
|
612
|
+
for list in block.getLists():
|
|
613
|
+
self.setListElement(child_element, "LIST", list)
|
|
582
614
|
|
|
583
615
|
def writeGeneralAnnotation(self, element: ET.Element, annotation: Annotation):
|
|
584
616
|
self.setMultiLongName(element, "LABEL", annotation.getLabel())
|
|
@@ -644,9 +676,10 @@ class ARXMLWriter(AbstractARXMLWriter):
|
|
|
644
676
|
self.setChildElementOptionalLiteral(sw_data_def_props_conditional_tag, "SW-CALIBRATION-ACCESS", sw_data_def_props.getSwCalibrationAccess())
|
|
645
677
|
self.setSwCalprmAxisSet(sw_data_def_props_conditional_tag, "SW-CALPRM-AXIS-SET", sw_data_def_props.getSwCalprmAxisSet())
|
|
646
678
|
self.setChildElementOptionalRefType(sw_data_def_props_conditional_tag, "COMPU-METHOD-REF", sw_data_def_props.getCompuMethodRef())
|
|
679
|
+
self.setChildElementOptionalRefType(sw_data_def_props_conditional_tag, "DATA-CONSTR-REF", sw_data_def_props.getDataConstrRef())
|
|
647
680
|
self.setChildElementOptionalLiteral(sw_data_def_props_conditional_tag, "SW-IMPL-POLICY", sw_data_def_props.getSwImplPolicy())
|
|
681
|
+
self.setChildElementOptionalNumericalValue(sw_data_def_props_conditional_tag, "SW-INTENDED-RESOLUTION", sw_data_def_props.getSwIntendedResolution())
|
|
648
682
|
self.setChildElementOptionalRefType(sw_data_def_props_conditional_tag, "IMPLEMENTATION-DATA-TYPE-REF", sw_data_def_props.getImplementationDataTypeRef())
|
|
649
|
-
self.setChildElementOptionalRefType(sw_data_def_props_conditional_tag, "DATA-CONSTR-REF", sw_data_def_props.getDataConstrRef())
|
|
650
683
|
self.setChildElementOptionalRefType(sw_data_def_props_conditional_tag, "SW-RECORD-LAYOUT-REF", sw_data_def_props.getSwRecordLayoutRef())
|
|
651
684
|
self.setChildElementOptionalRefType(sw_data_def_props_conditional_tag, "VALUE-AXIS-DATA-TYPE-REF", sw_data_def_props.getValueAxisDataTypeRef())
|
|
652
685
|
self.setChildElementOptionalRefType(sw_data_def_props_conditional_tag, "UNIT-REF", sw_data_def_props.getUnitRef())
|
|
@@ -2632,11 +2665,16 @@ class ARXMLWriter(AbstractARXMLWriter):
|
|
|
2632
2665
|
child_element = ET.SubElement(element, "PARAMETER-INTERFACE")
|
|
2633
2666
|
self.setIdentifiable(child_element, signal)
|
|
2634
2667
|
|
|
2635
|
-
def writeGenericEthernetFrame(self, element: ET.Element, signal:
|
|
2668
|
+
def writeGenericEthernetFrame(self, element: ET.Element, signal: GenericEthernetFrame):
|
|
2636
2669
|
self.logger.debug("Write GenericEthernetFrame %s" % signal.short_name)
|
|
2637
2670
|
child_element = ET.SubElement(element, "ETHERNET-FRAME")
|
|
2638
2671
|
self.writeFrame(child_element, signal)
|
|
2639
2672
|
|
|
2673
|
+
def writeLifeCycleInfoSet(self, element: ET.Element, set: LifeCycleInfoSet):
|
|
2674
|
+
self.logger.debug("Write LifeCycleInfoSet %s" % set.short_name)
|
|
2675
|
+
child_element = ET.SubElement(element, "LIFE-CYCLE-INFO-SET")
|
|
2676
|
+
self.setIdentifiable(child_element, set)
|
|
2677
|
+
|
|
2640
2678
|
def writeISignalToPduMappings(self, element: ET.Element, parent: ISignalIPdu):
|
|
2641
2679
|
mappings = parent.getISignalToPduMappings()
|
|
2642
2680
|
if len(mappings) > 0:
|
|
@@ -2797,9 +2835,23 @@ class ARXMLWriter(AbstractARXMLWriter):
|
|
|
2797
2835
|
self.writeParameterInterface(element, ar_element)
|
|
2798
2836
|
elif isinstance(ar_element, GenericEthernetFrame):
|
|
2799
2837
|
self.writeGenericEthernetFrame(element, ar_element)
|
|
2838
|
+
elif isinstance(ar_element, LifeCycleInfoSet):
|
|
2839
|
+
self.writeLifeCycleInfoSet(element, ar_element)
|
|
2800
2840
|
else:
|
|
2801
2841
|
raise NotImplementedError("Unsupported Elements of ARPackage <%s>" % type(ar_element))
|
|
2802
2842
|
|
|
2843
|
+
def writeReferenceBases(self, element: ET.Element, bases: List[ReferenceBase]):
|
|
2844
|
+
self.logger.debug("Write ReferenceBases")
|
|
2845
|
+
if len(bases) > 0:
|
|
2846
|
+
bases_tag = ET.SubElement(element, "REFERENCE-BASES")
|
|
2847
|
+
for base in bases:
|
|
2848
|
+
child_element = ET.SubElement(bases_tag, "REFERENCE-BASE")
|
|
2849
|
+
self.setChildElementOptionalLiteral(child_element, "SHORT-LABEL", base.getShortLabel())
|
|
2850
|
+
self.setChildElementOptionalBooleanValue(child_element, "IS-DEFAULT", base.getIsDefault())
|
|
2851
|
+
self.setChildElementOptionalBooleanValue(child_element, "IS-GLOBAL", base.getIsDefault())
|
|
2852
|
+
self.setChildElementOptionalBooleanValue(child_element, "BASE-IS-THIS-PACKAGE", base.getBaseIsThisPackage())
|
|
2853
|
+
self.setChildElementOptionalRefType(child_element, "PACKAGE-REF", base.getPackageRef())
|
|
2854
|
+
|
|
2803
2855
|
def writeARPackages(self, element: ET.Element, pkgs: List[ARPackage]):
|
|
2804
2856
|
if len(pkgs) > 0:
|
|
2805
2857
|
pkgs_tag = ET.SubElement(element, "AR-PACKAGES")
|
|
@@ -2810,6 +2862,8 @@ class ARXMLWriter(AbstractARXMLWriter):
|
|
|
2810
2862
|
self.setIdentifiable(pkg_tag, pkg)
|
|
2811
2863
|
self.logger.debug("writeARPackage %s" % pkg.full_name)
|
|
2812
2864
|
|
|
2865
|
+
self.writeReferenceBases(pkg_tag, pkg.getReferenceBases())
|
|
2866
|
+
|
|
2813
2867
|
if pkg.getTotalElement() > 0:
|
|
2814
2868
|
elements_tag = ET.SubElement(pkg_tag, "ELEMENTS")
|
|
2815
2869
|
|
|
@@ -2818,6 +2872,7 @@ class ARXMLWriter(AbstractARXMLWriter):
|
|
|
2818
2872
|
self.writeARPackageElement(elements_tag, ar_element)
|
|
2819
2873
|
|
|
2820
2874
|
self.writeARPackages(pkg_tag, pkg.getARPackages())
|
|
2875
|
+
|
|
2821
2876
|
|
|
2822
2877
|
def save(self, filename, document: AUTOSAR):
|
|
2823
2878
|
self.logger.info("Save %s ..." % filename)
|
|
@@ -2826,6 +2881,7 @@ class ARXMLWriter(AbstractARXMLWriter):
|
|
|
2826
2881
|
root.attrib["xmlns:xsi"] = "http://www.w3.org/2001/XMLSchema-instance"
|
|
2827
2882
|
root.attrib["xsi:schemaLocation"] = document.schema_location
|
|
2828
2883
|
|
|
2884
|
+
self.setAdminData(root, document.getAdminData())
|
|
2829
2885
|
self.writeARPackages(root, document.getARPackages())
|
|
2830
2886
|
|
|
2831
2887
|
self.saveToFile(filename, root)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: armodel
|
|
3
|
-
Version: 1.7.
|
|
3
|
+
Version: 1.7.1
|
|
4
4
|
Summary: the python arxml parser
|
|
5
5
|
Home-page: http://github.com/melodypapa/py-armodel
|
|
6
6
|
Author: melodypapa
|
|
@@ -383,3 +383,11 @@ Fix the attribute intervalType of **Limit** is empty issue.
|
|
|
383
383
|
* DATA-FILTER
|
|
384
384
|
* EVENT-CONTROLLED-TIMING
|
|
385
385
|
|
|
386
|
+
**Version 1.7.1**
|
|
387
|
+
|
|
388
|
+
1. To support the following AR Element:
|
|
389
|
+
* INTRODUCTION
|
|
390
|
+
* LIST
|
|
391
|
+
* SW-INTENDED-RESOLUTION
|
|
392
|
+
* REFERENCE-BASE
|
|
393
|
+
|