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.
Files changed (69) hide show
  1. armodel/cli/arxml_dump_cli.py +33 -22
  2. armodel/cli/arxml_format_cli.py +25 -13
  3. armodel/models/M2/AUTOSARTemplates/AutosarTopLevelStructure.py +95 -21
  4. armodel/models/M2/AUTOSARTemplates/BswModuleTemplate/BswBehavior.py +359 -59
  5. armodel/models/M2/AUTOSARTemplates/BswModuleTemplate/BswOverview.py +134 -35
  6. armodel/models/M2/AUTOSARTemplates/CommonStructure/Filter.py +17 -7
  7. armodel/models/M2/AUTOSARTemplates/CommonStructure/InternalBehavior.py +10 -1
  8. armodel/models/M2/AUTOSARTemplates/CommonStructure/TriggerDeclaration.py +18 -2
  9. armodel/models/M2/AUTOSARTemplates/ECUCDescriptionTemplate.py +20 -19
  10. armodel/models/M2/AUTOSARTemplates/EcuResourceTemplate/HwElementCategory.py +59 -0
  11. armodel/models/M2/AUTOSARTemplates/EcuResourceTemplate/__init__.py +145 -0
  12. armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/ARPackage.py +215 -157
  13. armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/Identifiable.py +69 -35
  14. armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/PrimitiveTypes.py +17 -1
  15. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Communication.py +19 -5
  16. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Components/__init__.py +113 -39
  17. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Composition/__init__.py +3 -2
  18. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Datatype/DataPrototypes.py +41 -16
  19. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Datatype/Datatypes.py +10 -3
  20. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/EndToEndProtection.py +13 -6
  21. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/PortInterface/__init__.py +111 -38
  22. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/AccessCount.py +9 -1
  23. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/ModeDeclarationGroup.py +5 -4
  24. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/RTEEvents.py +26 -8
  25. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/__init__.py +28 -6
  26. armodel/models/M2/AUTOSARTemplates/SystemTemplate/DataMapping.py +167 -5
  27. armodel/models/M2/AUTOSARTemplates/SystemTemplate/DoIp.py +29 -0
  28. armodel/models/M2/AUTOSARTemplates/SystemTemplate/EcuResourceMapping.py +45 -0
  29. armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Can/CanTopology.py +31 -21
  30. armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Ethernet/EthernetFrame.py +5 -3
  31. armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Ethernet/EthernetTopology.py +9 -0
  32. armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Flexray/FlexrayCommunication.py +76 -0
  33. armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Flexray/FlexrayTopology.py +654 -0
  34. armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Flexray/__init__.py +0 -0
  35. armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/FibexCore/CoreCommunication.py +539 -77
  36. armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/FibexCore/CoreTopology.py +158 -40
  37. armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/FibexCore/EcuInstance.py +28 -6
  38. armodel/models/M2/AUTOSARTemplates/SystemTemplate/InstanceRefs.py +2 -0
  39. armodel/models/M2/AUTOSARTemplates/SystemTemplate/NetworkManagement.py +245 -130
  40. armodel/models/M2/AUTOSARTemplates/SystemTemplate/SWmapping.py +27 -0
  41. armodel/models/M2/AUTOSARTemplates/SystemTemplate/Transformer/__init__.py +524 -0
  42. armodel/models/M2/AUTOSARTemplates/SystemTemplate/TransportProtocols.py +592 -17
  43. armodel/models/M2/AUTOSARTemplates/SystemTemplate/__init__.py +33 -21
  44. armodel/models/M2/MSR/AsamHdo/AdminData.py +1 -2
  45. armodel/models/M2/MSR/AsamHdo/ComputationMethod.py +3 -1
  46. armodel/models/M2/MSR/AsamHdo/SpecialData.py +35 -8
  47. armodel/models/M2/MSR/DataDictionary/RecordLayout.py +0 -3
  48. armodel/models/__init__.py +8 -0
  49. armodel/parser/abstract_arxml_parser.py +34 -27
  50. armodel/parser/arxml_parser.py +1778 -616
  51. armodel/parser/file_parser.py +5 -3
  52. armodel/tests/test_armodel/models/test_ar_package.py +6 -11
  53. armodel/tests/test_armodel/models/test_bsw_module_template.py +5 -3
  54. armodel/tests/test_armodel/models/test_datatype.py +1 -1
  55. armodel/tests/test_armodel/models/test_port_interface.py +116 -117
  56. armodel/tests/test_armodel/parser/test_bsw_module_descriiption.py +218 -0
  57. armodel/tests/test_armodel/parser/test_sw_components.py +54 -22
  58. armodel/tests/test_armodel/parser/test_system.py +2 -8
  59. armodel/transformer/__init__.py +0 -0
  60. armodel/transformer/abstract.py +6 -0
  61. armodel/transformer/admin_data.py +31 -0
  62. armodel/writer/abstract_arxml_writer.py +27 -33
  63. armodel/writer/arxml_writer.py +1875 -599
  64. {armodel-1.7.6.dist-info → armodel-1.7.8.dist-info}/METADATA +81 -3
  65. {armodel-1.7.6.dist-info → armodel-1.7.8.dist-info}/RECORD +69 -56
  66. {armodel-1.7.6.dist-info → armodel-1.7.8.dist-info}/LICENSE +0 -0
  67. {armodel-1.7.6.dist-info → armodel-1.7.8.dist-info}/WHEEL +0 -0
  68. {armodel-1.7.6.dist-info → armodel-1.7.8.dist-info}/entry_points.txt +0 -0
  69. {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
- from ....models.M2.AUTOSARTemplates.SWComponentTemplate.Components import CompositionSwComponentType
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
- prototypes = sw_component.getPortPrototypes()
27
- assert(len(prototypes) == 2)
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 test_bswm_mode_arxml_loading_and_saving(self):
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
- #assert(filecmp.cmp("test_files/AUTOSAR_MOD_AISpecification_ApplicationDataType_Blueprint.arxml", "data/generated_AUTOSAR_MOD_AISpecification_ApplicationDataType_Blueprint.arxml", shallow = False) == True)
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 = False) == True)
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,6 @@
1
+ class AbstractTransformer():
2
+ def __init__(self):
3
+ pass
4
+
5
+ def remove(self):
6
+ pass
@@ -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, RefType, ARBoolean
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 = None) -> None:
17
- if type(self) == AbstractARXMLWriter:
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'] == True):
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'] == True):
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 setARObjectAttributes(self, element: ET.Element, ar_obj: ARObject):
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.setARObjectAttributes(child_element, numerical)
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.setARObjectAttributes(child_element, value)
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.setARObjectAttributes(child_element, value)
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.setARObjectAttributes(child_element, value)
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"<(([\w-]+)\s+\w+=\"[\w-]+\")\/>", r"<\1></\2>", xml)
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"&quot;", '"', 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 = "UTF-8", short_empty_elements = False)
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 = "UTF-8", xml_declaration = True, short_empty_elements = False)
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 = " ", encoding = "UTF-8")
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)