py-eb-model 1.0.0__py3-none-any.whl → 1.1.4__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 (48) hide show
  1. eb_model/__init__.py +2 -1
  2. eb_model/cli/os_xdm_2_xls_cli.py +21 -12
  3. eb_model/cli/pref_system_importer_cli.py +94 -0
  4. py_eb_model/cli/os_xdm_2_xls_cli.py → eb_model/cli/rte_xdm_2_xls_cli.py +18 -9
  5. eb_model/models/__init__.py +2 -0
  6. eb_model/models/abstract.py +86 -13
  7. eb_model/models/eb_doc.py +55 -27
  8. eb_model/models/eclipse_project.py +8 -0
  9. eb_model/models/importer_xdm.py +115 -0
  10. eb_model/models/os_xdm.py +898 -99
  11. eb_model/models/rte_xdm.py +604 -0
  12. eb_model/parser/__init__.py +3 -0
  13. eb_model/parser/eb_parser.py +92 -39
  14. eb_model/parser/eb_parser_factory.py +29 -0
  15. eb_model/parser/os_xdm_parser.py +171 -28
  16. eb_model/parser/pref_xdm_parser.py +36 -0
  17. eb_model/parser/rte_xdm_parser.py +95 -0
  18. eb_model/reporter/excel_reporter/abstract.py +11 -11
  19. eb_model/reporter/excel_reporter/os_xdm.py +109 -12
  20. eb_model/reporter/excel_reporter/rte_xdm.py +87 -0
  21. eb_model/tests/models/test_eb_model.py +19 -1
  22. eb_model/tests/models/test_importer_xdm.py +61 -0
  23. eb_model/writer/__init__.py +2 -0
  24. eb_model/writer/project_writer.py +71 -0
  25. eb_model/writer/text_writer.py +28 -0
  26. py_eb_model-1.1.4.dist-info/METADATA +200 -0
  27. py_eb_model-1.1.4.dist-info/RECORD +38 -0
  28. py_eb_model-1.1.4.dist-info/entry_points.txt +5 -0
  29. py_eb_model/__init__.py +0 -3
  30. py_eb_model/cli/__init__.py +0 -0
  31. py_eb_model/models/__init__.py +0 -3
  32. py_eb_model/models/abstract.py +0 -66
  33. py_eb_model/models/eb_doc.py +0 -52
  34. py_eb_model/models/os_xdm.py +0 -220
  35. py_eb_model/parser/__init__.py +0 -1
  36. py_eb_model/parser/eb_parser.py +0 -147
  37. py_eb_model/parser/os_xdm_parser.py +0 -43
  38. py_eb_model/reporter/__init__.py +0 -1
  39. py_eb_model/reporter/excel_reporter/__init__.py +0 -0
  40. py_eb_model/reporter/excel_reporter/abstract.py +0 -43
  41. py_eb_model/reporter/excel_reporter/os_xdm.py +0 -44
  42. py_eb_model/reporter/markdown.py +0 -40
  43. py_eb_model-1.0.0.dist-info/METADATA +0 -16
  44. py_eb_model-1.0.0.dist-info/RECORD +0 -40
  45. py_eb_model-1.0.0.dist-info/entry_points.txt +0 -3
  46. {py_eb_model-1.0.0.dist-info → py_eb_model-1.1.4.dist-info}/LICENSE +0 -0
  47. {py_eb_model-1.0.0.dist-info → py_eb_model-1.1.4.dist-info}/WHEEL +0 -0
  48. {py_eb_model-1.0.0.dist-info → py_eb_model-1.1.4.dist-info}/top_level.txt +0 -0
eb_model/__init__.py CHANGED
@@ -1,3 +1,4 @@
1
1
  from .models import *
2
2
  from .parser import *
3
- from .reporter import *
3
+ from .reporter import *
4
+ from .writer import *
@@ -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.add_argument("-v", "--verbose", required= False, help= "Print debug information", action= "store_true")
16
- ap.add_argument("INPUT", help = "The path of Os.xdm.")
17
- ap.add_argument("OUTPUT", help = "The path of excel file.")
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
- file_handler = logging.FileHandler(log_file)
35
- file_handler.setFormatter(formatter)
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
- logger.addHandler(file_handler)
47
- logger.addHandler(stdout_handler)
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
- writer = OsXdmXlsWriter()
57
+ parser.parse_xdm(args.INPUT, doc)
53
58
 
54
- parser.parse(args.INPUT, doc)
55
- writer.write(args.OUTPUT, doc)
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 ..parser import OsXdmParser
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("INPUT", help = "The path of Os.xdm.")
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, 'os_xdm_2_xls.log')
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
- parser.parse(args.INPUT, doc)
55
- writer.write(args.OUTPUT, doc)
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)
@@ -1,3 +1,5 @@
1
1
  from .abstract import *
2
2
  from .os_xdm import *
3
+ from .rte_xdm import *
3
4
  from .eb_doc import *
5
+ from .importer_xdm import *
@@ -1,35 +1,34 @@
1
1
  from abc import ABCMeta
2
- from typing import Dict, List
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.Name = name
11
- self.Parent = parent # type: EcucObject
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.Name
17
+ return self.name
18
18
 
19
19
  def setName(self, value):
20
- self.Name = value
20
+ self.name = value
21
21
  return self
22
22
 
23
23
  def getParent(self):
24
- return self.Parent
24
+ return self.parent
25
25
 
26
26
  def setParent(self, value):
27
- self.Parent = value
27
+ self.parent = value
28
28
  return self
29
29
 
30
30
  def getFullName(self) -> str:
31
- return self.Parent.getFullName() + "/" + self.Name
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.Parent = self
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.link = ""
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 typing import List
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 EBModel(EcucContainer):
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 == None):
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 != None):
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
- name_list = referred_name.split("/")
32
- element = EBModel.getInstance()
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
- os = Os(container)
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,8 @@
1
+
2
+ class Link:
3
+ def __init__(self, name, type, locationURI):
4
+ self.name = name
5
+ self.type = type
6
+ self.locationURI = locationURI
7
+
8
+
@@ -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
+