armodel 1.4.0__py3-none-any.whl → 1.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. armodel/__init__.py +2 -1
  2. armodel/cli/arxml_dump_cli.py +9 -7
  3. armodel/cli/arxml_format_cli.py +72 -0
  4. armodel/cli/connector_update_cli.py +11 -4
  5. armodel/data_models/__init__.py +0 -0
  6. armodel/data_models/sw_connector.py +22 -0
  7. armodel/lib/data_analyzer.py +1 -1
  8. armodel/models/__init__.py +3 -2
  9. armodel/models/annotation.py +20 -0
  10. armodel/models/ar_object.py +163 -18
  11. armodel/models/ar_package.py +228 -24
  12. armodel/models/ar_ref.py +85 -6
  13. armodel/models/bsw_module_template.py +113 -27
  14. armodel/models/calibration.py +107 -4
  15. armodel/models/common_structure.py +142 -52
  16. armodel/models/communication.py +10 -1
  17. armodel/models/data_def_properties.py +16 -0
  18. armodel/models/data_dictionary.py +46 -9
  19. armodel/models/data_prototype.py +24 -5
  20. armodel/models/datatype.py +69 -20
  21. armodel/models/end_to_end_protection.py +67 -0
  22. armodel/models/fibex/__init__.py +0 -0
  23. armodel/models/fibex/can_communication.py +6 -0
  24. armodel/models/fibex/fibex_4_multiplatform.py +145 -0
  25. armodel/models/fibex/fibex_core.py +341 -0
  26. armodel/models/fibex/lin_communication.py +17 -0
  27. armodel/models/fibex/lin_topology.py +7 -0
  28. armodel/models/general_structure.py +44 -18
  29. armodel/models/global_constraints.py +4 -4
  30. armodel/models/implementation.py +79 -32
  31. armodel/models/internal_behavior.py +63 -0
  32. armodel/models/m2_msr.py +6 -4
  33. armodel/models/mode_declaration.py +8 -0
  34. armodel/models/multilanguage_data.py +42 -0
  35. armodel/models/per_instance_memory.py +14 -0
  36. armodel/models/port_interface.py +27 -4
  37. armodel/models/port_prototype.py +57 -19
  38. armodel/models/record_layout.py +118 -0
  39. armodel/models/rpt_scenario.py +20 -0
  40. armodel/models/service_mapping.py +11 -0
  41. armodel/models/service_needs.py +48 -0
  42. armodel/models/sw_component.py +293 -45
  43. armodel/models/system_template/__init__.py +0 -0
  44. armodel/models/system_template/network_management.py +7 -0
  45. armodel/models/system_template/transport_protocols.py +7 -0
  46. armodel/models/timing.py +91 -0
  47. armodel/parser/abstract_arxml_parser.py +248 -0
  48. armodel/parser/arxml_parser.py +1571 -844
  49. armodel/parser/connector_xlsx_parser.py +190 -0
  50. armodel/parser/excel_parser.py +18 -0
  51. armodel/tests/test_armodel/models/test_ar_object.py +152 -0
  52. armodel/tests/test_armodel/models/test_ar_package.py +1 -1
  53. armodel/tests/test_armodel/models/test_common_structure.py +2 -2
  54. armodel/tests/test_armodel/models/test_data_dictionary.py +7 -7
  55. armodel/tests/test_armodel/models/test_data_prototype.py +3 -3
  56. armodel/tests/test_armodel/models/test_datatype.py +11 -11
  57. armodel/tests/test_armodel/models/test_general_structure.py +1 -1
  58. armodel/tests/test_armodel/models/test_implementation.py +26 -0
  59. armodel/tests/test_armodel/models/test_m2_msr.py +4 -4
  60. armodel/tests/test_armodel/models/test_port_interface.py +5 -5
  61. armodel/tests/test_armodel/parser/test_arxml_parser.py +15 -0
  62. armodel/tests/test_armodel/parser/test_parse_bswmd.py +74 -42
  63. armodel/tests/test_armodel/parser/test_sw_components.py +93 -0
  64. armodel/writer/abstract_arxml_writer.py +123 -0
  65. armodel/writer/arxml_writer.py +1701 -358
  66. {armodel-1.4.0.dist-info → armodel-1.5.0.dist-info}/METADATA +114 -3
  67. armodel-1.5.0.dist-info/RECORD +91 -0
  68. {armodel-1.4.0.dist-info → armodel-1.5.0.dist-info}/WHEEL +1 -1
  69. {armodel-1.4.0.dist-info → armodel-1.5.0.dist-info}/entry_points.txt +2 -0
  70. armodel-1.4.0.dist-info/RECORD +0 -60
  71. {armodel-1.4.0.dist-info → armodel-1.5.0.dist-info}/LICENSE +0 -0
  72. {armodel-1.4.0.dist-info → armodel-1.5.0.dist-info}/top_level.txt +0 -0
armodel/__init__.py CHANGED
@@ -1,2 +1,3 @@
1
1
  from .models import *
2
- from .parser import ARXMLParser
2
+ from .parser import *
3
+ from .writer import *
@@ -32,15 +32,15 @@ def show_port(indent:int, port_prototype: PortPrototype):
32
32
  raise ValueError("Unsupported Port prototype")
33
33
 
34
34
  def show_type(indent: int, data_type: ImplementationDataType):
35
- print("%s-Implementation Type: %s (%s)" % (" " * indent, data_type.short_name, data_type.parent.full_name))
35
+ print("%s-Implementation Type: %s (%s)" % (" " * indent, data_type.short_name, data_type._parent.full_name))
36
36
  print("%s : %s" % (" " * indent, data_type.category))
37
37
  if (data_type.sw_data_def_props != None):
38
- if (data_type.sw_data_def_props.base_type_ref != None):
39
- base_type_ref = data_type.sw_data_def_props.base_type_ref
38
+ if (data_type.sw_data_def_props.baseTypeRef != None):
39
+ base_type_ref = data_type.sw_data_def_props.baseTypeRef
40
40
  print("%s : %s (%s)" % (" " * indent, base_type_ref.value, base_type_ref.dest))
41
41
 
42
- if (data_type.sw_data_def_props.implementation_data_type_ref != None):
43
- implementation_data_type_ref = data_type.sw_data_def_props.implementation_data_type_ref
42
+ if (data_type.sw_data_def_props.implementationDataTypeRef != None):
43
+ implementation_data_type_ref = data_type.sw_data_def_props.implementationDataTypeRef
44
44
  print("%s : %s (%s)" % (" " * indent, implementation_data_type_ref.value, implementation_data_type_ref.dest))
45
45
 
46
46
  def show_data_type_mapping(indent: int, mapping_set: DataTypeMappingSet):
@@ -104,8 +104,8 @@ def show_bsw_internal_behavior(indent: int, behavior: BswInternalBehavior):
104
104
 
105
105
  for event in behavior.getBswTimingEvents():
106
106
  print("%s-%s" % (" " * (indent + 2), event.short_name))
107
- print("%s-%s: %s" % (" " * (indent + 4), "StartsOnEventRef", event.starts_on_event_ref.value))
108
- starts_on_event = document.find(event.starts_on_event_ref.value) # type: BswModuleEntity
107
+ print("%s-%s: %s" % (" " * (indent + 4), "StartsOnEventRef", event.startsOnEventRef.value))
108
+ starts_on_event = document.find(event.startsOnEventRef.value) # type: BswModuleEntity
109
109
  print("%s-%s: %s" % (" " * (indent + 4), "StartsOnEvent", starts_on_event.short_name))
110
110
  print("%s-%s: %s" % (" " * (indent + 4), "ImplementedEntryRef", starts_on_event.implemented_entry_ref.value))
111
111
  implemented_entry = document.find(starts_on_event.implemented_entry_ref.value) # type: BswModuleEntry
@@ -121,6 +121,8 @@ def show_bsw_module_description(indent: int, description: BswModuleDescription):
121
121
  def show_ar_package(indent: int, ar_package: ARPackage):
122
122
  print("%s-%s (Pkg)" % (" " * indent, ar_package.short_name))
123
123
 
124
+ for sub_package in ar_package.getARPackages():
125
+ show_ar_package(indent + 2, sub_package)
124
126
  #for data_type in ar_package.getImplementationDataTypes():
125
127
  # show_type(indent + 2, data_type)
126
128
  #for mapping_set in ar_package.getDataTypeMappingSets():
@@ -0,0 +1,72 @@
1
+ import argparse
2
+ import pkg_resources
3
+ import logging
4
+ import sys
5
+ import os.path
6
+
7
+
8
+ from ..models.ar_package import AUTOSAR
9
+ from ..parser.arxml_parser import ARXMLParser
10
+ from ..parser.connector_xlsx_parser import ConnectorXlsReader
11
+
12
+ from ..lib import InputFileParser
13
+ from ..writer import ARXMLWriter
14
+
15
+ def main():
16
+ version = pkg_resources.require("armodel")[0].version
17
+
18
+ ap = argparse.ArgumentParser()
19
+ ap.add_argument("-v", "--verbose", required= False, help= "Print debug information", action= "store_true")
20
+ ap.add_argument("-w", "--warning", required= False, help= "Skip the error and report it as warning message", action= "store_true")
21
+ ap.add_argument("INPUT", help = "The path of AUTOSAR ARXML file")
22
+ ap.add_argument("OUTPUT", help = "The path of output ARXML file")
23
+
24
+ args = ap.parse_args()
25
+
26
+ logger = logging.getLogger()
27
+
28
+ formatter = logging.Formatter('[%(levelname)s] : %(message)s')
29
+
30
+ stdout_handler = logging.StreamHandler(sys.stderr)
31
+ stdout_handler.setFormatter(formatter)
32
+
33
+ base_path = os.path.dirname(args.OUTPUT)
34
+ log_file = os.path.join(base_path, 'arxml_format.log')
35
+
36
+ if os.path.exists(log_file):
37
+ os.remove(log_file)
38
+
39
+ file_handler = logging.FileHandler(log_file)
40
+ file_handler.setFormatter(formatter)
41
+
42
+ logger.setLevel(logging.DEBUG)
43
+ file_handler.setLevel(logging.DEBUG)
44
+
45
+ if args.verbose:
46
+ stdout_handler.setLevel(logging.DEBUG)
47
+
48
+ else:
49
+ stdout_handler.setLevel(logging.INFO)
50
+
51
+ logger.addHandler(file_handler)
52
+ logger.addHandler(stdout_handler)
53
+
54
+ try:
55
+ options = {}
56
+ if args.warning:
57
+ options['warning'] = True
58
+
59
+ document = AUTOSAR().getInstance()
60
+ parser = ARXMLParser(options)
61
+ parser.load(args.INPUT, document)
62
+
63
+ writer = ARXMLWriter()
64
+ writer.save(args.OUTPUT, document)
65
+
66
+ except Exception as e:
67
+ #print(e)
68
+ logger.error(e)
69
+ raise e
70
+
71
+ if __name__ == "__main__":
72
+ main()
@@ -4,8 +4,10 @@ import logging
4
4
  import sys
5
5
  import os.path
6
6
 
7
- from armodel import AUTOSAR
8
- from armodel.parser import ARXMLParser
7
+
8
+ from ..models.ar_package import AUTOSAR
9
+ from ..parser.arxml_parser import ARXMLParser
10
+ from ..parser.connector_xlsx_parser import ConnectorXlsReader
9
11
 
10
12
  from ..lib import InputFileParser
11
13
  from ..writer import ARXMLWriter
@@ -16,9 +18,9 @@ def main():
16
18
  ap = argparse.ArgumentParser()
17
19
  ap.add_argument("-v", "--verbose", required= False, help= "Print debug information", action= "store_true")
18
20
  ap.add_argument("-w", "--warning", required= False, help= "Skip the error and report it as warning message", action= "store_true")
19
- ap.add_argument("INPUT", help = "The path of AUTOSAR ARXML file")
21
+ ap.add_argument("INPUT", help = "The path of input ARXML file")
20
22
  ap.add_argument("MAPPING", help = "The path of connector excel file which exports with connector2xlsx")
21
- ap.add_argument("OUTPUT", help = "The path of output excel file")
23
+ ap.add_argument("OUTPUT", help = "The path of output ARXML file")
22
24
 
23
25
  args = ap.parse_args()
24
26
 
@@ -59,11 +61,16 @@ def main():
59
61
  parser = ARXMLParser(options)
60
62
  parser.load(args.INPUT, document)
61
63
 
64
+ reader = ConnectorXlsReader()
65
+ reader.read(args.MAPPING)
66
+ reader.update(document)
67
+
62
68
  writer = ARXMLWriter()
63
69
  writer.save(args.OUTPUT, document)
64
70
 
65
71
  except Exception as e:
66
72
  #print(e)
73
+ logger.error(e)
67
74
  raise e
68
75
 
69
76
  if __name__ == "__main__":
File without changes
@@ -0,0 +1,22 @@
1
+ class SwConnectorData:
2
+ def __init__(self) -> None:
3
+ self.short_name = ""
4
+
5
+ class DelegationSwConnectorData(SwConnectorData):
6
+ def __init__(self) -> None:
7
+ super().__init__()
8
+
9
+ self.inner_swc = ""
10
+ self.inner_pport = ""
11
+ self.inner_rport = ""
12
+ self.outer_pport = ""
13
+ self.outer_rport = ""
14
+
15
+ class AssemblySwConnectorData(SwConnectorData):
16
+ def __init__(self) -> None:
17
+ super().__init__()
18
+
19
+ self.provider_swc= ""
20
+ self.pport = ""
21
+ self.requester_swc = ""
22
+ self.rport = ""
@@ -29,6 +29,6 @@ class SwComponentAnalyzer:
29
29
 
30
30
  for swc in sorted(swc_list, key = lambda o: o.short_name):
31
31
  if option['format'] == 'long':
32
- logger.info("%s (%s)" % (swc.full_name, type(swc)))
32
+ logger.info("%s" % swc.full_name)
33
33
  else:
34
34
  logger.info("%s" % swc.short_name)
@@ -1,7 +1,9 @@
1
+ from .annotation import *
2
+ from .ar_object import *
1
3
  from .general_structure import *
2
4
  from .common_structure import *
3
5
  from .sw_component import *
4
- from .ar_package import ARPackage, AUTOSAR
6
+ from .ar_package import *
5
7
  from .ar_ref import *
6
8
  from .datatype import *
7
9
  from .port_prototype import *
@@ -13,6 +15,5 @@ from .implementation import *
13
15
  from .bsw_module_template import *
14
16
  from .communication import *
15
17
  from .calibration import *
16
- from .ar_object import *
17
18
  from .global_constraints import *
18
19
  from .unit import *
@@ -0,0 +1,20 @@
1
+
2
+ from abc import ABCMeta
3
+
4
+ from .multilanguage_data import MultilanguageLongName
5
+ from .ar_object import ARObject
6
+
7
+
8
+ class GeneralAnnotation(ARObject, metaclass=ABCMeta):
9
+ def __init__(self):
10
+ if type(self) == ARObject:
11
+ raise NotImplementedError("GeneralAnnotation is an abstract class.")
12
+
13
+ self.label = None # type: MultilanguageLongName
14
+
15
+ super().__init__()
16
+
17
+ class Annotation(GeneralAnnotation):
18
+ def __init__(self):
19
+ super().__init__()
20
+
@@ -1,5 +1,9 @@
1
1
  from abc import ABCMeta
2
- from typing import List
2
+ import re
3
+ from typing import Dict, List
4
+
5
+ import xml.etree.cElementTree as ET
6
+
3
7
 
4
8
  class ARObject(metaclass=ABCMeta):
5
9
  def __init__(self):
@@ -12,38 +16,179 @@ class ARObject(metaclass=ABCMeta):
12
16
  self.timestamp = None # type: str
13
17
  self.uuid = None # type: str
14
18
 
15
-
19
+ def getTagName(self, tag: str, nsmap: Dict) -> str:
20
+ return tag.replace("{%s}" % nsmap["xmlns"], "")
21
+
16
22
  class ARType(metaclass=ABCMeta):
17
23
  def __init__(self) -> None:
18
24
  self.timestamp = None # type: str
19
25
  self.uuid = None # type: str
26
+ self._value = None
20
27
 
21
- class ARBoolean(ARType):
22
- def __init__(self) -> None:
23
- super().__init__()
28
+ @property
29
+ def value(self):
30
+ return self._value
31
+
32
+ @value.setter
33
+ def value(self, val):
34
+ self._value = val
35
+
36
+ def getValue(self):
37
+ return self.value
38
+
39
+ def setValue(self, val):
40
+ self.value = val
24
41
 
25
- self.value = "" # type: bool
42
+ def getText(self) -> str:
43
+ return str(self)
44
+
45
+
26
46
  class ARLiteral(ARType):
27
47
  def __init__(self) -> None:
28
48
  super().__init__()
29
49
 
30
- self.value = "" # type: str
50
+ @property
51
+ def value(self) -> str:
52
+ if self._value is None:
53
+ return ""
54
+ return self._value
55
+
56
+ @value.setter
57
+ def value(self, val: any):
58
+ if isinstance(val, str):
59
+ self._value = val
60
+ else:
61
+ self._value = str(val)
62
+
63
+ def __str__(self) -> str:
64
+ return self.value
65
+
66
+ def upper(self) -> str:
67
+ return self.value.upper()
31
68
 
32
- class LLongName(ARObject):
33
- def __init__(self):
69
+ class ARNumerical(ARType):
70
+ def __init__(self) -> None:
34
71
  super().__init__()
35
72
 
36
- self.l = ""
37
- self.value = ""
73
+ self._text = None # type: str
38
74
 
39
- class MultilanguageLongName(ARObject):
40
- def __init__(self):
75
+ def _convertStringToNumberValue(self, value: str) -> int:
76
+ m = re.match(r"0x([0-9a-f]+)", value, re.I)
77
+ if (m):
78
+ return int(m.group(1), 16)
79
+ return int(value)
80
+
81
+ @property
82
+ def value(self) -> int:
83
+ return self._value
84
+
85
+ @value.setter
86
+ def value(self, val: any):
87
+ if isinstance(val, int):
88
+ self._value = val
89
+ elif isinstance(val, str):
90
+ self._text = val
91
+ self._value = self._convertStringToNumberValue(val)
92
+ else:
93
+ raise ValueError("Unsupported Type <%s>", type(val))
94
+
95
+ def __str__(self) -> str:
96
+ if self._text is not None:
97
+ return self._text
98
+ else:
99
+ return str(self._value)
100
+
101
+ class ARPositiveInteger(ARNumerical):
102
+ def __init__(self) -> None:
41
103
  super().__init__()
42
104
 
43
- self.l4 = [] # type:List[LLongName]
105
+ @property
106
+ def value(self) -> int:
107
+ return self._value
108
+
109
+ @value.setter
110
+ def value(self, val: any):
111
+ if isinstance(val, int):
112
+ if val < 0:
113
+ raise ValueError("Invalid Positive Integer <%s>" % val)
114
+ self._value = val
115
+ elif isinstance(val, str):
116
+ self._text = val
117
+ self._value = self._convertStringToNumberValue(val)
118
+ else:
119
+ raise ValueError("Unsupported Type <%s>", type(val))
120
+
121
+ class ARFloat(ARType):
122
+ def __init__(self) -> None:
123
+ super().__init__()
124
+
125
+ self._text = None # type: str
126
+
127
+ @property
128
+ def value(self) -> float:
129
+ return self._value
130
+
131
+ @value.setter
132
+ def value(self, val: any):
133
+ if isinstance(val, float):
134
+ self._value = val
135
+ elif isinstance(val, int):
136
+ self._value = val * 1.0
137
+ elif isinstance(val, str):
138
+ self._text = val
139
+ self._value = float(val)
140
+ else:
141
+ raise ValueError("Unsupported Type <%s>", type(val))
142
+
143
+ def __str__(self) -> str:
144
+ if self._text is not None:
145
+ return self._text
146
+ else:
147
+ return str(self._value)
148
+
149
+ class ARBoolean(ARType):
150
+ def __init__(self) -> None:
151
+ super().__init__()
152
+
153
+ self._text = None
154
+
155
+ def _convertNumberToBoolean(self, value: int) -> bool:
156
+ if value == 0:
157
+ return False
158
+ return True
159
+
160
+ def _convertStringToBoolean(self, value: str) -> bool:
161
+ value = value.lower()
162
+ if value == "true":
163
+ return True
164
+ elif value == "false":
165
+ return False
166
+ else:
167
+ return self._convertNumberToBoolean(int(value))
44
168
 
45
- def add_l4(self, l4: LLongName):
46
- self.l4.append(l4)
169
+ @property
170
+ def value(self) -> int:
171
+ return self._value
172
+
173
+ @value.setter
174
+ def value(self, val: any):
175
+ if isinstance(val, bool):
176
+ self._value = val
177
+ elif isinstance(val, int):
178
+ self._value = self._convertNumberToBoolean(val)
179
+ self._text = str(val)
180
+ elif isinstance(val, str):
181
+ self._text = val
182
+ self._value = self._convertStringToBoolean(val)
183
+ else:
184
+ raise ValueError("Unsupported Type <%s>", type(val))
47
185
 
48
- def get_l4s(self) -> List[LLongName]:
49
- return self.l4
186
+ def __str__(self) -> str:
187
+ if self._text is not None:
188
+ return self._text
189
+ else:
190
+ if self._value:
191
+ return "true"
192
+ else:
193
+ return "false"
194
+