armodel 1.7.6__py3-none-any.whl → 1.7.8__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/cli/arxml_dump_cli.py +33 -22
- armodel/cli/arxml_format_cli.py +25 -13
- armodel/models/M2/AUTOSARTemplates/AutosarTopLevelStructure.py +95 -21
- armodel/models/M2/AUTOSARTemplates/BswModuleTemplate/BswBehavior.py +359 -59
- armodel/models/M2/AUTOSARTemplates/BswModuleTemplate/BswOverview.py +134 -35
- armodel/models/M2/AUTOSARTemplates/CommonStructure/Filter.py +17 -7
- armodel/models/M2/AUTOSARTemplates/CommonStructure/InternalBehavior.py +10 -1
- armodel/models/M2/AUTOSARTemplates/CommonStructure/TriggerDeclaration.py +18 -2
- armodel/models/M2/AUTOSARTemplates/ECUCDescriptionTemplate.py +20 -19
- armodel/models/M2/AUTOSARTemplates/EcuResourceTemplate/HwElementCategory.py +59 -0
- armodel/models/M2/AUTOSARTemplates/EcuResourceTemplate/__init__.py +145 -0
- armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/ARPackage.py +215 -157
- armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/Identifiable.py +69 -35
- armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/PrimitiveTypes.py +17 -1
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Communication.py +19 -5
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Components/__init__.py +113 -39
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Composition/__init__.py +3 -2
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Datatype/DataPrototypes.py +41 -16
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Datatype/Datatypes.py +10 -3
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/EndToEndProtection.py +13 -6
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/PortInterface/__init__.py +111 -38
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/AccessCount.py +9 -1
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/ModeDeclarationGroup.py +5 -4
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/RTEEvents.py +26 -8
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/__init__.py +28 -6
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/DataMapping.py +167 -5
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/DoIp.py +29 -0
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/EcuResourceMapping.py +45 -0
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Can/CanTopology.py +31 -21
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Ethernet/EthernetFrame.py +5 -3
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Ethernet/EthernetTopology.py +9 -0
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Flexray/FlexrayCommunication.py +76 -0
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Flexray/FlexrayTopology.py +654 -0
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Flexray/__init__.py +0 -0
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/FibexCore/CoreCommunication.py +539 -77
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/FibexCore/CoreTopology.py +158 -40
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/FibexCore/EcuInstance.py +28 -6
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/InstanceRefs.py +2 -0
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/NetworkManagement.py +245 -130
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/SWmapping.py +27 -0
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Transformer/__init__.py +524 -0
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/TransportProtocols.py +592 -17
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/__init__.py +33 -21
- armodel/models/M2/MSR/AsamHdo/AdminData.py +1 -2
- armodel/models/M2/MSR/AsamHdo/ComputationMethod.py +3 -1
- armodel/models/M2/MSR/AsamHdo/SpecialData.py +35 -8
- armodel/models/M2/MSR/DataDictionary/RecordLayout.py +0 -3
- armodel/models/__init__.py +8 -0
- armodel/parser/abstract_arxml_parser.py +34 -27
- armodel/parser/arxml_parser.py +1778 -616
- armodel/parser/file_parser.py +5 -3
- armodel/tests/test_armodel/models/test_ar_package.py +6 -11
- armodel/tests/test_armodel/models/test_bsw_module_template.py +5 -3
- armodel/tests/test_armodel/models/test_datatype.py +1 -1
- armodel/tests/test_armodel/models/test_port_interface.py +116 -117
- armodel/tests/test_armodel/parser/test_bsw_module_descriiption.py +218 -0
- armodel/tests/test_armodel/parser/test_sw_components.py +54 -22
- armodel/tests/test_armodel/parser/test_system.py +2 -8
- armodel/transformer/__init__.py +0 -0
- armodel/transformer/abstract.py +6 -0
- armodel/transformer/admin_data.py +31 -0
- armodel/writer/abstract_arxml_writer.py +27 -33
- armodel/writer/arxml_writer.py +1875 -599
- {armodel-1.7.6.dist-info → armodel-1.7.8.dist-info}/METADATA +81 -3
- {armodel-1.7.6.dist-info → armodel-1.7.8.dist-info}/RECORD +69 -56
- {armodel-1.7.6.dist-info → armodel-1.7.8.dist-info}/LICENSE +0 -0
- {armodel-1.7.6.dist-info → armodel-1.7.8.dist-info}/WHEEL +0 -0
- {armodel-1.7.6.dist-info → armodel-1.7.8.dist-info}/entry_points.txt +0 -0
- {armodel-1.7.6.dist-info → armodel-1.7.8.dist-info}/top_level.txt +0 -0
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import filecmp
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
from ....models.M2.AUTOSARTemplates.CommonStructure.InternalBehavior import InternalBehavior
|
|
4
|
+
from ....models.M2.AUTOSARTemplates.SWComponentTemplate.SwcImplementation import SwcImplementation
|
|
5
|
+
from ....models.M2.AUTOSARTemplates.SWComponentTemplate.Components import AtomicSwComponentType, CompositionSwComponentType
|
|
3
6
|
from ....writer.arxml_writer import ARXMLWriter
|
|
4
7
|
from ....parser.arxml_parser import ARXMLParser
|
|
5
8
|
from ....models.M2.AUTOSARTemplates.AutosarTopLevelStructure import AUTOSAR
|
|
@@ -15,43 +18,61 @@ class TestSWComponents:
|
|
|
15
18
|
document = AUTOSAR.getInstance()
|
|
16
19
|
root_pkgs = sorted(document.getARPackages(), key = lambda pkg: pkg.getShortName())
|
|
17
20
|
|
|
18
|
-
assert(len(root_pkgs) == 1)
|
|
19
|
-
assert("DemoApplication" == root_pkgs[0].getShortName())
|
|
21
|
+
assert (len(root_pkgs) == 1)
|
|
22
|
+
assert ("DemoApplication" == root_pkgs[0].getShortName())
|
|
23
|
+
|
|
24
|
+
def test_sw_component(self):
|
|
25
|
+
document = AUTOSAR.getInstance()
|
|
26
|
+
sw_component = document.find("/DemoApplication/SwComponentTypes/SWC_CyclicCounter")
|
|
27
|
+
assert (sw_component.getShortName() == 'SWC_CyclicCounter')
|
|
28
|
+
assert (isinstance(sw_component, AtomicSwComponentType))
|
|
29
|
+
|
|
30
|
+
def test_get_implementation(self):
|
|
31
|
+
document = AUTOSAR.getInstance()
|
|
32
|
+
impl = document.getImplementation("/DemoApplication/SwComponentTypes/SWC_CyclicCounter/IB_SWC_CyclicCounter")
|
|
33
|
+
assert (impl.getFullName() == "/DemoApplication/SwcImplementations/Impl_SWC_CyclicCounter")
|
|
34
|
+
assert (isinstance(impl, SwcImplementation))
|
|
35
|
+
|
|
36
|
+
def test_get_behavior(self):
|
|
37
|
+
document = AUTOSAR.getInstance()
|
|
38
|
+
behavior = document.getBehavior("/DemoApplication/SwcImplementations/Impl_SWC_CyclicCounter")
|
|
39
|
+
assert (behavior.getFullName() == "/DemoApplication/SwComponentTypes/SWC_CyclicCounter/IB_SWC_CyclicCounter")
|
|
40
|
+
assert (isinstance(behavior, InternalBehavior))
|
|
20
41
|
|
|
21
42
|
def test_composition_sw_component_types(self):
|
|
22
43
|
document = AUTOSAR.getInstance()
|
|
23
|
-
sw_component = document.find("/DemoApplication/SwComponentTypes/TopLevelComposition")
|
|
24
|
-
assert(sw_component.short_name == "TopLevelComposition")
|
|
25
|
-
assert(isinstance(sw_component, CompositionSwComponentType))
|
|
26
|
-
|
|
27
|
-
assert(len(
|
|
44
|
+
sw_component = document.find("/DemoApplication/SwComponentTypes/TopLevelComposition")
|
|
45
|
+
assert (sw_component.short_name == "TopLevelComposition")
|
|
46
|
+
assert (isinstance(sw_component, CompositionSwComponentType))
|
|
47
|
+
ports = sw_component.getPorts()
|
|
48
|
+
assert (len(ports) == 2)
|
|
28
49
|
|
|
29
50
|
def test_composition_sw_component_types_sw_connectors(self):
|
|
30
51
|
document = AUTOSAR.getInstance()
|
|
31
|
-
sw_component = document.find("/DemoApplication/SwComponentTypes/TopLevelComposition")
|
|
32
|
-
assert(isinstance(sw_component, CompositionSwComponentType))
|
|
33
|
-
assert(len(sw_component.getSwConnectors()) == 6)
|
|
34
|
-
assert(len(sw_component.getAssemblySwConnectors()) == 3)
|
|
35
|
-
assert(len(sw_component.getDelegationSwConnectors()) == 3)
|
|
52
|
+
sw_component = document.find("/DemoApplication/SwComponentTypes/TopLevelComposition")
|
|
53
|
+
assert (isinstance(sw_component, CompositionSwComponentType))
|
|
54
|
+
assert (len(sw_component.getSwConnectors()) == 6)
|
|
55
|
+
assert (len(sw_component.getAssemblySwConnectors()) == 3)
|
|
56
|
+
assert (len(sw_component.getDelegationSwConnectors()) == 3)
|
|
36
57
|
|
|
37
58
|
connector_name_list = set()
|
|
38
59
|
for sw_connector in sw_component.getAssemblySwConnectors():
|
|
39
60
|
connector_name_list.add(sw_connector.short_name)
|
|
40
61
|
|
|
41
|
-
assert(connector_name_list == set(['a6a18805580c94537a4c82f6c289a4d', 'ac681652833fb4b12b920adab33a73b', 'ac681652833fb4b12b920adab33a73c']))
|
|
62
|
+
assert (connector_name_list == set(['a6a18805580c94537a4c82f6c289a4d', 'ac681652833fb4b12b920adab33a73b', 'ac681652833fb4b12b920adab33a73c']))
|
|
42
63
|
|
|
43
64
|
sw_component.removeElement("a6a18805580c94537a4c82f6c289a4d")
|
|
44
|
-
assert(len(sw_component.getAssemblySwConnectors()) == 2)
|
|
65
|
+
assert (len(sw_component.getAssemblySwConnectors()) == 2)
|
|
45
66
|
|
|
46
67
|
# remove all the AssemblySwConnector
|
|
47
68
|
sw_component.removeAllAssemblySwConnector()
|
|
48
|
-
assert(len(sw_component.getAssemblySwConnectors()) == 0)
|
|
49
|
-
assert(len(sw_component.getDelegationSwConnectors()) == 3)
|
|
69
|
+
assert (len(sw_component.getAssemblySwConnectors()) == 0)
|
|
70
|
+
assert (len(sw_component.getDelegationSwConnectors()) == 3)
|
|
50
71
|
|
|
51
72
|
# remove all the DelegationSwConnector
|
|
52
73
|
sw_component.removeAllDelegationSwConnector()
|
|
53
|
-
assert(len(sw_component.getAssemblySwConnectors()) == 0)
|
|
54
|
-
assert(len(sw_component.getDelegationSwConnectors()) == 0)
|
|
74
|
+
assert (len(sw_component.getAssemblySwConnectors()) == 0)
|
|
75
|
+
assert (len(sw_component.getDelegationSwConnectors()) == 0)
|
|
55
76
|
|
|
56
77
|
def test_bswm_mode_arxml_loading_and_saving(self):
|
|
57
78
|
document = AUTOSAR.getInstance()
|
|
@@ -62,9 +83,20 @@ class TestSWComponents:
|
|
|
62
83
|
writer = ARXMLWriter()
|
|
63
84
|
writer.save("data/generated_AUTOSAR_Datatypes.arxml", document)
|
|
64
85
|
|
|
65
|
-
assert(filecmp.cmp("src/armodel/tests/test_files/BswMMode.arxml", "data/generated_AUTOSAR_Datatypes.arxml", shallow = False) == True)
|
|
86
|
+
assert (filecmp.cmp("src/armodel/tests/test_files/BswMMode.arxml", "data/generated_AUTOSAR_Datatypes.arxml", shallow = False) == True)
|
|
66
87
|
|
|
67
|
-
def
|
|
88
|
+
def test_sw_record_demo_arxml_loading_and_saving(self):
|
|
89
|
+
document = AUTOSAR.getInstance()
|
|
90
|
+
document.clear()
|
|
91
|
+
parser = ARXMLParser()
|
|
92
|
+
parser.load("src/armodel/tests/test_files/SwRecordDemo.arxml", document)
|
|
93
|
+
|
|
94
|
+
writer = ARXMLWriter()
|
|
95
|
+
writer.save("data/generated_SwRecordDemo.arxml", document)
|
|
96
|
+
|
|
97
|
+
assert (filecmp.cmp("src/armodel/tests/test_files/SwRecordDemo.arxml", "data/generated_SwRecordDemo.arxml", shallow = False) == True)
|
|
98
|
+
|
|
99
|
+
def test_application_data_type_blueprint_arxml_loading_and_saving(self):
|
|
68
100
|
document = AUTOSAR.getInstance()
|
|
69
101
|
document.clear()
|
|
70
102
|
parser = ARXMLParser()
|
|
@@ -73,7 +105,7 @@ class TestSWComponents:
|
|
|
73
105
|
writer = ARXMLWriter()
|
|
74
106
|
writer.save("data/generated_AUTOSAR_MOD_AISpecification_ApplicationDataType_Blueprint.arxml", document)
|
|
75
107
|
|
|
76
|
-
|
|
108
|
+
assert (filecmp.cmp("test_files/AUTOSAR_MOD_AISpecification_ApplicationDataType_Blueprint.arxml", "data/generated_AUTOSAR_MOD_AISpecification_ApplicationDataType_Blueprint.arxml", shallow = False) == True)
|
|
77
109
|
|
|
78
110
|
|
|
79
111
|
|
|
@@ -3,13 +3,13 @@ from ....writer.arxml_writer import ARXMLWriter
|
|
|
3
3
|
from ....parser.arxml_parser import ARXMLParser
|
|
4
4
|
from ....models.M2.AUTOSARTemplates.AutosarTopLevelStructure import AUTOSAR
|
|
5
5
|
|
|
6
|
+
|
|
6
7
|
class TestSystemTemplate:
|
|
7
8
|
def setup_method(self):
|
|
8
9
|
document = AUTOSAR.getInstance()
|
|
9
10
|
document.clear()
|
|
10
11
|
parser = ARXMLParser()
|
|
11
12
|
parser.load("src/armodel/tests/test_files/CanSystem.arxml", document)
|
|
12
|
-
|
|
13
13
|
|
|
14
14
|
def test_can_system_arxml_loading_and_saving(self):
|
|
15
15
|
document = AUTOSAR.getInstance()
|
|
@@ -20,10 +20,4 @@ class TestSystemTemplate:
|
|
|
20
20
|
writer = ARXMLWriter()
|
|
21
21
|
writer.save("data/generated_CanSystem.arxml", document)
|
|
22
22
|
|
|
23
|
-
assert(filecmp.cmp("src/armodel/tests/test_files/CanSystem.arxml", "data/generated_CanSystem.arxml", shallow
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
23
|
+
assert (filecmp.cmp("src/armodel/tests/test_files/CanSystem.arxml", "data/generated_CanSystem.arxml", shallow=False) is True)
|
|
File without changes
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.ARPackage import ARPackage
|
|
3
|
+
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.Identifiable import Describable, Identifiable
|
|
4
|
+
from ..models.M2.AUTOSARTemplates.AutosarTopLevelStructure import AUTOSAR
|
|
5
|
+
from ..transformer.abstract import AbstractTransformer
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AdminDataTransformer(AbstractTransformer):
|
|
9
|
+
def __init__(self):
|
|
10
|
+
super().__init__()
|
|
11
|
+
self.logger = logging.getLogger()
|
|
12
|
+
|
|
13
|
+
def process_pkg(self, pkg: ARPackage):
|
|
14
|
+
for sub_package in pkg.getARPackages():
|
|
15
|
+
self.process_pkg(sub_package)
|
|
16
|
+
|
|
17
|
+
self.logger.debug("Remove AdminData of <%s>", pkg.getShortName())
|
|
18
|
+
pkg.removeAdminData()
|
|
19
|
+
|
|
20
|
+
for element in pkg.getElements():
|
|
21
|
+
if isinstance(element, Describable):
|
|
22
|
+
self.logger.debug("Remove AdminData of <%s>", element.getShortName())
|
|
23
|
+
element.removeAdminData()
|
|
24
|
+
elif isinstance(element, Identifiable):
|
|
25
|
+
self.logger.debug("Remove AdminData of <%s>", element.getShortName())
|
|
26
|
+
element.removeAdminData()
|
|
27
|
+
|
|
28
|
+
def remove(self, root: AUTOSAR):
|
|
29
|
+
root.removeAdminData()
|
|
30
|
+
for pkg in root.getARPackages():
|
|
31
|
+
self.process_pkg(pkg)
|
|
@@ -8,13 +8,15 @@ import logging
|
|
|
8
8
|
import xml.etree.cElementTree as ET
|
|
9
9
|
|
|
10
10
|
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.ArObject import ARObject
|
|
11
|
-
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.PrimitiveTypes import ARFloat, ARLiteral, ARNumerical, Integer, TimeValue
|
|
11
|
+
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.PrimitiveTypes import ARFloat, ARLiteral, ARNumerical, Integer, TimeValue
|
|
12
|
+
from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.PrimitiveTypes import RefType, ARBoolean
|
|
13
|
+
|
|
12
14
|
|
|
13
15
|
class AbstractARXMLWriter:
|
|
14
16
|
__metaclass__ = ABCMeta
|
|
15
17
|
|
|
16
|
-
def __init__(self, options
|
|
17
|
-
if type(self)
|
|
18
|
+
def __init__(self, options=None) -> None:
|
|
19
|
+
if type(self) is AbstractARXMLWriter:
|
|
18
20
|
raise NotImplementedError("AbstractARXMLWriter is an abstract class.")
|
|
19
21
|
|
|
20
22
|
self.options = {}
|
|
@@ -25,7 +27,7 @@ class AbstractARXMLWriter:
|
|
|
25
27
|
self._processOptions(options=options)
|
|
26
28
|
|
|
27
29
|
self.nsmap = {
|
|
28
|
-
"xmlns": "http://autosar.org/schema/r4.0",
|
|
30
|
+
"xmlns": "http://autosar.org/schema/r4.0",
|
|
29
31
|
}
|
|
30
32
|
|
|
31
33
|
def _processOptions(self, options):
|
|
@@ -34,23 +36,23 @@ class AbstractARXMLWriter:
|
|
|
34
36
|
self.options['warning'] = options['warning']
|
|
35
37
|
|
|
36
38
|
def _raiseError(self, error_msg):
|
|
37
|
-
if (self.options['warning']
|
|
39
|
+
if (self.options['warning'] is True):
|
|
38
40
|
self.logger.error(Fore.RED + error_msg + Fore.WHITE)
|
|
39
41
|
else:
|
|
40
42
|
raise ValueError(error_msg)
|
|
41
43
|
|
|
42
44
|
def notImplemented(self, error_msg):
|
|
43
|
-
if (self.options['warning']
|
|
45
|
+
if (self.options['warning'] is True):
|
|
44
46
|
self.logger.error(Fore.RED + error_msg + Fore.WHITE)
|
|
45
47
|
else:
|
|
46
48
|
raise NotImplementedError(error_msg)
|
|
47
49
|
|
|
48
|
-
def
|
|
50
|
+
def writeARObjectAttributes(self, element: ET.Element, ar_obj: ARObject):
|
|
49
51
|
if ar_obj.timestamp is not None:
|
|
50
|
-
self.logger.debug("Timestamp: %s" % ar_obj.timestamp)
|
|
52
|
+
# self.logger.debug("Timestamp: %s" % ar_obj.timestamp)
|
|
51
53
|
element.attrib['T'] = ar_obj.timestamp
|
|
52
54
|
if ar_obj.uuid is not None:
|
|
53
|
-
self.logger.debug("UUID: %s" % ar_obj.uuid)
|
|
55
|
+
# self.logger.debug("UUID: %s" % ar_obj.uuid)
|
|
54
56
|
element.attrib['UUID'] = ar_obj.uuid
|
|
55
57
|
|
|
56
58
|
'''
|
|
@@ -70,7 +72,7 @@ class AbstractARXMLWriter:
|
|
|
70
72
|
def setChildElementOptionalNumericalValue(self, element: ET.Element, key: str, numerical: ARNumerical):
|
|
71
73
|
if numerical is not None:
|
|
72
74
|
child_element = ET.SubElement(element, key)
|
|
73
|
-
self.
|
|
75
|
+
self.writeARObjectAttributes(child_element, numerical)
|
|
74
76
|
child_element.text = numerical._text
|
|
75
77
|
|
|
76
78
|
def setChildElementOptionalIntegerValue(self, element: ET.Element, key: str, value: Integer):
|
|
@@ -78,14 +80,7 @@ class AbstractARXMLWriter:
|
|
|
78
80
|
|
|
79
81
|
def setChildElementOptionalPositiveInteger(self, element: ET.Element, key: str, value: Integer):
|
|
80
82
|
self.setChildElementOptionalNumericalValue(element, key, value)
|
|
81
|
-
|
|
82
|
-
def setChildElementOptionalLiteral(self, element: ET.Element, key: str, literal: ARLiteral):
|
|
83
|
-
if literal is not None:
|
|
84
|
-
child_element = ET.SubElement(element, key)
|
|
85
|
-
self.setARObjectAttributes(child_element, literal)
|
|
86
|
-
if literal._value is not None:
|
|
87
|
-
child_element.text = str(literal._value)
|
|
88
|
-
|
|
83
|
+
|
|
89
84
|
def setChildElementOptionalRevisionLabelString(self, element: ET.Element, key: str, literal: ARLiteral):
|
|
90
85
|
self.setChildElementOptionalLiteral(element, key, literal)
|
|
91
86
|
|
|
@@ -104,44 +99,43 @@ class AbstractARXMLWriter:
|
|
|
104
99
|
def setChildElementOptionalFloatValue(self, element: ET.Element, key: str, value: ARFloat):
|
|
105
100
|
if value is not None:
|
|
106
101
|
child_element = ET.SubElement(element, key)
|
|
107
|
-
self.
|
|
102
|
+
self.writeARObjectAttributes(child_element, value)
|
|
108
103
|
child_element.text = value.getText()
|
|
109
104
|
|
|
110
105
|
def setChildElementOptionalTimeValue(self, element: ET.Element, key: str, value: TimeValue):
|
|
111
106
|
self.setChildElementOptionalFloatValue(element, key, value)
|
|
112
107
|
|
|
113
108
|
def setChildElementOptionalBooleanValue(self, element: ET.Element, key: str, value: ARBoolean) -> ET.Element:
|
|
114
|
-
child_element = None
|
|
115
109
|
if value is not None:
|
|
116
110
|
child_element = ET.SubElement(element, key)
|
|
117
|
-
self.
|
|
111
|
+
self.writeARObjectAttributes(child_element, value)
|
|
118
112
|
child_element.text = value.getText()
|
|
119
113
|
return element
|
|
120
114
|
|
|
121
115
|
def setChildElementOptionalLiteral(self, element: ET.Element, key: str, value: ARLiteral) -> ET.Element:
|
|
122
|
-
child_element = None
|
|
123
116
|
if value is not None:
|
|
124
117
|
child_element = ET.SubElement(element, key)
|
|
125
|
-
self.
|
|
118
|
+
self.writeARObjectAttributes(child_element, value)
|
|
126
119
|
child_element.text = value.getText()
|
|
127
|
-
return element
|
|
128
|
-
|
|
120
|
+
return element
|
|
121
|
+
|
|
129
122
|
def patch_xml(self, xml: str) -> str:
|
|
130
|
-
xml = re.sub(r"\<([\w-]+)\/\>",r"<\1></\1>", xml)
|
|
131
|
-
xml = re.sub(r"<(
|
|
123
|
+
xml = re.sub(r"\<([\w-]+)\/\>", r"<\1></\1>", xml)
|
|
124
|
+
# xml = re.sub(r"<([\w-]+)\s+(\w+)=(\"[\w-]+\")\/>", r"<\1 \2=\3></\1>", xml)
|
|
125
|
+
# xml = re.sub(r""", '"', xml)
|
|
132
126
|
return xml
|
|
133
127
|
|
|
134
128
|
def saveToFile(self, filename, root: ET.Element):
|
|
135
|
-
if sys.version_info <= (3,9):
|
|
136
|
-
xml = ET.tostring(root, encoding
|
|
129
|
+
if sys.version_info <= (3, 9):
|
|
130
|
+
xml = ET.tostring(root, encoding="UTF-8", short_empty_elements=False)
|
|
137
131
|
else:
|
|
138
|
-
xml = ET.tostring(root, encoding
|
|
132
|
+
xml = ET.tostring(root, encoding="UTF-8", xml_declaration=True, short_empty_elements=False)
|
|
139
133
|
|
|
140
134
|
dom = minidom.parseString(xml.decode())
|
|
141
|
-
xml = dom.toprettyxml(indent
|
|
135
|
+
xml = dom.toprettyxml(indent=" ", encoding="UTF-8")
|
|
142
136
|
|
|
143
137
|
text = self.patch_xml(xml.decode())
|
|
144
138
|
|
|
145
139
|
with open(filename, "w", encoding="utf-8") as f_out:
|
|
146
|
-
#f_out.write(xml.decode())
|
|
147
|
-
f_out.write(text)
|
|
140
|
+
# f_out.write(xml.decode())
|
|
141
|
+
f_out.write(text)
|