armodel 1.3.0__py3-none-any.whl → 1.4.3__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/__init__.py +2 -1
- armodel/cli/arxml_dump_cli.py +8 -6
- armodel/cli/arxml_format_cli.py +72 -0
- armodel/cli/connector2xlsx_cli.py +75 -0
- armodel/cli/connector_update_cli.py +77 -0
- armodel/cli/swc_list_cli.py +2 -2
- armodel/data_models/__init__.py +0 -0
- armodel/data_models/sw_connector.py +22 -0
- armodel/lib/__init__.py +1 -1
- armodel/lib/sw_component.py +34 -0
- armodel/models/__init__.py +8 -2
- armodel/models/annotation.py +20 -0
- armodel/models/ar_object.py +184 -0
- armodel/models/ar_package.py +144 -14
- armodel/models/ar_ref.py +74 -8
- armodel/models/bsw_module_template.py +97 -25
- armodel/models/calibration.py +119 -0
- armodel/models/common_structure.py +203 -36
- armodel/models/communication.py +17 -0
- armodel/models/data_def_properties.py +16 -0
- armodel/models/data_dictionary.py +46 -9
- armodel/models/data_prototype.py +24 -5
- armodel/models/datatype.py +86 -19
- armodel/models/end_to_end_protection.py +67 -0
- armodel/models/general_structure.py +72 -17
- armodel/models/global_constraints.py +40 -0
- armodel/models/implementation.py +80 -32
- armodel/models/m2_msr.py +82 -6
- armodel/models/multilanguage_data.py +42 -0
- armodel/models/per_instance_memory.py +14 -0
- armodel/models/port_interface.py +27 -4
- armodel/models/port_prototype.py +48 -23
- armodel/models/record_layout.py +118 -0
- armodel/models/service_mapping.py +11 -0
- armodel/models/service_needs.py +48 -0
- armodel/models/sw_component.py +257 -43
- armodel/models/unit.py +14 -0
- armodel/parser/abstract_arxml_parser.py +248 -0
- armodel/parser/arxml_parser.py +1550 -648
- armodel/parser/connector_xlsx_parser.py +190 -0
- armodel/parser/excel_parser.py +18 -0
- armodel/report/__init__.py +1 -0
- armodel/report/connector_xls_report.py +76 -0
- armodel/report/excel_report.py +42 -0
- armodel/tests/__init__.py +0 -0
- armodel/tests/test_armodel/__init__.py +0 -0
- armodel/tests/test_armodel/models/__init__.py +0 -0
- armodel/tests/test_armodel/models/test_ar_object.py +152 -0
- armodel/tests/test_armodel/models/test_ar_package.py +294 -0
- armodel/tests/test_armodel/models/test_ar_ref.py +74 -0
- armodel/tests/test_armodel/models/test_bsw_module_template.py +46 -0
- armodel/tests/test_armodel/models/test_common_structure.py +73 -0
- armodel/tests/test_armodel/models/test_data_dictionary.py +29 -0
- armodel/tests/test_armodel/models/test_data_prototype.py +86 -0
- armodel/tests/test_armodel/models/test_datatype.py +239 -0
- armodel/tests/test_armodel/models/test_general_structure.py +50 -0
- armodel/tests/test_armodel/models/test_implementation.py +26 -0
- armodel/tests/test_armodel/models/test_m2_msr.py +77 -0
- armodel/tests/test_armodel/models/test_port_interface.py +198 -0
- armodel/tests/test_armodel/models/test_port_prototype.py +14 -0
- armodel/tests/test_armodel/parser/__init__.py +0 -0
- armodel/tests/test_armodel/parser/test_arxml_parser.py +15 -0
- armodel/tests/test_armodel/parser/test_parse_bswmd.py +192 -0
- armodel/tests/test_armodel/parser/test_sw_components.py +93 -0
- armodel/writer/__init__.py +1 -0
- armodel/writer/abstract_arxml_writer.py +123 -0
- armodel/writer/arxml_writer.py +1755 -0
- {armodel-1.3.0.dist-info → armodel-1.4.3.dist-info}/METADATA +124 -4
- armodel-1.4.3.dist-info/RECORD +78 -0
- armodel-1.4.3.dist-info/entry_points.txt +7 -0
- armodel-1.3.0.dist-info/RECORD +0 -31
- armodel-1.3.0.dist-info/entry_points.txt +0 -4
- {armodel-1.3.0.dist-info → armodel-1.4.3.dist-info}/LICENSE +0 -0
- {armodel-1.3.0.dist-info → armodel-1.4.3.dist-info}/WHEEL +0 -0
- {armodel-1.3.0.dist-info → armodel-1.4.3.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
from typing import Dict, List
|
|
2
|
+
from openpyxl import Workbook
|
|
3
|
+
from openpyxl.worksheet.worksheet import Worksheet
|
|
4
|
+
|
|
5
|
+
import openpyxl
|
|
6
|
+
import re
|
|
7
|
+
|
|
8
|
+
from ..parser.excel_parser import AbstractExcelParser
|
|
9
|
+
from ..data_models.sw_connector import AssemblySwConnectorData, DelegationSwConnectorData, SwConnectorData
|
|
10
|
+
from ..models.ar_ref import PPortInCompositionInstanceRef, RPortInCompositionInstanceRef, RefType
|
|
11
|
+
from ..models.sw_component import CompositionSwComponentType
|
|
12
|
+
from ..models.ar_package import AUTOSAR, ARPackage
|
|
13
|
+
|
|
14
|
+
class ConnectorXls:
|
|
15
|
+
|
|
16
|
+
COL_SHORT_NAME = 'Short Name'
|
|
17
|
+
COL_INNER_SW_C = 'Inner SW-C'
|
|
18
|
+
COL_INNER_PPORT = 'Inner PPort'
|
|
19
|
+
COL_OUTER_PPORT = 'Outer PPort'
|
|
20
|
+
COL_INNER_RPORT = 'Inner RPort'
|
|
21
|
+
COL_OUTER_RPORT = 'Outer RPort'
|
|
22
|
+
|
|
23
|
+
COL_PROVIDER_SW_C = "Provide SW-C"
|
|
24
|
+
COL_PPORT = "PPort"
|
|
25
|
+
COL_REQUESTER_SW_C = "Request SW-C"
|
|
26
|
+
COL_RPORT = "RPort"
|
|
27
|
+
|
|
28
|
+
class ConnectorXlsReader(AbstractExcelParser):
|
|
29
|
+
def __init__(self) -> None:
|
|
30
|
+
super().__init__()
|
|
31
|
+
|
|
32
|
+
self.column_delegation_sw_connectors = {
|
|
33
|
+
ConnectorXls.COL_SHORT_NAME: -1,
|
|
34
|
+
ConnectorXls.COL_INNER_SW_C: -1,
|
|
35
|
+
ConnectorXls.COL_INNER_PPORT: -1,
|
|
36
|
+
ConnectorXls.COL_OUTER_PPORT: -1,
|
|
37
|
+
ConnectorXls.COL_INNER_RPORT: -1,
|
|
38
|
+
ConnectorXls.COL_OUTER_RPORT: -1,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
self.column_assembly_sw_connectors = {
|
|
42
|
+
ConnectorXls.COL_SHORT_NAME: -1,
|
|
43
|
+
ConnectorXls.COL_PROVIDER_SW_C: -1,
|
|
44
|
+
ConnectorXls.COL_PPORT: -1,
|
|
45
|
+
ConnectorXls.COL_REQUESTER_SW_C: -1,
|
|
46
|
+
ConnectorXls.COL_RPORT: -1,
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
self.sw_connectors = {} # type: Dict[str, List[DelegationSwConnectorData]]
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def getCompositionSwComponentList(self) -> List[str]:
|
|
53
|
+
return self.sw_connectors.keys()
|
|
54
|
+
|
|
55
|
+
def getSwConnectorList(self, swc: str) -> List[SwConnectorData]:
|
|
56
|
+
if swc not in self.sw_connectors:
|
|
57
|
+
self.sw_connectors[swc] = []
|
|
58
|
+
return self.sw_connectors[swc]
|
|
59
|
+
#return sorted(self.sw_connectors[swc], key = lambda o: o.short_name)
|
|
60
|
+
|
|
61
|
+
def readDelegationSwConnectors(self, sheet: Worksheet, swc: str, start_row: int, column_list: Dict[str, int]):
|
|
62
|
+
connectors = self.getSwConnectorList(swc)
|
|
63
|
+
for row in sheet.iter_rows(min_row = start_row, values_only= True):
|
|
64
|
+
connector = DelegationSwConnectorData()
|
|
65
|
+
connector.short_name = row[column_list[ConnectorXls.COL_SHORT_NAME]]
|
|
66
|
+
connector.inner_swc = row[column_list[ConnectorXls.COL_INNER_SW_C]]
|
|
67
|
+
connector.inner_pport = row[column_list[ConnectorXls.COL_INNER_PPORT]]
|
|
68
|
+
connector.inner_rport = row[column_list[ConnectorXls.COL_INNER_RPORT]]
|
|
69
|
+
connector.outer_pport = row[column_list[ConnectorXls.COL_OUTER_PPORT]]
|
|
70
|
+
connector.outer_rport = row[column_list[ConnectorXls.COL_OUTER_RPORT]]
|
|
71
|
+
connectors.append(connector)
|
|
72
|
+
self._logger.debug("ShortName: %s" % connector.short_name)
|
|
73
|
+
|
|
74
|
+
def readAssemblySwConnectors(self, sheet: Worksheet, swc: str, start_row: int, column_list: Dict[str, int]):
|
|
75
|
+
connectors = self.getSwConnectorList(swc)
|
|
76
|
+
for row in sheet.iter_rows(min_row = start_row, values_only= True):
|
|
77
|
+
connector = AssemblySwConnectorData()
|
|
78
|
+
connector.short_name = row[column_list[ConnectorXls.COL_SHORT_NAME]]
|
|
79
|
+
connector.provider_swc = row[column_list[ConnectorXls.COL_PROVIDER_SW_C]]
|
|
80
|
+
connector.pport = row[column_list[ConnectorXls.COL_PPORT]]
|
|
81
|
+
connector.requester_swc = row[column_list[ConnectorXls.COL_REQUESTER_SW_C]]
|
|
82
|
+
connector.rport = row[column_list[ConnectorXls.COL_RPORT]]
|
|
83
|
+
connectors.append(connector)
|
|
84
|
+
self._logger.debug("ShortName: %s" % connector.short_name)
|
|
85
|
+
|
|
86
|
+
def parseDelegationSWConnectors(self, sheet: Worksheet, swc: str):
|
|
87
|
+
self._logger.debug("Parse all DelegationSwConnector of %s" % swc)
|
|
88
|
+
|
|
89
|
+
self.getColumnTitles(sheet, 1, self.column_delegation_sw_connectors)
|
|
90
|
+
self.checkColumnTitles(self.column_delegation_sw_connectors, "Invalid DelegationSwConnectors Excel and column <%s> cannot be located.")
|
|
91
|
+
self.readDelegationSwConnectors(sheet, swc, 2, self.column_delegation_sw_connectors)
|
|
92
|
+
|
|
93
|
+
def parseAssemblySWConnectors(self, sheet: Worksheet, swc: str):
|
|
94
|
+
self._logger.debug("Parse all AssemblySwConnector of %s" % swc)
|
|
95
|
+
|
|
96
|
+
self.getColumnTitles(sheet, 1, self.column_assembly_sw_connectors)
|
|
97
|
+
self.checkColumnTitles(self.column_assembly_sw_connectors, "Invalid AssemblySwConnectors Excel and column <%s> cannot be located.")
|
|
98
|
+
self.readAssemblySwConnectors(sheet, swc, 2, self.column_assembly_sw_connectors)
|
|
99
|
+
|
|
100
|
+
def read(self, excel_file: str):
|
|
101
|
+
self._logger.info("Parse excel file <%s>" % excel_file)
|
|
102
|
+
|
|
103
|
+
wb = openpyxl.load_workbook(excel_file, data_only=True)
|
|
104
|
+
|
|
105
|
+
for name in wb.sheetnames:
|
|
106
|
+
m = re.match(r'(\w+)\s+-\s+(AC|DC)', name)
|
|
107
|
+
if m:
|
|
108
|
+
if m.group(2) == "DC":
|
|
109
|
+
self.parseDelegationSWConnectors(wb[name], m.group(1))
|
|
110
|
+
elif m.group(2) == "AC":
|
|
111
|
+
self.parseAssemblySWConnectors(wb[name], m.group(1))
|
|
112
|
+
else:
|
|
113
|
+
raise ValueError("Invalid sheet")
|
|
114
|
+
|
|
115
|
+
def _addAssemblySwConnector(self, swc: CompositionSwComponentType, connector: AssemblySwConnectorData):
|
|
116
|
+
sw_connector = swc.createAssemblySwConnector(connector.short_name)
|
|
117
|
+
|
|
118
|
+
sw_connector.provider_iref = PPortInCompositionInstanceRef()
|
|
119
|
+
sw_connector.provider_iref.context_component_ref = RefType()
|
|
120
|
+
sw_connector.provider_iref.target_p_port_ref = RefType()
|
|
121
|
+
sw_connector.provider_iref.context_component_ref.dest = "SW-COMPONENT-PROTOTYPE"
|
|
122
|
+
sw_connector.provider_iref.context_component_ref.value = connector.provider_swc
|
|
123
|
+
sw_connector.provider_iref.target_p_port_ref.dest = "P-PORT-PROTOTYPE"
|
|
124
|
+
sw_connector.provider_iref.target_p_port_ref.value = connector.pport
|
|
125
|
+
|
|
126
|
+
sw_connector.requester_iref = RPortInCompositionInstanceRef()
|
|
127
|
+
sw_connector.requester_iref.context_component_ref = RefType()
|
|
128
|
+
sw_connector.requester_iref.target_r_port_ref = RefType()
|
|
129
|
+
sw_connector.requester_iref.context_component_ref.dest = "SW-COMPONENT-PROTOTYPE"
|
|
130
|
+
sw_connector.requester_iref.context_component_ref.value = connector.requester_swc
|
|
131
|
+
sw_connector.requester_iref.target_r_port_ref.dest = "R-PORT-PROTOTYPE"
|
|
132
|
+
sw_connector.requester_iref.target_r_port_ref.value = connector.rport
|
|
133
|
+
|
|
134
|
+
def _addDelegationSwConnector(self, swc: CompositionSwComponentType, connector: DelegationSwConnectorData):
|
|
135
|
+
sw_connector = swc.createDelegationSwConnector(connector.short_name)
|
|
136
|
+
if connector.inner_pport is not None and connector.outer_pport is not None:
|
|
137
|
+
sw_connector.inner_port_iref = PPortInCompositionInstanceRef()
|
|
138
|
+
sw_connector.inner_port_iref.context_component_ref = RefType()
|
|
139
|
+
sw_connector.inner_port_iref.target_p_port_ref = RefType()
|
|
140
|
+
sw_connector.outer_port_ref = RefType()
|
|
141
|
+
sw_connector.inner_port_iref.context_component_ref.dest = "SW-COMPONENT-PROTOTYPE"
|
|
142
|
+
sw_connector.inner_port_iref.context_component_ref.value = connector.inner_swc
|
|
143
|
+
sw_connector.inner_port_iref.target_p_port_ref.dest = "P-PORT-PROTOTYPE"
|
|
144
|
+
sw_connector.inner_port_iref.target_p_port_ref.value = connector.inner_pport
|
|
145
|
+
sw_connector.outer_port_ref.dest = "P-PORT-PROTOTYPE"
|
|
146
|
+
sw_connector.outer_port_ref.value = connector.outer_pport
|
|
147
|
+
elif connector.inner_rport is not None and connector.outer_rport is not None:
|
|
148
|
+
sw_connector.inner_port_iref = RPortInCompositionInstanceRef()
|
|
149
|
+
sw_connector.inner_port_iref.context_component_ref = RefType()
|
|
150
|
+
sw_connector.inner_port_iref.target_r_port_ref = RefType()
|
|
151
|
+
sw_connector.outer_port_ref = RefType()
|
|
152
|
+
sw_connector.inner_port_iref.context_component_ref.dest = "SW-COMPONENT-PROTOTYPE"
|
|
153
|
+
sw_connector.inner_port_iref.context_component_ref.value = connector.inner_swc
|
|
154
|
+
sw_connector.inner_port_iref.target_r_port_ref.dest = "R-PORT-PROTOTYPE"
|
|
155
|
+
sw_connector.inner_port_iref.target_r_port_ref.value = connector.inner_rport
|
|
156
|
+
sw_connector.outer_port_ref.dest = "R-PORT-PROTOTYPE"
|
|
157
|
+
sw_connector.outer_port_ref.value = connector.outer_rport
|
|
158
|
+
else:
|
|
159
|
+
raise ValueError("Invalid DelegationSwConnector Configuration")
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def _updateCompositionSwComponent(self, swc: CompositionSwComponentType):
|
|
163
|
+
# remove all the sw connector first
|
|
164
|
+
swc.removeAllAssemblySwConnector()
|
|
165
|
+
swc.removeAllDelegationSwConnector()
|
|
166
|
+
|
|
167
|
+
connectors = self.getSwConnectorList(swc.short_name)
|
|
168
|
+
|
|
169
|
+
for connector in connectors:
|
|
170
|
+
#self._logger.info("Update %s" % connector.short_name)
|
|
171
|
+
if isinstance(connector, AssemblySwConnectorData):
|
|
172
|
+
self._addAssemblySwConnector(swc, connector)
|
|
173
|
+
elif isinstance(connector, DelegationSwConnectorData):
|
|
174
|
+
self._addDelegationSwConnector(swc, connector)
|
|
175
|
+
else:
|
|
176
|
+
raise ValueError("Invalid connector information")
|
|
177
|
+
|
|
178
|
+
def _locateCompositionSwComponent(self, swc_name: str, parent: ARPackage):
|
|
179
|
+
for swc in parent.getSwComponentTypes():
|
|
180
|
+
if swc.short_name == swc_name:
|
|
181
|
+
self._updateCompositionSwComponent(swc)
|
|
182
|
+
for pkg in parent.getARPackages():
|
|
183
|
+
self._locateCompositionSwComponent(swc_name, pkg)
|
|
184
|
+
|
|
185
|
+
def update(self, document: AUTOSAR):
|
|
186
|
+
for name in self.getCompositionSwComponentList():
|
|
187
|
+
for pkg in document.getARPackages():
|
|
188
|
+
self._locateCompositionSwComponent(name, pkg)
|
|
189
|
+
|
|
190
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from typing import Dict
|
|
2
|
+
from openpyxl.worksheet.worksheet import Worksheet
|
|
3
|
+
|
|
4
|
+
import logging
|
|
5
|
+
class AbstractExcelParser:
|
|
6
|
+
def __init__(self) -> None:
|
|
7
|
+
self._logger = logging.getLogger()
|
|
8
|
+
|
|
9
|
+
def getColumnTitles(self, sheet: Worksheet, title_row:int, column_list: Dict[str, int]):
|
|
10
|
+
for column in range(1, sheet.max_column + 1):
|
|
11
|
+
value = sheet.cell(title_row, column).value
|
|
12
|
+
if value in column_list:
|
|
13
|
+
column_list[value] = column - 1
|
|
14
|
+
|
|
15
|
+
def checkColumnTitles(self, column_list: Dict[str, int], message: str):
|
|
16
|
+
for key, value in column_list.items():
|
|
17
|
+
if value == -1:
|
|
18
|
+
raise ValueError(message % key)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .connector_xls_report import ConnectorXlsReport
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
from .excel_report import ExcelReporter
|
|
2
|
+
from ..models import AUTOSAR, ARPackage, CompositionSwComponentType
|
|
3
|
+
from ..models import PPortInCompositionInstanceRef, RPortInCompositionInstanceRef
|
|
4
|
+
from typing import List
|
|
5
|
+
|
|
6
|
+
class ConnectorXlsReport(ExcelReporter):
|
|
7
|
+
def __init__(self) -> None:
|
|
8
|
+
super().__init__()
|
|
9
|
+
self.swcs = [] # type: List[CompositionSwComponentType]
|
|
10
|
+
|
|
11
|
+
def _parse_pkg(self, parent: ARPackage):
|
|
12
|
+
for pkg in parent.getARPackages():
|
|
13
|
+
self._parse_pkg(pkg)
|
|
14
|
+
for swc in parent.getSwComponentTypes():
|
|
15
|
+
self.swcs.append(swc)
|
|
16
|
+
|
|
17
|
+
def import_data(self, document: AUTOSAR):
|
|
18
|
+
for pkg in document.getARPackages():
|
|
19
|
+
self._parse_pkg(pkg)
|
|
20
|
+
|
|
21
|
+
def _write_assembly_sw_connection(self, swc: CompositionSwComponentType, index = 0):
|
|
22
|
+
sheet = self.wb.create_sheet("%s - AC" % swc.short_name, index)
|
|
23
|
+
title_row = ["Short Name", "Provide SW-C", "PPort", "Request SW-C", "RPort"]
|
|
24
|
+
self.write_title_row(sheet, title_row)
|
|
25
|
+
|
|
26
|
+
row = 2
|
|
27
|
+
for connector in swc.getAssemblySwConnectors():
|
|
28
|
+
self._logger.debug("Write AssemblySwConnection %s" % connector.short_name)
|
|
29
|
+
self.write_cell(sheet, row, 1, connector.short_name)
|
|
30
|
+
self.write_cell(sheet, row, 2, connector.provider_iref.context_component_ref.value)
|
|
31
|
+
self.write_cell(sheet, row, 3, connector.provider_iref.target_p_port_ref.value)
|
|
32
|
+
self.write_cell(sheet, row, 4, connector.requester_iref.context_component_ref.value)
|
|
33
|
+
self.write_cell(sheet, row, 5, connector.requester_iref.target_r_port_ref.value)
|
|
34
|
+
row += 1
|
|
35
|
+
|
|
36
|
+
self.auto_width(sheet)
|
|
37
|
+
|
|
38
|
+
def _write_delegation_sw_connection(self, swc: CompositionSwComponentType, index = 0):
|
|
39
|
+
sheet = self.wb.create_sheet("%s - DC" % swc.short_name, index)
|
|
40
|
+
title_row = ["Short Name", "Inner SW-C", "Inner PPort", "Outer PPort", "Inner RPort", "Outer RPort"]
|
|
41
|
+
self.write_title_row(sheet, title_row)
|
|
42
|
+
|
|
43
|
+
row = 2
|
|
44
|
+
for connector in swc.getDelegationSwConnectors():
|
|
45
|
+
self._logger.debug("Write DelegationSwConnection %s" % connector.short_name)
|
|
46
|
+
self.write_cell(sheet, row, 1, connector.short_name)
|
|
47
|
+
|
|
48
|
+
if connector.inner_port_iref:
|
|
49
|
+
if isinstance(connector.inner_port_iref, PPortInCompositionInstanceRef):
|
|
50
|
+
self.write_cell(sheet, row, 2, connector.inner_port_iref.context_component_ref.value)
|
|
51
|
+
self.write_cell(sheet, row, 3, connector.inner_port_iref.target_p_port_ref.value)
|
|
52
|
+
elif isinstance(connector.inner_port_iref, RPortInCompositionInstanceRef):
|
|
53
|
+
self.write_cell(sheet, row, 2, connector.inner_port_iref.context_component_ref.value)
|
|
54
|
+
self.write_cell(sheet, row, 5, connector.inner_port_iref.target_r_port_ref.value)
|
|
55
|
+
|
|
56
|
+
if connector.outer_port_ref.dest == "P-PORT-PROTOTYPE":
|
|
57
|
+
self.write_cell(sheet, row, 4, connector.outer_port_ref.value)
|
|
58
|
+
elif connector.outer_port_ref.dest == "R-PORT-PROTOTYPE":
|
|
59
|
+
self.write_cell(sheet, row, 6, connector.outer_port_ref.value)
|
|
60
|
+
else:
|
|
61
|
+
raise ValueError("Invalid OUTER-PORT-REF of SwConnector <%s>" % connector.short_name)
|
|
62
|
+
row += 1
|
|
63
|
+
|
|
64
|
+
self.auto_width(sheet)
|
|
65
|
+
|
|
66
|
+
def write(self, filename: str):
|
|
67
|
+
swc_list = filter(lambda o: isinstance(o, CompositionSwComponentType), self.swcs)
|
|
68
|
+
|
|
69
|
+
idx = 1
|
|
70
|
+
for swc in sorted(swc_list, key = lambda o: o.short_name):
|
|
71
|
+
self._logger.info("CompositionSwComponentType %s" % swc.short_name)
|
|
72
|
+
self._write_assembly_sw_connection(swc, idx)
|
|
73
|
+
self._write_delegation_sw_connection(swc, idx + 1)
|
|
74
|
+
idx += 2
|
|
75
|
+
|
|
76
|
+
self.wb.save(filename)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from openpyxl import Workbook
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
class ExcelReporter:
|
|
6
|
+
def __init__(self) -> None:
|
|
7
|
+
self.wb = Workbook()
|
|
8
|
+
self._logger = logging.getLogger()
|
|
9
|
+
|
|
10
|
+
def write_revision(self):
|
|
11
|
+
sheet = self.wb['Sheet']
|
|
12
|
+
sheet.title = "History"
|
|
13
|
+
|
|
14
|
+
title_rows = ["When", "Who", "Version", "History"]
|
|
15
|
+
self.write_title_row(sheet, title_rows)
|
|
16
|
+
|
|
17
|
+
def auto_width(self, worksheet):
|
|
18
|
+
dims = {}
|
|
19
|
+
for row in worksheet.rows:
|
|
20
|
+
for cell in row:
|
|
21
|
+
if cell.value:
|
|
22
|
+
dims[cell.column_letter] = max((dims.get(cell.column_letter, 0), len(str(cell.value))))
|
|
23
|
+
|
|
24
|
+
for col, value in dims.items():
|
|
25
|
+
worksheet.column_dimensions[col].width = (value + 2) + 2
|
|
26
|
+
|
|
27
|
+
def write_title_row(self, sheet, title_row):
|
|
28
|
+
for idx in range(0, len(title_row)):
|
|
29
|
+
cell = sheet.cell(row=1, column=idx + 1)
|
|
30
|
+
cell.value = title_row[idx]
|
|
31
|
+
|
|
32
|
+
def write_cell(self, sheet, row, column, value, format = None):
|
|
33
|
+
cell = sheet.cell(row = row, column=column)
|
|
34
|
+
cell.value = value
|
|
35
|
+
if (format != None):
|
|
36
|
+
if ('alignment' in format):
|
|
37
|
+
cell.alignment = format['alignment']
|
|
38
|
+
if ('number_format' in format):
|
|
39
|
+
cell.number_format = format['number_format']
|
|
40
|
+
|
|
41
|
+
def save(self, name: str):
|
|
42
|
+
self.wb.save(name)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
|
|
2
|
+
from ....models.ar_object import ARBoolean, ARFloat, ARLiteral, ARNumerical
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class TestARObject:
|
|
6
|
+
|
|
7
|
+
def test_ARNumerical(self):
|
|
8
|
+
numerical = ARNumerical()
|
|
9
|
+
numerical.value = 123
|
|
10
|
+
assert(numerical.value == 123)
|
|
11
|
+
assert(numerical.getValue() == 123)
|
|
12
|
+
assert(str(numerical) == "123")
|
|
13
|
+
assert(numerical.getText() == "123")
|
|
14
|
+
|
|
15
|
+
numerical = ARNumerical()
|
|
16
|
+
numerical.setValue(123)
|
|
17
|
+
assert(numerical.value == 123)
|
|
18
|
+
assert(numerical.getValue() == 123)
|
|
19
|
+
assert(str(numerical) == "123")
|
|
20
|
+
assert(numerical.getText() == "123")
|
|
21
|
+
|
|
22
|
+
numerical = ARNumerical()
|
|
23
|
+
numerical.value = "1234"
|
|
24
|
+
assert(numerical.value == 1234)
|
|
25
|
+
assert(numerical.getValue() == 1234)
|
|
26
|
+
assert(str(numerical) == "1234")
|
|
27
|
+
assert(numerical.getText() == "1234")
|
|
28
|
+
|
|
29
|
+
numerical = ARNumerical()
|
|
30
|
+
numerical.setValue("0xFF")
|
|
31
|
+
assert(numerical.value == 255)
|
|
32
|
+
assert(numerical.getValue() == 255)
|
|
33
|
+
assert(str(numerical) == "0xFF")
|
|
34
|
+
assert(numerical.getText() == "0xFF")
|
|
35
|
+
|
|
36
|
+
def test_ARLiteral(self):
|
|
37
|
+
literal = ARLiteral()
|
|
38
|
+
assert(literal.value == "")
|
|
39
|
+
assert(str(literal) == "")
|
|
40
|
+
assert(literal.getValue() == "")
|
|
41
|
+
assert(literal.getText() == "")
|
|
42
|
+
|
|
43
|
+
literal = ARLiteral()
|
|
44
|
+
literal.value = "Literal"
|
|
45
|
+
assert(literal.value == "Literal")
|
|
46
|
+
assert(str(literal) == "Literal")
|
|
47
|
+
assert(literal.getValue() == "Literal")
|
|
48
|
+
assert(literal.getText() == "Literal")
|
|
49
|
+
|
|
50
|
+
literal = ARLiteral()
|
|
51
|
+
literal.setValue("Literal1")
|
|
52
|
+
assert(literal.value == "Literal1")
|
|
53
|
+
assert(str(literal) == "Literal1")
|
|
54
|
+
assert(literal.getValue() == "Literal1")
|
|
55
|
+
assert(literal.getText() == "Literal1")
|
|
56
|
+
|
|
57
|
+
literal = ARLiteral()
|
|
58
|
+
literal.setValue(1234)
|
|
59
|
+
assert(literal.value == "1234")
|
|
60
|
+
assert(str(literal) == "1234")
|
|
61
|
+
assert(literal.getValue() == "1234")
|
|
62
|
+
assert(literal.getText() == "1234")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def test_ARFloat(self):
|
|
66
|
+
numerical = ARFloat()
|
|
67
|
+
numerical.value = 123
|
|
68
|
+
assert(numerical.value == 123.0)
|
|
69
|
+
assert(numerical.getValue() == 123.0)
|
|
70
|
+
assert(str(numerical) == "123.0")
|
|
71
|
+
assert(numerical.getText() == "123.0")
|
|
72
|
+
|
|
73
|
+
numerical = ARFloat()
|
|
74
|
+
numerical.setValue(123)
|
|
75
|
+
assert(numerical.value == 123)
|
|
76
|
+
assert(numerical.getValue() == 123)
|
|
77
|
+
assert(str(numerical) == "123.0")
|
|
78
|
+
assert(numerical.getText() == "123.0")
|
|
79
|
+
|
|
80
|
+
numerical = ARFloat()
|
|
81
|
+
numerical.value = 1234.12
|
|
82
|
+
assert(numerical.value == 1234.12)
|
|
83
|
+
assert(numerical.getValue() == 1234.12)
|
|
84
|
+
assert(str(numerical) == "1234.12")
|
|
85
|
+
assert(numerical.getText() == "1234.12")
|
|
86
|
+
|
|
87
|
+
numerical = ARFloat()
|
|
88
|
+
numerical.value = "1234.12"
|
|
89
|
+
assert(numerical.value == 1234.12)
|
|
90
|
+
assert(numerical.getValue() == 1234.12)
|
|
91
|
+
assert(str(numerical) == "1234.12")
|
|
92
|
+
assert(numerical.getText() == "1234.12")
|
|
93
|
+
|
|
94
|
+
numerical = ARFloat()
|
|
95
|
+
numerical.value = "1234.0"
|
|
96
|
+
assert(numerical.value == 1234)
|
|
97
|
+
assert(numerical.getValue() == 1234)
|
|
98
|
+
assert(str(numerical) == "1234.0")
|
|
99
|
+
assert(numerical.getText() == "1234.0")
|
|
100
|
+
|
|
101
|
+
numerical = ARFloat()
|
|
102
|
+
numerical.value = "1234.000000"
|
|
103
|
+
assert(numerical.value == 1234)
|
|
104
|
+
assert(numerical.getValue() == 1234)
|
|
105
|
+
assert(str(numerical) == "1234.000000")
|
|
106
|
+
assert(numerical.getText() == "1234.000000")
|
|
107
|
+
|
|
108
|
+
def test_ARBoolean(self):
|
|
109
|
+
flag = ARBoolean()
|
|
110
|
+
flag.value = False
|
|
111
|
+
assert(flag.value == False)
|
|
112
|
+
assert(flag.getValue() == False)
|
|
113
|
+
assert(str(flag) == "false")
|
|
114
|
+
assert(flag.getText() == "false")
|
|
115
|
+
|
|
116
|
+
flag = ARBoolean()
|
|
117
|
+
flag.value = 0
|
|
118
|
+
assert(flag.value == False)
|
|
119
|
+
assert(flag.getValue() == False)
|
|
120
|
+
assert(str(flag) == "0")
|
|
121
|
+
assert(flag.getText() == "0")
|
|
122
|
+
|
|
123
|
+
flag = ARBoolean()
|
|
124
|
+
flag.value = "0"
|
|
125
|
+
assert(flag.value == False)
|
|
126
|
+
assert(flag.getValue() == False)
|
|
127
|
+
assert(str(flag) == "0")
|
|
128
|
+
assert(flag.getText() == "0")
|
|
129
|
+
|
|
130
|
+
flag = ARBoolean()
|
|
131
|
+
flag.value = True
|
|
132
|
+
assert(flag.value == True)
|
|
133
|
+
assert(flag.getValue() == True)
|
|
134
|
+
assert(str(flag) == "true")
|
|
135
|
+
assert(flag.getText() == "true")
|
|
136
|
+
|
|
137
|
+
flag = ARBoolean()
|
|
138
|
+
flag.value = 1
|
|
139
|
+
assert(flag.value == True)
|
|
140
|
+
assert(flag.getValue() == True)
|
|
141
|
+
assert(str(flag) == "1")
|
|
142
|
+
assert(flag.getText() == "1")
|
|
143
|
+
|
|
144
|
+
flag = ARBoolean()
|
|
145
|
+
flag.value = "100"
|
|
146
|
+
assert(flag.value == True)
|
|
147
|
+
assert(flag.getValue() == True)
|
|
148
|
+
assert(str(flag) == "100")
|
|
149
|
+
assert(flag.getText() == "100")
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
|