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.
Files changed (75) hide show
  1. armodel/__init__.py +2 -1
  2. armodel/cli/arxml_dump_cli.py +8 -6
  3. armodel/cli/arxml_format_cli.py +72 -0
  4. armodel/cli/connector2xlsx_cli.py +75 -0
  5. armodel/cli/connector_update_cli.py +77 -0
  6. armodel/cli/swc_list_cli.py +2 -2
  7. armodel/data_models/__init__.py +0 -0
  8. armodel/data_models/sw_connector.py +22 -0
  9. armodel/lib/__init__.py +1 -1
  10. armodel/lib/sw_component.py +34 -0
  11. armodel/models/__init__.py +8 -2
  12. armodel/models/annotation.py +20 -0
  13. armodel/models/ar_object.py +184 -0
  14. armodel/models/ar_package.py +144 -14
  15. armodel/models/ar_ref.py +74 -8
  16. armodel/models/bsw_module_template.py +97 -25
  17. armodel/models/calibration.py +119 -0
  18. armodel/models/common_structure.py +203 -36
  19. armodel/models/communication.py +17 -0
  20. armodel/models/data_def_properties.py +16 -0
  21. armodel/models/data_dictionary.py +46 -9
  22. armodel/models/data_prototype.py +24 -5
  23. armodel/models/datatype.py +86 -19
  24. armodel/models/end_to_end_protection.py +67 -0
  25. armodel/models/general_structure.py +72 -17
  26. armodel/models/global_constraints.py +40 -0
  27. armodel/models/implementation.py +80 -32
  28. armodel/models/m2_msr.py +82 -6
  29. armodel/models/multilanguage_data.py +42 -0
  30. armodel/models/per_instance_memory.py +14 -0
  31. armodel/models/port_interface.py +27 -4
  32. armodel/models/port_prototype.py +48 -23
  33. armodel/models/record_layout.py +118 -0
  34. armodel/models/service_mapping.py +11 -0
  35. armodel/models/service_needs.py +48 -0
  36. armodel/models/sw_component.py +257 -43
  37. armodel/models/unit.py +14 -0
  38. armodel/parser/abstract_arxml_parser.py +248 -0
  39. armodel/parser/arxml_parser.py +1550 -648
  40. armodel/parser/connector_xlsx_parser.py +190 -0
  41. armodel/parser/excel_parser.py +18 -0
  42. armodel/report/__init__.py +1 -0
  43. armodel/report/connector_xls_report.py +76 -0
  44. armodel/report/excel_report.py +42 -0
  45. armodel/tests/__init__.py +0 -0
  46. armodel/tests/test_armodel/__init__.py +0 -0
  47. armodel/tests/test_armodel/models/__init__.py +0 -0
  48. armodel/tests/test_armodel/models/test_ar_object.py +152 -0
  49. armodel/tests/test_armodel/models/test_ar_package.py +294 -0
  50. armodel/tests/test_armodel/models/test_ar_ref.py +74 -0
  51. armodel/tests/test_armodel/models/test_bsw_module_template.py +46 -0
  52. armodel/tests/test_armodel/models/test_common_structure.py +73 -0
  53. armodel/tests/test_armodel/models/test_data_dictionary.py +29 -0
  54. armodel/tests/test_armodel/models/test_data_prototype.py +86 -0
  55. armodel/tests/test_armodel/models/test_datatype.py +239 -0
  56. armodel/tests/test_armodel/models/test_general_structure.py +50 -0
  57. armodel/tests/test_armodel/models/test_implementation.py +26 -0
  58. armodel/tests/test_armodel/models/test_m2_msr.py +77 -0
  59. armodel/tests/test_armodel/models/test_port_interface.py +198 -0
  60. armodel/tests/test_armodel/models/test_port_prototype.py +14 -0
  61. armodel/tests/test_armodel/parser/__init__.py +0 -0
  62. armodel/tests/test_armodel/parser/test_arxml_parser.py +15 -0
  63. armodel/tests/test_armodel/parser/test_parse_bswmd.py +192 -0
  64. armodel/tests/test_armodel/parser/test_sw_components.py +93 -0
  65. armodel/writer/__init__.py +1 -0
  66. armodel/writer/abstract_arxml_writer.py +123 -0
  67. armodel/writer/arxml_writer.py +1755 -0
  68. {armodel-1.3.0.dist-info → armodel-1.4.3.dist-info}/METADATA +124 -4
  69. armodel-1.4.3.dist-info/RECORD +78 -0
  70. armodel-1.4.3.dist-info/entry_points.txt +7 -0
  71. armodel-1.3.0.dist-info/RECORD +0 -31
  72. armodel-1.3.0.dist-info/entry_points.txt +0 -4
  73. {armodel-1.3.0.dist-info → armodel-1.4.3.dist-info}/LICENSE +0 -0
  74. {armodel-1.3.0.dist-info → armodel-1.4.3.dist-info}/WHEEL +0 -0
  75. {armodel-1.3.0.dist-info → armodel-1.4.3.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 *
@@ -35,12 +35,12 @@ def show_type(indent: int, data_type: ImplementationDataType):
35
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()
@@ -0,0 +1,75 @@
1
+ import argparse
2
+ import pkg_resources
3
+ import logging
4
+ import sys
5
+ import os.path
6
+
7
+ from armodel import AUTOSAR
8
+ from armodel.parser import ARXMLParser
9
+
10
+ from ..lib import InputFileParser
11
+ from ..report import ConnectorXlsReport
12
+
13
+ def main():
14
+ version = pkg_resources.require("armodel")[0].version
15
+
16
+ ap = argparse.ArgumentParser()
17
+ ap.add_argument("-v", "--verbose", required= False, help= "Print debug information", action= "store_true")
18
+ 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 XML", nargs='+')
20
+ ap.add_argument("OUTPUT", help = "The path of output excel file")
21
+
22
+ args = ap.parse_args()
23
+
24
+ logger = logging.getLogger()
25
+
26
+ formatter = logging.Formatter('[%(levelname)s] : %(message)s')
27
+
28
+ stdout_handler = logging.StreamHandler(sys.stderr)
29
+ stdout_handler.setFormatter(formatter)
30
+
31
+ base_path = os.path.dirname(args.OUTPUT)
32
+ log_file = os.path.join(base_path, 'connector.log')
33
+
34
+ if os.path.exists(log_file):
35
+ os.remove(log_file)
36
+
37
+ file_handler = logging.FileHandler(log_file)
38
+ file_handler.setFormatter(formatter)
39
+
40
+ logger.setLevel(logging.DEBUG)
41
+ file_handler.setLevel(logging.DEBUG)
42
+
43
+ if args.verbose:
44
+ stdout_handler.setLevel(logging.DEBUG)
45
+
46
+ else:
47
+ stdout_handler.setLevel(logging.INFO)
48
+
49
+ logger.addHandler(file_handler)
50
+ logger.addHandler(stdout_handler)
51
+
52
+ try:
53
+ parser = InputFileParser(args.INPUT)
54
+ filenames = parser.parse()
55
+
56
+ options = {}
57
+ if args.warning:
58
+ options['warning'] = True
59
+
60
+ document = AUTOSAR().getInstance()
61
+ parser = ARXMLParser(options)
62
+
63
+ for filename in filenames:
64
+ parser.load(filename, document)
65
+
66
+ writer = ConnectorXlsReport()
67
+ writer.import_data(document)
68
+ writer.write(args.OUTPUT)
69
+
70
+ except Exception as e:
71
+ #print(e)
72
+ raise e
73
+
74
+ if __name__ == "__main__":
75
+ main()
@@ -0,0 +1,77 @@
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 input ARXML file")
22
+ ap.add_argument("MAPPING", help = "The path of connector excel file which exports with connector2xlsx")
23
+ ap.add_argument("OUTPUT", help = "The path of output ARXML file")
24
+
25
+ args = ap.parse_args()
26
+
27
+ logger = logging.getLogger()
28
+
29
+ formatter = logging.Formatter('[%(levelname)s] : %(message)s')
30
+
31
+ stdout_handler = logging.StreamHandler(sys.stderr)
32
+ stdout_handler.setFormatter(formatter)
33
+
34
+ base_path = os.path.dirname(args.OUTPUT)
35
+ log_file = os.path.join(base_path, 'connector_update.log')
36
+
37
+ if os.path.exists(log_file):
38
+ os.remove(log_file)
39
+
40
+ file_handler = logging.FileHandler(log_file)
41
+ file_handler.setFormatter(formatter)
42
+
43
+ logger.setLevel(logging.DEBUG)
44
+ file_handler.setLevel(logging.DEBUG)
45
+
46
+ if args.verbose:
47
+ stdout_handler.setLevel(logging.DEBUG)
48
+
49
+ else:
50
+ stdout_handler.setLevel(logging.INFO)
51
+
52
+ logger.addHandler(file_handler)
53
+ logger.addHandler(stdout_handler)
54
+
55
+ try:
56
+ options = {}
57
+ if args.warning:
58
+ options['warning'] = True
59
+
60
+ document = AUTOSAR().getInstance()
61
+ parser = ARXMLParser(options)
62
+ parser.load(args.INPUT, document)
63
+
64
+ reader = ConnectorXlsReader()
65
+ reader.read(args.MAPPING)
66
+ reader.update(document)
67
+
68
+ writer = ARXMLWriter()
69
+ writer.save(args.OUTPUT, document)
70
+
71
+ except Exception as e:
72
+ #print(e)
73
+ logger.error(e)
74
+ raise e
75
+
76
+ if __name__ == "__main__":
77
+ main()
@@ -16,7 +16,7 @@ def main():
16
16
  ap.add_argument("-v", "--verbose", required= False, help= "Print debug information", action= "store_true")
17
17
  ap.add_argument("-f", "--format", required= False, help= "Specify the short or long name of Sw-C. [short|long]")
18
18
  ap.add_argument("--filter", required= False, help = "Set the filter condition. [CompositionSwComponent]")
19
- ap.add_argument("Input", help = "The path of AUTOSAR XML", nargs='+')
19
+ ap.add_argument("INPUT", help = "The path of AUTOSAR XML", nargs='+')
20
20
 
21
21
  args = ap.parse_args()
22
22
 
@@ -49,7 +49,7 @@ def main():
49
49
  logger.addHandler(stdout_handler)
50
50
 
51
51
  try:
52
- parser = InputFileParser(args.Input)
52
+ parser = InputFileParser(args.INPUT)
53
53
  filenames = parser.parse()
54
54
 
55
55
  document = AUTOSAR().getInstance()
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 = ""
armodel/lib/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
 
2
2
  from .cli_args_parser import InputFileParser
3
- from .data_analyzer import SwComponentAnalyzer
3
+ from .sw_component import SwComponentAnalyzer
@@ -0,0 +1,34 @@
1
+ import logging
2
+
3
+ from typing import List
4
+ from ..models import AUTOSAR, ARPackage, AtomicSwComponentType, CompositionSwComponentType
5
+
6
+ class SwComponentAnalyzer:
7
+ def __init__(self) -> None:
8
+ self.swcs = [] # type: List[AtomicSwComponentType]
9
+
10
+ def parse_pkg(self, parent: ARPackage):
11
+ for pkg in parent.getARPackages():
12
+ self.parse_pkg(pkg)
13
+ for swc in parent.getSwComponentTypes():
14
+ self.swcs.append(swc)
15
+
16
+ def import_data(self, document: AUTOSAR):
17
+ for pkg in document.getARPackages():
18
+ self.parse_pkg(pkg)
19
+
20
+ def print_out(self, option = {}):
21
+ logger = logging.getLogger()
22
+
23
+ logger.info("== SW-C LIST ==")
24
+
25
+ if option['filter'] == 'CompositionSwComponent':
26
+ swc_list = filter(lambda o: isinstance(o, CompositionSwComponentType), self.swcs)
27
+ else:
28
+ swc_list = self.swcs
29
+
30
+ for swc in sorted(swc_list, key = lambda o: o.short_name):
31
+ if option['format'] == 'long':
32
+ logger.info("%s" % swc.full_name)
33
+ else:
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 *
@@ -10,4 +12,8 @@ from .data_dictionary import *
10
12
  from .port_interface import *
11
13
  from .m2_msr import *
12
14
  from .implementation import *
13
- from .bsw_module_template import *
15
+ from .bsw_module_template import *
16
+ from .communication import *
17
+ from .calibration import *
18
+ from .global_constraints import *
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,4 +1,9 @@
1
1
  from abc import ABCMeta
2
+ import re
3
+ from typing import Dict, List
4
+
5
+ import xml.etree.cElementTree as ET
6
+
2
7
 
3
8
  class ARObject(metaclass=ABCMeta):
4
9
  def __init__(self):
@@ -7,4 +12,183 @@ class ARObject(metaclass=ABCMeta):
7
12
 
8
13
  self.parent = None # type: ARObject
9
14
  self.checksum = None # type: str
15
+
10
16
  self.timestamp = None # type: str
17
+ self.uuid = None # type: str
18
+
19
+ def getTagName(self, tag: str, nsmap: Dict) -> str:
20
+ return tag.replace("{%s}" % nsmap["xmlns"], "")
21
+
22
+ class ARType(metaclass=ABCMeta):
23
+ def __init__(self) -> None:
24
+ self.timestamp = None # type: str
25
+ self.uuid = None # type: str
26
+ self._value = None
27
+
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
41
+
42
+ def getText(self) -> str:
43
+ return str(self)
44
+
45
+
46
+ class ARLiteral(ARType):
47
+ def __init__(self) -> None:
48
+ super().__init__()
49
+
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()
68
+
69
+ class ARNumerical(ARType):
70
+ def __init__(self) -> None:
71
+ super().__init__()
72
+
73
+ self._text = None # type: str
74
+
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:
103
+ super().__init__()
104
+
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))
168
+
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))
185
+
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
+