py-eb-model 1.0.0__py3-none-any.whl → 1.1.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/os_xdm_2_xls_cli.py +21 -12
- eb_model/cli/pref_system_importer_cli.py +94 -0
- py_eb_model/cli/os_xdm_2_xls_cli.py → eb_model/cli/rte_xdm_2_xls_cli.py +18 -9
- eb_model/models/__init__.py +2 -0
- eb_model/models/abstract.py +86 -13
- eb_model/models/eb_doc.py +55 -27
- eb_model/models/eclipse_project.py +8 -0
- eb_model/models/importer_xdm.py +115 -0
- eb_model/models/os_xdm.py +893 -98
- eb_model/models/rte_xdm.py +604 -0
- eb_model/parser/__init__.py +3 -0
- eb_model/parser/eb_parser.py +92 -39
- eb_model/parser/eb_parser_factory.py +29 -0
- eb_model/parser/os_xdm_parser.py +173 -28
- eb_model/parser/pref_xdm_parser.py +36 -0
- eb_model/parser/rte_xdm_parser.py +95 -0
- eb_model/reporter/excel_reporter/abstract.py +11 -11
- eb_model/reporter/excel_reporter/os_xdm.py +109 -12
- eb_model/reporter/excel_reporter/rte_xdm.py +87 -0
- eb_model/tests/models/test_eb_model.py +19 -1
- eb_model/tests/models/test_importer_xdm.py +61 -0
- eb_model/writer/__init__.py +2 -0
- eb_model/writer/project_writer.py +71 -0
- eb_model/writer/text_writer.py +28 -0
- py_eb_model-1.1.3.dist-info/METADATA +194 -0
- py_eb_model-1.1.3.dist-info/RECORD +38 -0
- py_eb_model-1.1.3.dist-info/entry_points.txt +5 -0
- py_eb_model/__init__.py +0 -3
- py_eb_model/cli/__init__.py +0 -0
- py_eb_model/models/__init__.py +0 -3
- py_eb_model/models/abstract.py +0 -66
- py_eb_model/models/eb_doc.py +0 -52
- py_eb_model/models/os_xdm.py +0 -220
- py_eb_model/parser/__init__.py +0 -1
- py_eb_model/parser/eb_parser.py +0 -147
- py_eb_model/parser/os_xdm_parser.py +0 -43
- py_eb_model/reporter/__init__.py +0 -1
- py_eb_model/reporter/excel_reporter/__init__.py +0 -0
- py_eb_model/reporter/excel_reporter/abstract.py +0 -43
- py_eb_model/reporter/excel_reporter/os_xdm.py +0 -44
- py_eb_model/reporter/markdown.py +0 -40
- py_eb_model-1.0.0.dist-info/METADATA +0 -16
- py_eb_model-1.0.0.dist-info/RECORD +0 -40
- py_eb_model-1.0.0.dist-info/entry_points.txt +0 -3
- {py_eb_model-1.0.0.dist-info → py_eb_model-1.1.3.dist-info}/LICENSE +0 -0
- {py_eb_model-1.0.0.dist-info → py_eb_model-1.1.3.dist-info}/WHEEL +0 -0
- {py_eb_model-1.0.0.dist-info → py_eb_model-1.1.3.dist-info}/top_level.txt +0 -0
eb_model/__init__.py
CHANGED
eb_model/cli/os_xdm_2_xls_cli.py
CHANGED
@@ -8,13 +8,16 @@ from ..parser import OsXdmParser
|
|
8
8
|
from ..models import EBModel
|
9
9
|
from ..reporter import OsXdmXlsWriter
|
10
10
|
|
11
|
+
|
11
12
|
def main():
|
12
13
|
version = pkg_resources.require("py_eb_model")[0].version
|
13
14
|
|
14
15
|
ap = argparse.ArgumentParser()
|
15
|
-
ap.
|
16
|
-
ap.add_argument("
|
17
|
-
ap.add_argument("
|
16
|
+
ap.description = "Version: %s" % version
|
17
|
+
ap.add_argument("-v", "--verbose", required=False, help="Print debug information.", action="store_true")
|
18
|
+
ap.add_argument("--skip-os-task", required=False, help="Skip to generate Os task.", action="store_true")
|
19
|
+
ap.add_argument("INPUT", help="The path of Os.xdm.")
|
20
|
+
ap.add_argument("OUTPUT", help="The path of excel file.")
|
18
21
|
|
19
22
|
args = ap.parse_args()
|
20
23
|
|
@@ -31,28 +34,34 @@ def main():
|
|
31
34
|
if os.path.exists(log_file):
|
32
35
|
os.remove(log_file)
|
33
36
|
|
34
|
-
|
35
|
-
|
37
|
+
if args.verbose:
|
38
|
+
file_handler = logging.FileHandler(log_file)
|
39
|
+
file_handler.setFormatter(formatter)
|
40
|
+
file_handler.setLevel(logging.DEBUG)
|
36
41
|
|
37
42
|
logger.setLevel(logging.DEBUG)
|
38
|
-
file_handler.setLevel(logging.DEBUG)
|
39
43
|
|
40
44
|
if args.verbose:
|
41
45
|
stdout_handler.setLevel(logging.DEBUG)
|
42
|
-
|
43
46
|
else:
|
44
47
|
stdout_handler.setLevel(logging.INFO)
|
45
48
|
|
46
|
-
|
47
|
-
|
49
|
+
if args.verbose:
|
50
|
+
logger.addHandler(file_handler)
|
51
|
+
logger.addHandler(stdout_handler)
|
48
52
|
|
49
53
|
try:
|
50
54
|
doc = EBModel.getInstance()
|
55
|
+
|
51
56
|
parser = OsXdmParser()
|
52
|
-
|
57
|
+
parser.parse_xdm(args.INPUT, doc)
|
53
58
|
|
54
|
-
|
55
|
-
|
59
|
+
options = {"skip_os_task": False}
|
60
|
+
if args.skip_os_task:
|
61
|
+
options['skip_os_task'] = True
|
62
|
+
|
63
|
+
writer = OsXdmXlsWriter()
|
64
|
+
writer.write(args.OUTPUT, doc, options)
|
56
65
|
|
57
66
|
except Exception as e:
|
58
67
|
logger.error(e)
|
@@ -0,0 +1,94 @@
|
|
1
|
+
import argparse
|
2
|
+
import pkg_resources
|
3
|
+
import logging
|
4
|
+
import sys
|
5
|
+
import os.path
|
6
|
+
import re
|
7
|
+
|
8
|
+
from ..writer import TextPreferenceModelWriter, ABProjectWriter
|
9
|
+
from ..parser import PerfXdmParser
|
10
|
+
from ..models import PreferenceModel
|
11
|
+
|
12
|
+
def main():
|
13
|
+
version = pkg_resources.require("py_eb_model")[0].version
|
14
|
+
|
15
|
+
ap = argparse.ArgumentParser()
|
16
|
+
ap.add_argument("-v", "--verbose", required= False, help = "print debug information.", action = "store_true")
|
17
|
+
ap.add_argument("--file-list", required=False, help = "generate the file list (Default)", action = "store_true")
|
18
|
+
ap.add_argument("--ab-project", required=False, help = "generate the AUTOSAR builder project", action = "store_true")
|
19
|
+
ap.add_argument("--base-path", required=True, help="base Path for EB tresos")
|
20
|
+
ap.add_argument("--env", required=False, help="specify the environment variable", nargs='+')
|
21
|
+
ap.add_argument("--project", required=False, help="specify the project name")
|
22
|
+
ap.add_argument("INPUTS", nargs='+', help = "The path of perf_imp_xxx.xdm.")
|
23
|
+
ap.add_argument("OUTPUT", help = "The path of output 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, 'pref_system_importer.log')
|
36
|
+
|
37
|
+
if os.path.exists(log_file):
|
38
|
+
os.remove(log_file)
|
39
|
+
|
40
|
+
if args.verbose:
|
41
|
+
file_handler = logging.FileHandler(log_file)
|
42
|
+
file_handler.setFormatter(formatter)
|
43
|
+
file_handler.setLevel(logging.DEBUG)
|
44
|
+
|
45
|
+
logger.setLevel(logging.DEBUG)
|
46
|
+
|
47
|
+
if args.verbose:
|
48
|
+
stdout_handler.setLevel(logging.DEBUG)
|
49
|
+
else:
|
50
|
+
stdout_handler.setLevel(logging.INFO)
|
51
|
+
|
52
|
+
if args.verbose:
|
53
|
+
logger.addHandler(file_handler)
|
54
|
+
logger.addHandler(stdout_handler)
|
55
|
+
|
56
|
+
format = "file_list"
|
57
|
+
if args.ab_project:
|
58
|
+
format = "ab_project"
|
59
|
+
|
60
|
+
try:
|
61
|
+
doc = PreferenceModel.getInstance()
|
62
|
+
|
63
|
+
params = {}
|
64
|
+
params['base_path'] = args.base_path
|
65
|
+
params['wildcard'] = True
|
66
|
+
params['project'] = args.project
|
67
|
+
|
68
|
+
parser = PerfXdmParser()
|
69
|
+
for file in args.INPUTS:
|
70
|
+
if args.base_path is not None:
|
71
|
+
file_name = os.path.realpath(os.path.join(args.base_path, file))
|
72
|
+
else:
|
73
|
+
file_name = file
|
74
|
+
parser.parse_preference_xdm(file_name, doc)
|
75
|
+
|
76
|
+
parser.add_ecu_extract(doc, params)
|
77
|
+
|
78
|
+
if args.env is not None:
|
79
|
+
for env in args.env:
|
80
|
+
m = re.match(r'(\w+)=([:\/\\\.\w]+)', env)
|
81
|
+
if m:
|
82
|
+
params["env_var:%s" % m.group(1)] = m.group(2)
|
83
|
+
#params['tresos_output_base_dir'] = args.TRESOS_OUTPUT_BASE_DIR
|
84
|
+
|
85
|
+
if format == "file_list":
|
86
|
+
writer = TextPreferenceModelWriter()
|
87
|
+
writer.writer_import_files(args.OUTPUT, doc.getSystemDescriptionImporter(), params)
|
88
|
+
elif format == "ab_project":
|
89
|
+
writer = ABProjectWriter()
|
90
|
+
writer.writer_import_files(args.OUTPUT, doc.getSystemDescriptionImporter(), params)
|
91
|
+
|
92
|
+
except Exception as e:
|
93
|
+
logger.error(e)
|
94
|
+
raise e
|
@@ -4,29 +4,32 @@ import logging
|
|
4
4
|
import sys
|
5
5
|
import os.path
|
6
6
|
|
7
|
-
from
|
7
|
+
from eb_model.parser.eb_parser_factory import EbParserFactory
|
8
|
+
|
9
|
+
from ..reporter.excel_reporter.rte_xdm import RteRunnableEntityXlsWriter, RteXdmXlsWriter
|
10
|
+
from ..parser.rte_xdm_parser import RteXdmParser
|
8
11
|
from ..models import EBModel
|
9
|
-
from ..reporter import OsXdmXlsWriter
|
10
12
|
|
11
13
|
def main():
|
12
14
|
version = pkg_resources.require("py_eb_model")[0].version
|
13
15
|
|
14
16
|
ap = argparse.ArgumentParser()
|
15
17
|
ap.add_argument("-v", "--verbose", required= False, help= "Print debug information", action= "store_true")
|
16
|
-
ap.add_argument("
|
18
|
+
ap.add_argument("-r", "--runnable", required= False, help= "Export the runnable entities", action= "store_true")
|
19
|
+
ap.add_argument("INPUT", help = "The path of xdm file.", nargs='+')
|
17
20
|
ap.add_argument("OUTPUT", help = "The path of excel file.")
|
18
21
|
|
19
22
|
args = ap.parse_args()
|
20
23
|
|
21
24
|
logger = logging.getLogger()
|
22
25
|
|
23
|
-
formatter = logging.Formatter('[%(levelname)s] : %(message)s')
|
26
|
+
formatter = logging.Formatter('[%(levelname)s] [%(asctime)s]: %(message)s')
|
24
27
|
|
25
28
|
stdout_handler = logging.StreamHandler(sys.stderr)
|
26
29
|
stdout_handler.setFormatter(formatter)
|
27
30
|
|
28
31
|
base_path = os.path.dirname(args.OUTPUT)
|
29
|
-
log_file = os.path.join(base_path, '
|
32
|
+
log_file = os.path.join(base_path, 'rte_xdm_2_xls.log')
|
30
33
|
|
31
34
|
if os.path.exists(log_file):
|
32
35
|
os.remove(log_file)
|
@@ -48,11 +51,17 @@ def main():
|
|
48
51
|
|
49
52
|
try:
|
50
53
|
doc = EBModel.getInstance()
|
51
|
-
parser = OsXdmParser()
|
52
|
-
writer = OsXdmXlsWriter()
|
53
54
|
|
54
|
-
|
55
|
-
|
55
|
+
for input_file in args.INPUT:
|
56
|
+
parser = EbParserFactory.create(input_file)
|
57
|
+
parser.parse_xdm(input_file, doc)
|
58
|
+
|
59
|
+
if args.runnable:
|
60
|
+
writer = RteRunnableEntityXlsWriter()
|
61
|
+
writer.write(args.OUTPUT, doc)
|
62
|
+
else:
|
63
|
+
writer = RteXdmXlsWriter()
|
64
|
+
writer.write(args.OUTPUT, doc)
|
56
65
|
|
57
66
|
except Exception as e:
|
58
67
|
logger.error(e)
|
eb_model/models/__init__.py
CHANGED
eb_model/models/abstract.py
CHANGED
@@ -1,35 +1,34 @@
|
|
1
1
|
from abc import ABCMeta
|
2
|
-
from typing import Dict
|
3
|
-
|
2
|
+
from typing import Dict
|
3
|
+
import re
|
4
4
|
|
5
5
|
class EcucObject(metaclass=ABCMeta):
|
6
6
|
def __init__(self, parent, name) -> None:
|
7
7
|
if type(self) == EcucObject:
|
8
8
|
raise ValueError("Abstract EcucObject cannot be initialized.")
|
9
9
|
|
10
|
-
self.
|
11
|
-
self.
|
10
|
+
self.name = name
|
11
|
+
self.parent = parent # type: EcucObject
|
12
12
|
|
13
13
|
if isinstance(parent, EcucContainer):
|
14
14
|
parent.addElement(self)
|
15
15
|
|
16
16
|
def getName(self):
|
17
|
-
return self.
|
17
|
+
return self.name
|
18
18
|
|
19
19
|
def setName(self, value):
|
20
|
-
self.
|
20
|
+
self.name = value
|
21
21
|
return self
|
22
22
|
|
23
23
|
def getParent(self):
|
24
|
-
return self.
|
24
|
+
return self.parent
|
25
25
|
|
26
26
|
def setParent(self, value):
|
27
|
-
self.
|
27
|
+
self.parent = value
|
28
28
|
return self
|
29
29
|
|
30
30
|
def getFullName(self) -> str:
|
31
|
-
return self.
|
32
|
-
|
31
|
+
return self.parent.getFullName() + "/" + self.name
|
33
32
|
|
34
33
|
class EcucContainer(EcucObject):
|
35
34
|
def __init__(self, parent, name) -> None:
|
@@ -43,7 +42,7 @@ class EcucContainer(EcucObject):
|
|
43
42
|
|
44
43
|
def addElement(self, object: EcucObject):
|
45
44
|
if object.getName() not in self.elements:
|
46
|
-
object.
|
45
|
+
object.parent = self
|
47
46
|
self.elements[object.getName()] = object
|
48
47
|
|
49
48
|
return self
|
@@ -62,5 +61,79 @@ class EcucContainer(EcucObject):
|
|
62
61
|
return self.elements[name]
|
63
62
|
|
64
63
|
class EcucRefType:
|
65
|
-
def __init__(self) -> None:
|
66
|
-
self.
|
64
|
+
def __init__(self, value: str) -> None:
|
65
|
+
self.value = value
|
66
|
+
|
67
|
+
def getValue(self) -> str:
|
68
|
+
return self.value
|
69
|
+
|
70
|
+
def setValue(self, value: str):
|
71
|
+
self.value = value
|
72
|
+
return self
|
73
|
+
|
74
|
+
def __str__(self) -> str:
|
75
|
+
return self.value
|
76
|
+
|
77
|
+
def getShortName(self) -> str:
|
78
|
+
if self.value is None:
|
79
|
+
raise ValueError("Invalid value of EcucRefType")
|
80
|
+
m = re.match(r'\/[\w\/]+\/(\w+)', self.value)
|
81
|
+
if m:
|
82
|
+
return m.group(1)
|
83
|
+
return self.value
|
84
|
+
|
85
|
+
class Version:
|
86
|
+
def __init__(self):
|
87
|
+
self.majorVersion = None
|
88
|
+
self.minorVersion = None
|
89
|
+
self.patchVersion = None
|
90
|
+
|
91
|
+
def getMajorVersion(self):
|
92
|
+
return self.majorVersion
|
93
|
+
|
94
|
+
def setMajorVersion(self, value):
|
95
|
+
if value is not None:
|
96
|
+
self.majorVersion = value
|
97
|
+
return self
|
98
|
+
|
99
|
+
def getMinorVersion(self):
|
100
|
+
return self.minorVersion
|
101
|
+
|
102
|
+
def setMinorVersion(self, value):
|
103
|
+
if value is not None:
|
104
|
+
self.minorVersion = value
|
105
|
+
return self
|
106
|
+
|
107
|
+
def getPatchVersion(self):
|
108
|
+
return self.patchVersion
|
109
|
+
|
110
|
+
def setPatchVersion(self, value):
|
111
|
+
if value is not None:
|
112
|
+
self.patchVersion = value
|
113
|
+
return self
|
114
|
+
|
115
|
+
def getVersion(self) -> str:
|
116
|
+
return "%d.%d.%d" % (self.majorVersion, self.minorVersion, self.patchVersion)
|
117
|
+
|
118
|
+
class Module(EcucContainer):
|
119
|
+
def __init__(self, parent, name):
|
120
|
+
super().__init__(parent, name)
|
121
|
+
|
122
|
+
self.arVersion = Version()
|
123
|
+
self.swVersion = Version()
|
124
|
+
|
125
|
+
def getArVersion(self):
|
126
|
+
return self.arVersion
|
127
|
+
|
128
|
+
def setArVersion(self, value):
|
129
|
+
if value is not None:
|
130
|
+
self.arVersion = value
|
131
|
+
return self
|
132
|
+
|
133
|
+
def getSwVersion(self):
|
134
|
+
return self.swVersion
|
135
|
+
|
136
|
+
def setSwVersion(self, value):
|
137
|
+
if value is not None:
|
138
|
+
self.swVersion = value
|
139
|
+
return self
|
eb_model/models/eb_doc.py
CHANGED
@@ -1,52 +1,80 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
1
|
+
from .importer_xdm import SystemDescriptionImporter
|
2
|
+
from .rte_xdm import Rte
|
4
3
|
from .os_xdm import Os
|
5
4
|
from .abstract import EcucContainer, EcucObject
|
6
5
|
|
7
6
|
|
8
|
-
class
|
7
|
+
class AbstractModel(EcucContainer):
|
8
|
+
def getFullName(self):
|
9
|
+
return self.name
|
10
|
+
|
11
|
+
def clear(self):
|
12
|
+
self.elements = {}
|
13
|
+
|
14
|
+
def find_object(self, referred_name: str, element: EcucContainer) -> EcucObject:
|
15
|
+
name_list = referred_name.split("/")
|
16
|
+
# element = EBModel.getInstance()
|
17
|
+
for name in name_list:
|
18
|
+
if (name == ""):
|
19
|
+
continue
|
20
|
+
element = element.getElement(name)
|
21
|
+
if (element is None):
|
22
|
+
return element
|
23
|
+
# raise ValueError("The %s of reference <%s> does not exist." % (short_name, referred_name))
|
24
|
+
return element
|
25
|
+
|
26
|
+
|
27
|
+
class EBModel(AbstractModel):
|
9
28
|
__instance = None
|
10
29
|
|
11
30
|
@staticmethod
|
12
31
|
def getInstance():
|
13
|
-
if (EBModel.__instance
|
32
|
+
if (EBModel.__instance is None):
|
14
33
|
EBModel()
|
15
34
|
return EBModel.__instance
|
16
35
|
|
17
36
|
def __init__(self):
|
18
|
-
if (EBModel.__instance
|
37
|
+
if (EBModel.__instance is not None):
|
19
38
|
raise Exception("The EBModel is singleton!")
|
20
39
|
|
21
40
|
EcucContainer.__init__(self, None, "")
|
22
41
|
EBModel.__instance = self
|
23
42
|
|
24
|
-
def getFullName(self):
|
25
|
-
return self.Name
|
26
|
-
|
27
|
-
def clear(self):
|
28
|
-
self.elements = {}
|
29
|
-
|
30
43
|
def find(self, referred_name: str) -> EcucObject:
|
31
|
-
|
32
|
-
|
33
|
-
for name in name_list:
|
34
|
-
if (name == ""):
|
35
|
-
continue
|
36
|
-
element = element.getElement(name)
|
37
|
-
if (element == None):
|
38
|
-
return element
|
39
|
-
# raise ValueError("The %s of reference <%s> does not exist." % (short_name, referred_name))
|
40
|
-
return element
|
41
|
-
|
44
|
+
return self.find_object(referred_name, EBModel.getInstance())
|
45
|
+
|
42
46
|
def getOs(self) -> Os:
|
43
47
|
container = EcucContainer(self, "Os")
|
44
|
-
|
48
|
+
Os(container)
|
45
49
|
return self.find("/Os/Os")
|
46
|
-
|
47
|
-
|
48
50
|
|
51
|
+
def getRte(self) -> Rte:
|
52
|
+
container = EcucContainer(self, "Rte")
|
53
|
+
Rte(container)
|
54
|
+
return self.find("/Rte/Rte")
|
55
|
+
|
49
56
|
|
57
|
+
class PreferenceModel(AbstractModel):
|
58
|
+
__instance = None
|
59
|
+
|
60
|
+
@staticmethod
|
61
|
+
def getInstance():
|
62
|
+
if (PreferenceModel.__instance is None):
|
63
|
+
PreferenceModel()
|
64
|
+
return PreferenceModel.__instance
|
65
|
+
|
66
|
+
def __init__(self):
|
67
|
+
if (PreferenceModel.__instance is not None):
|
68
|
+
raise Exception("The PreferenceModel is singleton!")
|
50
69
|
|
70
|
+
EcucContainer.__init__(self, None, "")
|
71
|
+
PreferenceModel.__instance = self
|
51
72
|
|
52
|
-
|
73
|
+
container = EcucContainer(self, "ImporterExporterAdditions")
|
74
|
+
SystemDescriptionImporter(container, "SystemDescriptionImporters")
|
75
|
+
|
76
|
+
def find(self, referred_name: str) -> EcucObject:
|
77
|
+
return self.find_object(referred_name, PreferenceModel.getInstance())
|
78
|
+
|
79
|
+
def getSystemDescriptionImporter(self) -> SystemDescriptionImporter:
|
80
|
+
return self.find("/ImporterExporterAdditions/SystemDescriptionImporters")
|
@@ -0,0 +1,115 @@
|
|
1
|
+
from typing import Dict, List
|
2
|
+
|
3
|
+
from ..models.eclipse_project import Link
|
4
|
+
from ..models.abstract import EcucObject
|
5
|
+
import glob
|
6
|
+
import os
|
7
|
+
import re
|
8
|
+
import logging
|
9
|
+
|
10
|
+
class SystemDescriptionImporter(EcucObject):
|
11
|
+
def __init__(self, parent, name):
|
12
|
+
super().__init__(parent, name)
|
13
|
+
|
14
|
+
self.logger = logging.getLogger()
|
15
|
+
self.inputFiles = [] # type: List[str]
|
16
|
+
|
17
|
+
def getInputFiles(self):
|
18
|
+
return self.inputFiles
|
19
|
+
|
20
|
+
def addInputFile(self, value: str):
|
21
|
+
self.logger.debug("Add the file <%s>" % value)
|
22
|
+
self.inputFiles.append(value)
|
23
|
+
return self
|
24
|
+
|
25
|
+
def parseWildcard(self, filename: str) -> List[str]:
|
26
|
+
file_list = []
|
27
|
+
for file in glob.iglob(filename, recursive=True):
|
28
|
+
file_list.append(file)
|
29
|
+
return file_list
|
30
|
+
|
31
|
+
def getParsedInputFiles(self, params = {}) -> List[str]:
|
32
|
+
file_list = []
|
33
|
+
for input_file in self.inputFiles:
|
34
|
+
m = re.match(r'\$\{(env_var:\w+)\}(.*)', input_file)
|
35
|
+
if m and m.group(1) in params:
|
36
|
+
old_input_file = input_file
|
37
|
+
input_file = params[m.group(1)] + m.group(2)
|
38
|
+
self.logger.info("Replace Environment Variable Path: %s => %s" % (old_input_file, os.path.realpath(input_file)))
|
39
|
+
if params['base_path'] is not None:
|
40
|
+
if params['wildcard']:
|
41
|
+
m = re.match(r'(.+)\\(\*\.\w+)', input_file)
|
42
|
+
if m:
|
43
|
+
for file_name in self.parseWildcard(os.path.realpath(os.path.join(params['base_path'], input_file))):
|
44
|
+
file_list.append(file_name)
|
45
|
+
else:
|
46
|
+
file_list.append(os.path.realpath(os.path.join(params['base_path'], input_file)))
|
47
|
+
else:
|
48
|
+
file_list.append(os.path.realpath(os.path.join(params['base_path'], input_file)))
|
49
|
+
else:
|
50
|
+
file_list.append(input_file)
|
51
|
+
return file_list
|
52
|
+
|
53
|
+
def getAllPaths(self, path :str) -> List[str]:
|
54
|
+
path_segments = path.split("/")
|
55
|
+
|
56
|
+
result = []
|
57
|
+
long_path = ""
|
58
|
+
for path_segment in path_segments:
|
59
|
+
if path_segment == "..":
|
60
|
+
continue
|
61
|
+
if long_path == "":
|
62
|
+
long_path = path_segment
|
63
|
+
else:
|
64
|
+
long_path = long_path +"/" + path_segment
|
65
|
+
result.append(long_path)
|
66
|
+
return result
|
67
|
+
|
68
|
+
def getNameByPath(self, path : str):
|
69
|
+
path_segments = path.split("/")
|
70
|
+
|
71
|
+
result = []
|
72
|
+
count = 0
|
73
|
+
for path_segment in path_segments:
|
74
|
+
if path_segment == "..":
|
75
|
+
count += 1
|
76
|
+
else:
|
77
|
+
result.append(path_segment)
|
78
|
+
|
79
|
+
return (count , "/".join(result))
|
80
|
+
|
81
|
+
def getLinks(self, file_list: List[str]) -> List[Link]:
|
82
|
+
path_sets = {} # type: Dict[str, List[str]]
|
83
|
+
path_segment_sets = []
|
84
|
+
|
85
|
+
for file in file_list:
|
86
|
+
path, basename = os.path.split(file)
|
87
|
+
path = os.path.relpath(path).replace("\\", "/")
|
88
|
+
if path not in path_sets:
|
89
|
+
path_sets[path] = []
|
90
|
+
|
91
|
+
# To avoid the duplicate file
|
92
|
+
if basename not in path_sets[path]:
|
93
|
+
path_sets[path].append(basename)
|
94
|
+
|
95
|
+
links = []
|
96
|
+
for name in path_sets:
|
97
|
+
for path_segment in self.getAllPaths(name):
|
98
|
+
if path_segment not in path_sets:
|
99
|
+
if path_segment not in path_segment_sets:
|
100
|
+
path_segment_sets.append(path_segment)
|
101
|
+
|
102
|
+
for segment in path_segment_sets:
|
103
|
+
link = Link(segment, 2, "virtual:/virtual")
|
104
|
+
links.append(link)
|
105
|
+
|
106
|
+
for path_set in path_sets:
|
107
|
+
for basename in path_sets[path_set]:
|
108
|
+
path = os.path.relpath(os.path.join(path_set, basename)).replace("\\", "/")
|
109
|
+
count, name = self.getNameByPath(path)
|
110
|
+
link = Link(name, 1, "PARENT-%d-PROJECT_LOC/%s" % (count, name))
|
111
|
+
links.append(link)
|
112
|
+
|
113
|
+
return links
|
114
|
+
|
115
|
+
|