py-eb-model 1.0.1__py3-none-any.whl → 1.0.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.
- eb_model/__init__.py +2 -1
- eb_model/cli/pref_system_importer_cli.py +75 -0
- eb_model/models/__init__.py +2 -0
- eb_model/models/eb_doc.py +48 -20
- eb_model/models/importer_xdm.py +45 -0
- eb_model/models/os_xdm.py +205 -4
- eb_model/models/rte_xdm.py +6 -6
- eb_model/parser/__init__.py +3 -0
- eb_model/parser/eb_parser.py +20 -13
- eb_model/parser/os_xdm_parser.py +26 -4
- eb_model/parser/pref_xdm_parser.py +25 -0
- eb_model/parser/rte_xdm_parser.py +0 -1
- eb_model/tests/models/test_eb_model.py +14 -1
- eb_model/writer/__init__.py +1 -0
- eb_model/writer/text_writer.py +28 -0
- {py_eb_model-1.0.1.dist-info → py_eb_model-1.0.3.dist-info}/METADATA +18 -2
- {py_eb_model-1.0.1.dist-info → py_eb_model-1.0.3.dist-info}/RECORD +21 -16
- {py_eb_model-1.0.1.dist-info → py_eb_model-1.0.3.dist-info}/entry_points.txt +1 -0
- {py_eb_model-1.0.1.dist-info → py_eb_model-1.0.3.dist-info}/LICENSE +0 -0
- {py_eb_model-1.0.1.dist-info → py_eb_model-1.0.3.dist-info}/WHEEL +0 -0
- {py_eb_model-1.0.1.dist-info → py_eb_model-1.0.3.dist-info}/top_level.txt +0 -0
eb_model/__init__.py
CHANGED
@@ -0,0 +1,75 @@
|
|
1
|
+
import argparse
|
2
|
+
import pkg_resources
|
3
|
+
import logging
|
4
|
+
import sys
|
5
|
+
import os.path
|
6
|
+
|
7
|
+
from ..writer import TextPreferenceModelWriter
|
8
|
+
from ..parser import PerfXdmParser
|
9
|
+
from ..models import PreferenceModel
|
10
|
+
|
11
|
+
def main():
|
12
|
+
version = pkg_resources.require("py_eb_model")[0].version
|
13
|
+
|
14
|
+
ap = argparse.ArgumentParser()
|
15
|
+
ap.add_argument("-v", "--verbose", required= False, help = "Print debug information", action = "store_true")
|
16
|
+
ap.add_argument("--file-list", required=False, help = "Generate the file list (Default)", action = "store_true")
|
17
|
+
ap.add_argument("--ab-project", required=False, help = "Generate the AUTOSAR builder project", action = "store_true")
|
18
|
+
ap.add_argument("--base-path", required=False, help="Base Path for EB tresos")
|
19
|
+
ap.add_argument("INPUTS", nargs='+', help = "The path of perf_imp_xxx.xdm.")
|
20
|
+
ap.add_argument("OUTPUT", help = "The path of output 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, 'pref_system_importer.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
|
+
else:
|
46
|
+
stdout_handler.setLevel(logging.INFO)
|
47
|
+
|
48
|
+
logger.addHandler(file_handler)
|
49
|
+
logger.addHandler(stdout_handler)
|
50
|
+
|
51
|
+
format = "file_list"
|
52
|
+
if args.ab_project:
|
53
|
+
format = "ab_project"
|
54
|
+
|
55
|
+
try:
|
56
|
+
doc = PreferenceModel.getInstance()
|
57
|
+
|
58
|
+
parser = PerfXdmParser()
|
59
|
+
for file in args.INPUTS:
|
60
|
+
if args.base_path is not None:
|
61
|
+
file_name = os.path.realpath(os.path.join(args.base_path, file))
|
62
|
+
else:
|
63
|
+
file_name = file
|
64
|
+
parser.parse_preference_xdm(file_name, doc)
|
65
|
+
|
66
|
+
if format == "file_list":
|
67
|
+
writer = TextPreferenceModelWriter()
|
68
|
+
writer.writer_import_files(args.OUTPUT, doc.getSystemDescriptionImporter(), {
|
69
|
+
'base_path': args.base_path,
|
70
|
+
'wildcard': True,
|
71
|
+
})
|
72
|
+
|
73
|
+
except Exception as e:
|
74
|
+
logger.error(e)
|
75
|
+
raise e
|
eb_model/models/__init__.py
CHANGED
eb_model/models/eb_doc.py
CHANGED
@@ -1,9 +1,29 @@
|
|
1
|
+
from .importer_xdm import SystemDescriptionImporter
|
1
2
|
from .rte_xdm import Rte
|
2
3
|
from .os_xdm import Os
|
3
4
|
from .abstract import EcucContainer, EcucObject
|
4
5
|
|
6
|
+
class AbstractModel(EcucContainer):
|
7
|
+
def getFullName(self):
|
8
|
+
return self.name
|
9
|
+
|
10
|
+
def clear(self):
|
11
|
+
self.elements = {}
|
12
|
+
|
13
|
+
def find_object(self, referred_name:str, element:EcucContainer) -> EcucObject:
|
14
|
+
name_list = referred_name.split("/")
|
15
|
+
#element = EBModel.getInstance()
|
16
|
+
for name in name_list:
|
17
|
+
if (name == ""):
|
18
|
+
continue
|
19
|
+
element = element.getElement(name)
|
20
|
+
if (element == None):
|
21
|
+
return element
|
22
|
+
# raise ValueError("The %s of reference <%s> does not exist." % (short_name, referred_name))
|
23
|
+
return element
|
5
24
|
|
6
|
-
|
25
|
+
|
26
|
+
class EBModel(AbstractModel):
|
7
27
|
__instance = None
|
8
28
|
|
9
29
|
@staticmethod
|
@@ -19,24 +39,9 @@ class EBModel(EcucContainer):
|
|
19
39
|
EcucContainer.__init__(self, None, "")
|
20
40
|
EBModel.__instance = self
|
21
41
|
|
22
|
-
def getFullName(self):
|
23
|
-
return self.name
|
24
|
-
|
25
|
-
def clear(self):
|
26
|
-
self.elements = {}
|
27
|
-
|
28
42
|
def find(self, referred_name: str) -> EcucObject:
|
29
|
-
|
30
|
-
|
31
|
-
for name in name_list:
|
32
|
-
if (name == ""):
|
33
|
-
continue
|
34
|
-
element = element.getElement(name)
|
35
|
-
if (element == None):
|
36
|
-
return element
|
37
|
-
# raise ValueError("The %s of reference <%s> does not exist." % (short_name, referred_name))
|
38
|
-
return element
|
39
|
-
|
43
|
+
return self.find_object(referred_name, EBModel.getInstance())
|
44
|
+
|
40
45
|
def getOs(self) -> Os:
|
41
46
|
container = EcucContainer(self, "Os")
|
42
47
|
os = Os(container)
|
@@ -46,5 +51,28 @@ class EBModel(EcucContainer):
|
|
46
51
|
container = EcucContainer(self, "Rte")
|
47
52
|
rte = Rte(container)
|
48
53
|
return self.find("/Rte/Rte")
|
49
|
-
|
50
|
-
|
54
|
+
|
55
|
+
class PreferenceModel(AbstractModel):
|
56
|
+
__instance = None
|
57
|
+
|
58
|
+
@staticmethod
|
59
|
+
def getInstance():
|
60
|
+
if (PreferenceModel.__instance == None):
|
61
|
+
PreferenceModel()
|
62
|
+
return PreferenceModel.__instance
|
63
|
+
|
64
|
+
def __init__(self):
|
65
|
+
if (PreferenceModel.__instance != None):
|
66
|
+
raise Exception("The PreferenceModel is singleton!")
|
67
|
+
|
68
|
+
EcucContainer.__init__(self, None, "")
|
69
|
+
PreferenceModel.__instance = self
|
70
|
+
|
71
|
+
container = EcucContainer(self, "ImporterExporterAdditions")
|
72
|
+
SystemDescriptionImporter(container, "SystemDescriptionImporters")
|
73
|
+
|
74
|
+
def find(self, referred_name: str) -> EcucObject:
|
75
|
+
return self.find_object(referred_name, PreferenceModel.getInstance())
|
76
|
+
|
77
|
+
def getSystemDescriptionImporter(self) -> SystemDescriptionImporter:
|
78
|
+
return self.find("/ImporterExporterAdditions/SystemDescriptionImporters")
|
@@ -0,0 +1,45 @@
|
|
1
|
+
import glob
|
2
|
+
from typing import List
|
3
|
+
from .abstract import EcucObject
|
4
|
+
import os
|
5
|
+
import re
|
6
|
+
|
7
|
+
class SystemDescriptionImporter(EcucObject):
|
8
|
+
def __init__(self, parent, name):
|
9
|
+
super().__init__(parent, name)
|
10
|
+
|
11
|
+
self.inputFiles = [] # type: List[str]
|
12
|
+
|
13
|
+
def getInputFiles(self):
|
14
|
+
return self.inputFiles
|
15
|
+
|
16
|
+
def addInputFile(self, value):
|
17
|
+
self.inputFiles.append(value)
|
18
|
+
return self
|
19
|
+
|
20
|
+
def parseWildcard(self, filename: str) -> List[str]:
|
21
|
+
#path: str, file_pattern: str
|
22
|
+
file_list = []
|
23
|
+
for file in glob.iglob(filename):
|
24
|
+
print(file)
|
25
|
+
file_list.append(file)
|
26
|
+
return file_list
|
27
|
+
|
28
|
+
def getParsedInputFiles(self, base_path: str, wildcard: bool) -> List[str]:
|
29
|
+
file_list = []
|
30
|
+
for input_file in self.inputFiles:
|
31
|
+
if base_path is not None:
|
32
|
+
if wildcard:
|
33
|
+
m = re.match(r'(.+)\\(\*\.\w+)', input_file)
|
34
|
+
if m:
|
35
|
+
path, file_pattern = m.group(1), m.group(2)
|
36
|
+
#for file_name in self.parseWildcard(os.path.realpath(os.path.join(base_path, path)), file_pattern):
|
37
|
+
for file_name in self.parseWildcard(os.path.realpath(os.path.join(base_path, input_file))):
|
38
|
+
file_list.append(file_name)
|
39
|
+
else:
|
40
|
+
file_list.append(os.path.realpath(os.path.join(base_path, input_file)))
|
41
|
+
else:
|
42
|
+
file_list.append(os.path.realpath(os.path.join(base_path, input_file)))
|
43
|
+
else:
|
44
|
+
file_list.append(input_file)
|
45
|
+
return file_list
|
eb_model/models/os_xdm.py
CHANGED
@@ -159,11 +159,179 @@ class OsAlarm(EcucContainer):
|
|
159
159
|
|
160
160
|
return "\n".join(result)
|
161
161
|
|
162
|
+
class OsApplicationHooks(EcucContainer):
|
163
|
+
def __init__(self, parent, name):
|
164
|
+
super().__init__(parent, name)
|
165
|
+
|
166
|
+
self.OsAppErrorHook = False # type: bool
|
167
|
+
self.OsAppShutdownHook = False # type: bool
|
168
|
+
self.OsAppStartupHook = False # type: bool
|
169
|
+
self.OsMemoryMappingCodeLocationRef = None # type: EcucRefType
|
170
|
+
|
171
|
+
def getOsAppErrorHook(self):
|
172
|
+
return self.OsAppErrorHook
|
173
|
+
|
174
|
+
def setOsAppErrorHook(self, value):
|
175
|
+
self.OsAppErrorHook = value
|
176
|
+
return self
|
177
|
+
|
178
|
+
def getOsAppShutdownHook(self):
|
179
|
+
return self.OsAppShutdownHook
|
180
|
+
|
181
|
+
def setOsAppShutdownHook(self, value):
|
182
|
+
self.OsAppShutdownHook = value
|
183
|
+
return self
|
184
|
+
|
185
|
+
def getOsAppStartupHook(self):
|
186
|
+
return self.OsAppStartupHook
|
187
|
+
|
188
|
+
def setOsAppStartupHook(self, value):
|
189
|
+
self.OsAppStartupHook = value
|
190
|
+
return self
|
191
|
+
|
192
|
+
def getOsMemoryMappingCodeLocationRef(self):
|
193
|
+
return self.OsMemoryMappingCodeLocationRef
|
194
|
+
|
195
|
+
def setOsMemoryMappingCodeLocationRef(self, value):
|
196
|
+
self.OsMemoryMappingCodeLocationRef = value
|
197
|
+
return self
|
198
|
+
|
199
|
+
class OsApplicationTrustedFunction(EcucContainer):
|
200
|
+
def __init__(self, parent, name):
|
201
|
+
super().__init__(parent, name)
|
202
|
+
|
203
|
+
self.OsTrustedFunctionName = None # type: str
|
204
|
+
self.OsMemoryMappingCodeLocationRef = None # type: EcucRefType
|
205
|
+
|
206
|
+
def getOsTrustedFunctionName(self):
|
207
|
+
return self.OsTrustedFunctionName
|
208
|
+
|
209
|
+
def setOsTrustedFunctionName(self, value):
|
210
|
+
self.OsTrustedFunctionName = value
|
211
|
+
return self
|
212
|
+
|
213
|
+
def getOsMemoryMappingCodeLocationRef(self):
|
214
|
+
return self.OsMemoryMappingCodeLocationRef
|
162
215
|
|
216
|
+
def setOsMemoryMappingCodeLocationRef(self, value):
|
217
|
+
self.OsMemoryMappingCodeLocationRef = value
|
218
|
+
return self
|
219
|
+
class OsAppMode(EcucContainer):
|
220
|
+
def __init__(self, parent, name):
|
221
|
+
super().__init__(parent, name)
|
163
222
|
class OsApplication(EcucContainer):
|
164
223
|
def __init__(self, parent, name) -> None:
|
165
224
|
super().__init__(parent, name)
|
166
225
|
|
226
|
+
self.OsTrusted = False # type: bool
|
227
|
+
self.OsTrustedApplicationDelayTimingViolationCall = False # type: bool
|
228
|
+
self.OsTrustedApplicationWithProtection = False # type: bool
|
229
|
+
self.OsAppAlarmRefs = [] # type: List[EcucRefType]
|
230
|
+
self.OsAppCounterRefs = [] # type: List[EcucRefType]
|
231
|
+
self.OsAppEcucPartitionRefs = [] # type: List[EcucRefType]
|
232
|
+
self.OsAppIsrRefs = [] # type: List[EcucRefType]
|
233
|
+
self.OsApplicationCoreRefs = [] # type: List[EcucRefType]
|
234
|
+
self.OsAppScheduleTableRefs = [] # type: List[EcucRefType]
|
235
|
+
self.OsAppTaskRefs = [] # type: List[EcucRefType]
|
236
|
+
self.OsMemoryMappingCodeLocationRef = None # type: EcucRefType
|
237
|
+
self.OsRestartTask = None # type: EcucRefType
|
238
|
+
|
239
|
+
'''
|
240
|
+
EB Tresos
|
241
|
+
'''
|
242
|
+
self.OsAppResourceRefs = [] # type: List[EcucRefType]
|
243
|
+
|
244
|
+
def getOsTrusted(self):
|
245
|
+
return self.OsTrusted
|
246
|
+
|
247
|
+
def setOsTrusted(self, value):
|
248
|
+
self.OsTrusted = value
|
249
|
+
return self
|
250
|
+
|
251
|
+
def getOsTrustedApplicationDelayTimingViolationCall(self):
|
252
|
+
return self.OsTrustedApplicationDelayTimingViolationCall
|
253
|
+
|
254
|
+
def setOsTrustedApplicationDelayTimingViolationCall(self, value):
|
255
|
+
self.OsTrustedApplicationDelayTimingViolationCall = value
|
256
|
+
return self
|
257
|
+
|
258
|
+
def getOsTrustedApplicationWithProtection(self):
|
259
|
+
return self.OsTrustedApplicationWithProtection
|
260
|
+
|
261
|
+
def setOsTrustedApplicationWithProtection(self, value):
|
262
|
+
self.OsTrustedApplicationWithProtection = value
|
263
|
+
return self
|
264
|
+
|
265
|
+
def getOsAppAlarmRefs(self):
|
266
|
+
return self.OsAppAlarmRefs
|
267
|
+
|
268
|
+
def addOsAppAlarmRef(self, value):
|
269
|
+
self.OsAppAlarmRefs.append(value)
|
270
|
+
return self
|
271
|
+
|
272
|
+
def getOsAppCounterRefs(self):
|
273
|
+
return self.OsAppCounterRefs
|
274
|
+
|
275
|
+
def addOsAppCounterRefs(self, value):
|
276
|
+
self.OsAppCounterRefs.append(value)
|
277
|
+
return self
|
278
|
+
|
279
|
+
def getOsAppEcucPartitionRefs(self):
|
280
|
+
return self.OsAppEcucPartitionRefs
|
281
|
+
|
282
|
+
def addOsAppEcucPartitionRefs(self, value):
|
283
|
+
self.OsAppEcucPartitionRefs.append(value)
|
284
|
+
return self
|
285
|
+
|
286
|
+
def getOsAppIsrRefs(self):
|
287
|
+
return self.OsAppIsrRefs
|
288
|
+
|
289
|
+
def addOsAppIsrRefs(self, value):
|
290
|
+
self.OsAppIsrRefs.append(value)
|
291
|
+
return self
|
292
|
+
|
293
|
+
def getOsApplicationCoreRefs(self):
|
294
|
+
return self.OsApplicationCoreRefs
|
295
|
+
|
296
|
+
def addOsApplicationCoreRefs(self, value):
|
297
|
+
self.OsApplicationCoreRefs.append(value)
|
298
|
+
return self
|
299
|
+
|
300
|
+
def getOsAppScheduleTableRefs(self):
|
301
|
+
return self.OsAppScheduleTableRefs
|
302
|
+
|
303
|
+
def addOsAppScheduleTableRef(self, value):
|
304
|
+
self.OsAppScheduleTableRefs.append(value)
|
305
|
+
return self
|
306
|
+
|
307
|
+
def getOsAppTaskRefs(self):
|
308
|
+
return self.OsAppTaskRefs
|
309
|
+
|
310
|
+
def addOsAppTaskRefs(self, value):
|
311
|
+
self.OsAppTaskRefs.append(value)
|
312
|
+
return self
|
313
|
+
|
314
|
+
def getOsMemoryMappingCodeLocationRef(self):
|
315
|
+
return self.OsMemoryMappingCodeLocationRef
|
316
|
+
|
317
|
+
def setOsMemoryMappingCodeLocationRef(self, value):
|
318
|
+
self.OsMemoryMappingCodeLocationRef = value
|
319
|
+
return self
|
320
|
+
|
321
|
+
def getOsRestartTask(self):
|
322
|
+
return self.OsRestartTask
|
323
|
+
|
324
|
+
def setOsRestartTask(self, value):
|
325
|
+
self.OsRestartTask = value
|
326
|
+
return self
|
327
|
+
|
328
|
+
def getOsAppResourceRefs(self):
|
329
|
+
return self.OsAppResourceRefs
|
330
|
+
|
331
|
+
def addOsAppResourceRef(self, value):
|
332
|
+
self.OsAppResourceRefs.append(value)
|
333
|
+
return self
|
334
|
+
|
167
335
|
|
168
336
|
class OsDriver(EcucContainer):
|
169
337
|
def __init__(self, parent, name) -> None:
|
@@ -397,8 +565,14 @@ class OsTaskAutostart(EcucObject):
|
|
397
565
|
def __init__(self, parent, name) -> None:
|
398
566
|
super().__init__(parent, name)
|
399
567
|
|
400
|
-
self.
|
568
|
+
self.osTaskAppModeRefs = [] # type: List[EcucRefType]
|
401
569
|
|
570
|
+
def getOsTaskAppModeRefList(self):
|
571
|
+
return self.osTaskAppModeRefs
|
572
|
+
|
573
|
+
def addOsTaskAppModeRef(self, value):
|
574
|
+
self.osTaskAppModeRefs.append(value)
|
575
|
+
return self
|
402
576
|
|
403
577
|
class OsTaskResourceLock(EcucObject):
|
404
578
|
def __init__(self, parent, name) -> None:
|
@@ -434,11 +608,13 @@ class OsTask(EcucObject):
|
|
434
608
|
self.osTaskPeriod = 0.0 # type: float
|
435
609
|
self.osTaskPriority = None # type: int
|
436
610
|
self.osTaskSchedule = ""
|
611
|
+
self.OsTaskType = None # type: str
|
437
612
|
self.osStacksize = 0 # type: int
|
438
|
-
self.osMemoryMappingCodeLocationRef = None
|
613
|
+
self.osMemoryMappingCodeLocationRef = None # type: EcucRefType
|
439
614
|
self.osTaskAccessingApplication = None
|
440
|
-
self.osTaskEventRef = None
|
615
|
+
self.osTaskEventRef = None # type: EcucRefType
|
441
616
|
self.osTaskResourceRefs = [] # type: List[EcucRefType]
|
617
|
+
self.osTaskAutostart = None # type: OsTaskAutostart
|
442
618
|
|
443
619
|
def getOsTaskActivation(self):
|
444
620
|
return self.osTaskActivation
|
@@ -467,6 +643,14 @@ class OsTask(EcucObject):
|
|
467
643
|
def setOsTaskSchedule(self, value):
|
468
644
|
self.osTaskSchedule = value
|
469
645
|
return self
|
646
|
+
|
647
|
+
def getOsTaskType(self):
|
648
|
+
return self.OsTaskType
|
649
|
+
|
650
|
+
def setOsTaskType(self, value):
|
651
|
+
self.OsTaskType = value
|
652
|
+
return self
|
653
|
+
|
470
654
|
|
471
655
|
def getOsStacksize(self) -> int:
|
472
656
|
return self.osStacksize
|
@@ -507,6 +691,14 @@ class OsTask(EcucObject):
|
|
507
691
|
if self.osTaskSchedule == OsTask.FULL:
|
508
692
|
return True
|
509
693
|
return False
|
694
|
+
|
695
|
+
def getOsTaskAutostart(self):
|
696
|
+
return self.osTaskAutostart
|
697
|
+
|
698
|
+
def setOsTaskAutostart(self, value):
|
699
|
+
self.osTaskAutostart = value
|
700
|
+
return self
|
701
|
+
|
510
702
|
|
511
703
|
|
512
704
|
class OsScheduleTableAutostart(EcucContainer):
|
@@ -750,6 +942,7 @@ class Os(EcucContainer):
|
|
750
942
|
self.osAlarms = [] # type: List[OsAlarm]
|
751
943
|
self.osScheduleTables = [] # type: List[OsScheduleTable]
|
752
944
|
self.osCounters = [] # type: List[OsCounter]
|
945
|
+
self.osApplications = [] # type: List[OsApplication]
|
753
946
|
|
754
947
|
def getOsTaskList(self) -> List[OsTask]:
|
755
948
|
return list(sorted(filter(lambda a: isinstance(a, OsTask), self.elements.values()), key=lambda o: o.name))
|
@@ -789,4 +982,12 @@ class Os(EcucContainer):
|
|
789
982
|
def addOsCounter(self, os_counter: OsCounter):
|
790
983
|
self.addElement(os_counter)
|
791
984
|
self.osCounters.append(os_counter)
|
792
|
-
return self
|
985
|
+
return self
|
986
|
+
|
987
|
+
def getOsApplicationList(self) -> List[OsApplication]:
|
988
|
+
return list(sorted(filter(lambda a: isinstance(a, OsApplication), self.elements.values()), key=lambda o: o.name))
|
989
|
+
|
990
|
+
def addOsApplication(self, value):
|
991
|
+
self.addElement(value)
|
992
|
+
self.osApplications.append(value)
|
993
|
+
return self
|
eb_model/models/rte_xdm.py
CHANGED
@@ -321,7 +321,7 @@ class RteSwComponentInstance(AbstractRteInstance):
|
|
321
321
|
def __init__(self, parent, name) -> None:
|
322
322
|
super().__init__(parent, name)
|
323
323
|
|
324
|
-
self.
|
324
|
+
self.mappedToOsApplicationRef = None # type: EcucRefType
|
325
325
|
self.rteSoftwareComponentInstanceRef = None
|
326
326
|
|
327
327
|
self.rteEventToIsrMappings = []
|
@@ -333,10 +333,10 @@ class RteSwComponentInstance(AbstractRteInstance):
|
|
333
333
|
self.rteNvRamAllocations = []
|
334
334
|
|
335
335
|
def getMappedToOsApplicationRef(self):
|
336
|
-
return self.
|
336
|
+
return self.mappedToOsApplicationRef
|
337
337
|
|
338
338
|
def setMappedToOsApplicationRef(self, value):
|
339
|
-
self.
|
339
|
+
self.mappedToOsApplicationRef = value
|
340
340
|
return self
|
341
341
|
|
342
342
|
def getRteSoftwareComponentInstanceRef(self) -> EcucRefType:
|
@@ -402,11 +402,11 @@ class RteBswModuleInstance(AbstractRteInstance):
|
|
402
402
|
self.rteBswImplementationRef = None
|
403
403
|
self.rteBswModuleConfigurationRefs = []
|
404
404
|
self.rteBswEventToIsrMappings = []
|
405
|
-
self.rteBswEventToTaskMappings = [] # List[RteBswEventToTaskMapping]
|
405
|
+
self.rteBswEventToTaskMappings = [] # type: List[RteBswEventToTaskMapping]
|
406
406
|
self.rteBswExclusiveAreaImpls = []
|
407
407
|
self.rteBswExternalTriggerConfigs = []
|
408
408
|
self.rteBswInternalTriggerConfigs = []
|
409
|
-
self.rteMappedToOsApplicationRef = None
|
409
|
+
self.rteMappedToOsApplicationRef = None # type: EcucRefType
|
410
410
|
self.rteBswModeMachineInstanceConfigs = []
|
411
411
|
self.rteBswRequiredClientServerConnections = []
|
412
412
|
self.rteBswRequiredModeGroupConnections = []
|
@@ -515,7 +515,7 @@ class Rte(EcucContainer):
|
|
515
515
|
self.elements[value.getName()] = value
|
516
516
|
|
517
517
|
def getRteSwComponentInstanceList(self) -> List[RteSwComponentInstance]:
|
518
|
-
return list(sorted(filter(lambda a: isinstance(a,
|
518
|
+
return list(sorted(filter(lambda a: isinstance(a, RteSwComponentInstance), self.elements.values()), key= lambda o:o.name))
|
519
519
|
|
520
520
|
def addRteSwComponentInstance(self, value: RteSwComponentInstance):
|
521
521
|
self.elements[value.getName()] = value
|
eb_model/parser/__init__.py
CHANGED
eb_model/parser/eb_parser.py
CHANGED
@@ -5,7 +5,7 @@ import re
|
|
5
5
|
from abc import ABCMeta
|
6
6
|
from typing import List
|
7
7
|
|
8
|
-
from ..models.eb_doc import EBModel
|
8
|
+
from ..models.eb_doc import EBModel, PreferenceModel
|
9
9
|
from ..models.abstract import EcucRefType
|
10
10
|
|
11
11
|
class AbstractEbModelParser(metaclass = ABCMeta):
|
@@ -33,17 +33,17 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
33
33
|
return value
|
34
34
|
|
35
35
|
def _convert_value(self, tag):
|
36
|
-
if
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
36
|
+
if 'type' in tag.attrib:
|
37
|
+
if (tag.attrib['type'] == 'INTEGER'):
|
38
|
+
return int(tag.attrib['value'])
|
39
|
+
elif (tag.attrib['type'] == "FLOAT"):
|
40
|
+
return float(tag.attrib['value'])
|
41
|
+
elif (tag.attrib['type'] == 'BOOLEAN'):
|
42
|
+
if (tag.attrib['value'] == 'true'):
|
43
|
+
return True
|
44
|
+
else:
|
45
|
+
return False
|
46
|
+
return tag.attrib['value']
|
47
47
|
|
48
48
|
def read_value(self, parent: ET.Element, name: str) -> str:
|
49
49
|
tag = parent.find(".//d:var[@name='%s']" % name, self.nsmap)
|
@@ -165,6 +165,9 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
165
165
|
def parse(self, element: ET.Element, doc: EBModel):
|
166
166
|
pass
|
167
167
|
|
168
|
+
def parse_preference(self, element: ET.Element, doc: PreferenceModel):
|
169
|
+
pass
|
170
|
+
|
168
171
|
def load_xdm(self, filename: str) -> ET.Element:
|
169
172
|
self.logger.info("Loading <%s>" % filename)
|
170
173
|
|
@@ -177,4 +180,8 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
177
180
|
|
178
181
|
def parse_xdm(self, filename: str, doc: EBModel):
|
179
182
|
root_tag = self.load_xdm(filename)
|
180
|
-
self.parse(root_tag, doc)
|
183
|
+
self.parse(root_tag, doc)
|
184
|
+
|
185
|
+
def parse_preference_xdm(self, filename: str, doc: EBModel):
|
186
|
+
root_tag = self.load_xdm(filename)
|
187
|
+
self.parse_preference(root_tag, doc)
|
eb_model/parser/os_xdm_parser.py
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
import xml.etree.ElementTree as ET
|
2
|
-
|
3
2
|
from ..models.eb_doc import EBModel
|
4
|
-
from ..models.os_xdm import Os, OsAlarm, OsAlarmActivateTask, OsAlarmCallback, OsAlarmIncrementCounter, OsAlarmSetEvent, OsCounter, OsScheduleTable, OsScheduleTableEventSetting, OsScheduleTableExpiryPoint, OsScheduleTableTaskActivation, OsScheduleTblAdjustableExpPoint,
|
3
|
+
from ..models.os_xdm import Os, OsAlarm, OsAlarmActivateTask, OsAlarmCallback, OsAlarmIncrementCounter, OsAlarmSetEvent, OsCounter, OsScheduleTable, OsScheduleTableEventSetting, OsScheduleTableExpiryPoint, OsScheduleTableTaskActivation, OsScheduleTblAdjustableExpPoint, OsTaskAutostart
|
4
|
+
from ..models.os_xdm import OsTask, OsIsr, OsApplication
|
5
5
|
from .eb_parser import AbstractEbModelParser
|
6
6
|
|
7
|
-
|
8
7
|
class OsXdmParser(AbstractEbModelParser):
|
9
8
|
def __init__(self, ) -> None:
|
10
9
|
super().__init__()
|
@@ -20,6 +19,15 @@ class OsXdmParser(AbstractEbModelParser):
|
|
20
19
|
self.read_os_alarms(element, os)
|
21
20
|
self.read_os_schedule_tables(element, os)
|
22
21
|
self.read_os_counters(element, os)
|
22
|
+
self.read_os_applications(element, os)
|
23
|
+
|
24
|
+
def read_os_task_autostart(self, element: ET.Element, os_task: OsTask):
|
25
|
+
ctr_tag = self.find_ctr_tag(element, "OsTaskAutostart")
|
26
|
+
if ctr_tag is not None:
|
27
|
+
autostart = OsTaskAutostart(os_task, ctr_tag.attrib["name"])
|
28
|
+
for app_mode_ref in self.read_ref_value_list(ctr_tag, "OsTaskAppModeRef"):
|
29
|
+
autostart.addOsTaskAppModeRef(app_mode_ref)
|
30
|
+
os_task.setOsTaskAutostart(autostart)
|
23
31
|
|
24
32
|
def read_os_tasks(self, element: ET.Element, os: Os):
|
25
33
|
for ctr_tag in self.find_ctr_tag_list(element, "OsTask"):
|
@@ -27,11 +35,14 @@ class OsXdmParser(AbstractEbModelParser):
|
|
27
35
|
os_task.setOsTaskPriority(int(self.read_value(ctr_tag, "OsTaskPriority"))) \
|
28
36
|
.setOsTaskActivation(self.read_value(ctr_tag, "OsTaskActivation")) \
|
29
37
|
.setOsTaskSchedule(self.read_value(ctr_tag, "OsTaskSchedule")) \
|
38
|
+
.setOsTaskType(self.read_value(ctr_tag, "OsTaskType")) \
|
30
39
|
.setOsStacksize(int(self.read_optional_value(ctr_tag, "OsStacksize", 0)))
|
31
40
|
|
32
41
|
for resource_ref in self.read_ref_value_list(ctr_tag, "OsTaskResourceRef"):
|
33
42
|
os_task.addOsTaskResourceRef(resource_ref)
|
34
43
|
|
44
|
+
self.read_os_task_autostart(ctr_tag, os_task)
|
45
|
+
|
35
46
|
self.logger.debug("Read OsTask <%s>" % os_task.getName())
|
36
47
|
os.addOsTask(os_task)
|
37
48
|
|
@@ -62,7 +73,7 @@ class OsXdmParser(AbstractEbModelParser):
|
|
62
73
|
.setOsAlarmSetEventTaskRef(self.read_ref_value(element, "OsAlarmSetEventTaskRef"))
|
63
74
|
elif chc == "OsAlarmCallback":
|
64
75
|
os_alarm_action = OsAlarmCallback(os_alarm, "OsAlarmCallback") \
|
65
|
-
.setOsAlarmCallbackName(self.read_value(
|
76
|
+
.setOsAlarmCallbackName(self.read_value(element, "OsAlarmCallbackName"))
|
66
77
|
else:
|
67
78
|
raise ValueError("Unsupported OsAlarmAction <%s>" % chc)
|
68
79
|
os_alarm.setOsAlarmAction(os_alarm_action)
|
@@ -140,3 +151,14 @@ class OsXdmParser(AbstractEbModelParser):
|
|
140
151
|
|
141
152
|
self.logger.debug("Read OsCounter <%s>" % counter.getName())
|
142
153
|
os.addOsScheduleTable(counter)
|
154
|
+
|
155
|
+
def read_os_applications(self, element: ET.Element, os: Os):
|
156
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsApplication"):
|
157
|
+
os_app = OsApplication(os, ctr_tag.attrib["name"]) \
|
158
|
+
.setOsTrusted(self.read_value(ctr_tag, "OsTrusted"))
|
159
|
+
|
160
|
+
for ref in self.read_ref_value_list(ctr_tag, "OsAppResourceRef"):
|
161
|
+
os_app.addOsAppResourceRef(ref)
|
162
|
+
|
163
|
+
self.logger.debug("Read OsApplication <%s>" % os_app.getName())
|
164
|
+
os.addOsApplication(os_app)
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import xml.etree.ElementTree as ET
|
2
|
+
import logging
|
3
|
+
from ..models.eb_doc import PreferenceModel
|
4
|
+
from ..models.importer_xdm import SystemDescriptionImporter
|
5
|
+
from . import AbstractEbModelParser
|
6
|
+
|
7
|
+
class PerfXdmParser(AbstractEbModelParser):
|
8
|
+
def __init__(self, ) -> None:
|
9
|
+
super().__init__()
|
10
|
+
|
11
|
+
self.logger = logging.getLogger()
|
12
|
+
|
13
|
+
def parse_input_files(self, element: ET.Element, importer: SystemDescriptionImporter):
|
14
|
+
for ctr_tag in self.find_ctr_tag_list(element, "InputFiles"):
|
15
|
+
file_name = self.read_value(ctr_tag, "FileName")
|
16
|
+
self.logger.debug("Add the file <%s>" % file_name)
|
17
|
+
importer.addInputFile(file_name)
|
18
|
+
|
19
|
+
def parse_preference(self, element: ET.Element, doc: PreferenceModel):
|
20
|
+
importer = doc.getSystemDescriptionImporter()
|
21
|
+
|
22
|
+
for ctr_tag in self.find_ctr_tag_list(element, "SystemDescriptionImporters"):
|
23
|
+
self.logger.info("Parse SystemDescriptionImporters: <%s>" % ctr_tag.attrib["name"])
|
24
|
+
self.parse_input_files(ctr_tag, importer)
|
25
|
+
#importer.addInputFile()
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import pytest
|
2
|
-
from ...models.eb_doc import EBModel
|
2
|
+
from ...models.eb_doc import EBModel, PreferenceModel
|
3
3
|
|
4
4
|
class TestEBModel:
|
5
5
|
|
@@ -28,3 +28,16 @@ class TestEBModel:
|
|
28
28
|
document = EBModel.getInstance()
|
29
29
|
rte = document.getRte()
|
30
30
|
assert (rte.getFullName() == "/Rte/Rte")
|
31
|
+
|
32
|
+
class TestPreferenceModel:
|
33
|
+
|
34
|
+
def test_mode_get_system_description_importer(self):
|
35
|
+
document = PreferenceModel.getInstance()
|
36
|
+
importer = document.getSystemDescriptionImporter()
|
37
|
+
assert (importer.getFullName() == "/ImporterExporterAdditions/SystemDescriptionImporters")
|
38
|
+
|
39
|
+
importer = document.find("/ImporterExporterAdditions/SystemDescriptionImporters")
|
40
|
+
assert (importer.getFullName() == "/ImporterExporterAdditions/SystemDescriptionImporters")
|
41
|
+
|
42
|
+
importer = document.getSystemDescriptionImporter()
|
43
|
+
assert (importer.getFullName() == "/ImporterExporterAdditions/SystemDescriptionImporters")
|
@@ -0,0 +1 @@
|
|
1
|
+
from .text_writer import TextPreferenceModelWriter
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import logging
|
2
|
+
from typing import List
|
3
|
+
|
4
|
+
from ..models.eb_doc import SystemDescriptionImporter
|
5
|
+
|
6
|
+
class TextWriter:
|
7
|
+
def __init__(self):
|
8
|
+
self.logger = logging.getLogger()
|
9
|
+
|
10
|
+
def write(self, filename: str, lines: List[str]):
|
11
|
+
with open(filename, "w") as f_out:
|
12
|
+
for line in lines:
|
13
|
+
f_out.write("%s\n" % line)
|
14
|
+
|
15
|
+
class TextPreferenceModelWriter(TextWriter):
|
16
|
+
def __init__(self):
|
17
|
+
super().__init__()
|
18
|
+
|
19
|
+
def writer_import_files(self, filename: str, importer: SystemDescriptionImporter, param = {'base_path': None}):
|
20
|
+
self.logger.info("Generate import files list <%s>" % filename)
|
21
|
+
lines = []
|
22
|
+
for file in sorted(importer.getParsedInputFiles(param['base_path'], param['wildcard'])):
|
23
|
+
if file in lines:
|
24
|
+
self.logger.warning("file <%s> is duplicated." % file)
|
25
|
+
else:
|
26
|
+
lines.append(file)
|
27
|
+
|
28
|
+
self.write(filename, lines)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: py-eb-model
|
3
|
-
Version: 1.0.
|
3
|
+
Version: 1.0.3
|
4
4
|
Summary: The parser for EB XDM file
|
5
5
|
Home-page: UNKNOWN
|
6
6
|
Author: melodypapa
|
@@ -76,6 +76,13 @@ rte-xdm-xlsx data/Rte.xdm data/Rte.xlsx
|
|
76
76
|
rte-xdm-xlsx -r data/Rte.xdm data/Os.xdm data/Runnable.xlsx
|
77
77
|
```
|
78
78
|
|
79
|
+
## 3.3. pref-system-importer
|
80
|
+
|
81
|
+
Read the EB preference XDM and generate the file list into text file.
|
82
|
+
|
83
|
+
```bash
|
84
|
+
pref-system-importer .prefs/pref_imp_exp_Imp_System.xdm data/output.lst --base-path /c/EB/ACG-8_8_8_WIN32X86/workspace/simple_demo_rte
|
85
|
+
```
|
79
86
|
|
80
87
|
# 4. Change History
|
81
88
|
|
@@ -89,6 +96,15 @@ rte-xdm-xlsx -r data/Rte.xdm data/Os.xdm data/Runnable.xlsx
|
|
89
96
|
1. Change the attribute to start with lowercase
|
90
97
|
2. *read_ref_value* and *read_optional_ref_value* method returns EcucRefType.
|
91
98
|
3. Read the OsScheduleTable and export to excel
|
92
|
-
4.
|
99
|
+
4. Read the OsCounter and export to excel
|
100
|
+
|
101
|
+
**Version 1.0.2**
|
102
|
+
|
103
|
+
1. Fix the setOsAlarmCallbackName bug
|
104
|
+
|
105
|
+
**Version 1.0.3**
|
93
106
|
|
107
|
+
1. Generate the System import file list based on EB preference Xdm.
|
108
|
+
2. Add the support to read OsTaskAutostart element.
|
109
|
+
3. Add the support to read OsTaskType element.
|
94
110
|
|
@@ -1,17 +1,20 @@
|
|
1
|
-
eb_model/__init__.py,sha256=
|
1
|
+
eb_model/__init__.py,sha256=oMw5xoAS-lHLxufQSlBIXhGZZMcPmwGFA3PYpTwaQTU,92
|
2
2
|
eb_model/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
3
|
eb_model/cli/os_xdm_2_xls_cli.py,sha256=lTIYNVDDMIKu6sosjV8I3pLQxD-I11cKjUDXTyKDrLE,1643
|
4
|
+
eb_model/cli/pref_system_importer_cli.py,sha256=Disewp4_4Z1xHb_4HqwRj16XVQmAP21MbeVsSuR0uvk,2518
|
4
5
|
eb_model/cli/rte_xdm_2_xls_cli.py,sha256=83uzE2Vk0h267gWxF9mnWN3Bh69RJpYyKULFXpxTByY,2127
|
5
|
-
eb_model/models/__init__.py,sha256=
|
6
|
+
eb_model/models/__init__.py,sha256=7_WxCwRdVavLbPzepHWNar3O-rOxhLwmVYWd2pqm2kI,124
|
6
7
|
eb_model/models/abstract.py,sha256=4jy328yy2sedIHNwfxjzW3CnVsnTCoskatT8JXjv-rE,2402
|
7
|
-
eb_model/models/eb_doc.py,sha256=
|
8
|
-
eb_model/models/
|
9
|
-
eb_model/models/
|
10
|
-
eb_model/
|
11
|
-
eb_model/parser/
|
8
|
+
eb_model/models/eb_doc.py,sha256=hPsGdNHlm3vl-ys3B3NGrlJRrWAWPhRvFJrN3fLQTW8,2569
|
9
|
+
eb_model/models/importer_xdm.py,sha256=Fnrx-TWKVzJ-kJQr_5DHJhPtEVJ7Ztu5oQZS6_y-UnY,1712
|
10
|
+
eb_model/models/os_xdm.py,sha256=HrAhFiPkbkE_YBihG2S5lQTTU9IQla7O15E8guKLDXg,32439
|
11
|
+
eb_model/models/rte_xdm.py,sha256=73hBsQ7pUePA9ewFI2d50iImI_FA-jzFQFlnp0K6WTs,19407
|
12
|
+
eb_model/parser/__init__.py,sha256=7VOmPr4dng_TrOyDZFu2_s3r0BJZQGiOUxALMY8EnqI,170
|
13
|
+
eb_model/parser/eb_parser.py,sha256=XAJZ_agd54C5R4UAAlHfwaVWYFQRSXuTjM_ijcpVU4E,7375
|
12
14
|
eb_model/parser/eb_parser_factory.py,sha256=zqsqq52uImU4-WcS5dvHfhM95hiEPAGRtNzVik8i8wc,971
|
13
|
-
eb_model/parser/os_xdm_parser.py,sha256=
|
14
|
-
eb_model/parser/
|
15
|
+
eb_model/parser/os_xdm_parser.py,sha256=xnA1C91Jpd2MGFvdV4Xu03vZLh6IgsUCarEVRmh8_mQ,9635
|
16
|
+
eb_model/parser/pref_xdm_parser.py,sha256=khzgD_igMauH7H3OXdFmFc-HspLq8U51wC6CAs6jJHc,1097
|
17
|
+
eb_model/parser/rte_xdm_parser.py,sha256=ywAJiBTgI2WifB-rSdoh6PWvRZ4hSSdy4hmdilSTfU0,4027
|
15
18
|
eb_model/reporter/__init__.py,sha256=H8D_23UwJi1Ph6yjBfZhxWVbu9ci5_O4471gqXGiZCM,36
|
16
19
|
eb_model/reporter/markdown.py,sha256=NhcJOFQ_BVbkgGe66uAT7KUPIchWU4kfVMtMLQtbK-w,1647
|
17
20
|
eb_model/reporter/excel_reporter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -20,8 +23,10 @@ eb_model/reporter/excel_reporter/os_xdm.py,sha256=n1e-tU04s0oh3v31OUKgkIju6BUAtC
|
|
20
23
|
eb_model/reporter/excel_reporter/rte_xdm.py,sha256=JweusBQJSg1_jaFbQV3sJnVMALMj3VuEkVf15Pw-Ir4,3936
|
21
24
|
eb_model/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
22
25
|
eb_model/tests/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
23
|
-
eb_model/tests/models/test_eb_model.py,sha256=
|
26
|
+
eb_model/tests/models/test_eb_model.py,sha256=3fpIHhzQlf9KZjm4fZxcSTT4Zio6YhTrcn9UBvlhOfo,1632
|
24
27
|
eb_model/tests/models/test_ecuc_container.py,sha256=lZmtXwPMz9T52WFduTgFy16fO2agjSW-Rl2cVypM86s,722
|
28
|
+
eb_model/writer/__init__.py,sha256=SE-Kj41HUkVPor7jpNTL3JVPe_9ycmKFWjTFo2VTkTo,50
|
29
|
+
eb_model/writer/text_writer.py,sha256=ZSQ6xi-ke41rrchK1474cRNdHRoyj_gucp3GnvZ-ERU,971
|
25
30
|
py_eb_model/__init__.py,sha256=u3VUin2V_1eExLd9NIpw_LGHIAwaG2vEoyhssZurrvM,69
|
26
31
|
py_eb_model/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
27
32
|
py_eb_model/cli/os_xdm_2_xls_cli.py,sha256=BzeFhyWHbG57qieDNESaXYggszHSy17uwCeXvEfrbCQ,1629
|
@@ -37,9 +42,9 @@ py_eb_model/reporter/markdown.py,sha256=NhcJOFQ_BVbkgGe66uAT7KUPIchWU4kfVMtMLQtb
|
|
37
42
|
py_eb_model/reporter/excel_reporter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
38
43
|
py_eb_model/reporter/excel_reporter/abstract.py,sha256=BOuLhWwwTwqBzErtmwPrelB1iByMfZP9haFmg9ayFQw,1488
|
39
44
|
py_eb_model/reporter/excel_reporter/os_xdm.py,sha256=WGMxK0PYxi9J5fUZ-EeiiM8NBpIg2WyxRsrN-gK37YE,1589
|
40
|
-
py_eb_model-1.0.
|
41
|
-
py_eb_model-1.0.
|
42
|
-
py_eb_model-1.0.
|
43
|
-
py_eb_model-1.0.
|
44
|
-
py_eb_model-1.0.
|
45
|
-
py_eb_model-1.0.
|
45
|
+
py_eb_model-1.0.3.dist-info/LICENSE,sha256=I52rGS7W1IwAmYCUfqTpDaSHoFAdt7grcNiBhk-Z3eI,1088
|
46
|
+
py_eb_model-1.0.3.dist-info/METADATA,sha256=P8PNKJ-FPWiO9QHD-XRWDNyhOmA-DfPO-G5uxkFfPrQ,2908
|
47
|
+
py_eb_model-1.0.3.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
|
48
|
+
py_eb_model-1.0.3.dist-info/entry_points.txt,sha256=Kyh2T53j1CnqayX2ZZa7---hLeXK7LidefeO1hJ_EXg,185
|
49
|
+
py_eb_model-1.0.3.dist-info/top_level.txt,sha256=DGBNh6YW_x4RF_UoLKW3cKqb2SLnmfuEIZlkTewR66A,9
|
50
|
+
py_eb_model-1.0.3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|