nouf-sst commited on
Commit
7df7879
·
verified ·
1 Parent(s): 36932ba
Files changed (1) hide show
  1. app.py +70 -39
app.py CHANGED
@@ -70,78 +70,109 @@ def parse_tgrl(file_obj):
70
 
71
  def extract_elements(tgrl_text):
72
 
73
- # Extract actors
74
- actors = re.findall("(?:.*?actor\s\S+\s?{\s?name\s?=\s?\")([A-Za-z\s;.,!?:-]*)(?:\")", tgrl_text)
75
- # Extract goals
76
- goals = re.findall("(?:.*?goal\s\S+\s?{\s?name\s?=\s?\")([A-Za-z\s;.,!?:-]*)(?:\")", tgrl_text)
77
- # Extract softGoals
78
- softGoals = re.findall("(?:.*?softGoal\s\S+\s?{\s?name\s?=\s?\")([A-Za-z\s;.,!?:-]*)(?:\")", tgrl_text)
79
- # Extract tasks
80
- tasks = re.findall("(?:.*?task\s\S+\s?{\s?name\s?=\s?\")([A-Za-z\s;.,!?:-]*)(?:\")", tgrl_text)
81
- # Extract resources
82
- resources = re.findall("(?:.*?resource\s\S+\s?{\s?name\s?=\s?\")([A-Za-z\s;.,!?:-]*)(?:\")", tgrl_text)
83
-
84
- elements = {
85
  "actors": actors,
86
  "goals": goals,
87
  "softGoals": softGoals,
88
  "tasks": tasks,
89
  "resources": resources
90
- }
91
-
92
- # get elements per actor
93
- elements_per_actor = {}
94
-
95
- for goal in goals:
96
  corresponding_actor = tgrl_text.rfind('actor', 0, tgrl_text.index(goal))
97
  corresponding_actor = re.split(' |{', tgrl_text[corresponding_actor:])[1]
98
  if corresponding_actor not in elements_per_actor:
99
  elements_per_actor[corresponding_actor] = []
100
  elements_per_actor[corresponding_actor].append(goal)
101
-
102
- for softGoal in softGoals:
103
  corresponding_actor = tgrl_text.rfind('actor', 0, tgrl_text.index(softGoal))
104
  corresponding_actor = re.split(' |{', tgrl_text[corresponding_actor:])[1]
105
  if corresponding_actor not in elements_per_actor:
106
  elements_per_actor[corresponding_actor] = []
107
  elements_per_actor[corresponding_actor].append(softGoal)
108
-
109
- for task in tasks:
110
  corresponding_actor = tgrl_text.rfind('actor', 0, tgrl_text.index(task))
111
  corresponding_actor = re.split(' |{', tgrl_text[corresponding_actor:])[1]
112
  if corresponding_actor not in elements_per_actor:
113
  elements_per_actor[corresponding_actor] = []
114
  elements_per_actor[corresponding_actor].append(task)
115
 
116
- # get decomposed elements
117
-
118
- new_tgrl_text = tgrl_text
119
- decomposed_elements = {}
120
-
121
- main_elements_1 = re.findall("\w+(?=\s+decomposedBy)", new_tgrl_text)
122
-
123
- for main_element in main_elements_1:
124
  sub_element_1 = (re.findall(main_element+"\s*(?: decomposedBy )([A-Za-z\s]*)", new_tgrl_text)[0])
125
  sub_element_1 = sub_element_1.replace(" ", "")
126
  sub_element_2 = (re.findall(main_element+"\s*(?: decomposedBy )"+ sub_element_1 +",\s*([A-Za-z\s]*)", new_tgrl_text)[0])
127
  new_tgrl_text = new_tgrl_text.replace(main_element+" decomposedBy "+sub_element_1+", "+sub_element_2+";", '')
128
  decomposed_elements[main_element] = [sub_element_1, sub_element_2]
129
-
130
- # Replace elements IDs with names
131
- new_decomposed_elements = {}
132
-
133
- for key, _ in decomposed_elements.items():
134
-
135
  new_key = re.findall("(?:"+key+"\s*{\s*name\s=\s\")([A-Za-z\s]*)", tgrl_text)[0]
136
  new_values = []
137
-
138
  for element in decomposed_elements[key]:
139
  new_value = re.findall("(?:"+element+"\s*{\s*name\s=\s\")([A-Za-z\s;.,!?:-]*)", tgrl_text)[0]
140
  new_values.append(new_value)
141
-
142
  new_decomposed_elements[new_key] = new_values
143
 
144
- return elements, elements_per_actor, new_decomposed_elements
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
145
 
146
  # ************************************************************************
147
 
 
70
 
71
  def extract_elements(tgrl_text):
72
 
73
+ # Extract actors
74
+ actors = re.findall("(?:.*?actor\s\S+\s?{\s?name\s?=\s?\")([A-Za-z\s;.,!?:-]*)(?:\")", tgrl_text)
75
+ # Extract goals
76
+ goals = re.findall("(?:.*?goal\s\S+\s?{\s?name\s?=\s?\")([A-Za-z\s;.,!?:-]*)(?:\")", tgrl_text)
77
+ # Extract softGoals
78
+ softGoals = re.findall("(?:.*?softGoal\s\S+\s?{\s?name\s?=\s?\")([A-Za-z\s;.,!?:-]*)(?:\")", tgrl_text)
79
+ # Extract tasks
80
+ tasks = re.findall("(?:.*?task\s\S+\s?{\s?name\s?=\s?\")([A-Za-z\s;.,!?:-]*)(?:\")", tgrl_text)
81
+ # Extract resources
82
+ resources = re.findall("(?:.*?resource\s\S+\s?{\s?name\s?=\s?\")([A-Za-z\s;.,!?:-]*)(?:\")", tgrl_text)
83
+
84
+ elements = {
85
  "actors": actors,
86
  "goals": goals,
87
  "softGoals": softGoals,
88
  "tasks": tasks,
89
  "resources": resources
90
+ }
91
+
92
+ # get elements per actor
93
+ elements_per_actor = {}
94
+
95
+ for goal in goals:
96
  corresponding_actor = tgrl_text.rfind('actor', 0, tgrl_text.index(goal))
97
  corresponding_actor = re.split(' |{', tgrl_text[corresponding_actor:])[1]
98
  if corresponding_actor not in elements_per_actor:
99
  elements_per_actor[corresponding_actor] = []
100
  elements_per_actor[corresponding_actor].append(goal)
101
+
102
+ for softGoal in softGoals:
103
  corresponding_actor = tgrl_text.rfind('actor', 0, tgrl_text.index(softGoal))
104
  corresponding_actor = re.split(' |{', tgrl_text[corresponding_actor:])[1]
105
  if corresponding_actor not in elements_per_actor:
106
  elements_per_actor[corresponding_actor] = []
107
  elements_per_actor[corresponding_actor].append(softGoal)
108
+
109
+ for task in tasks:
110
  corresponding_actor = tgrl_text.rfind('actor', 0, tgrl_text.index(task))
111
  corresponding_actor = re.split(' |{', tgrl_text[corresponding_actor:])[1]
112
  if corresponding_actor not in elements_per_actor:
113
  elements_per_actor[corresponding_actor] = []
114
  elements_per_actor[corresponding_actor].append(task)
115
 
116
+ # get decomposed elements
117
+
118
+ new_tgrl_text = tgrl_text
119
+ decomposed_elements = {}
120
+
121
+ main_elements_1 = re.findall("\w+(?=\s+decomposedBy)", new_tgrl_text)
122
+
123
+ for main_element in main_elements_1:
124
  sub_element_1 = (re.findall(main_element+"\s*(?: decomposedBy )([A-Za-z\s]*)", new_tgrl_text)[0])
125
  sub_element_1 = sub_element_1.replace(" ", "")
126
  sub_element_2 = (re.findall(main_element+"\s*(?: decomposedBy )"+ sub_element_1 +",\s*([A-Za-z\s]*)", new_tgrl_text)[0])
127
  new_tgrl_text = new_tgrl_text.replace(main_element+" decomposedBy "+sub_element_1+", "+sub_element_2+";", '')
128
  decomposed_elements[main_element] = [sub_element_1, sub_element_2]
129
+
130
+ # Replace elements IDs with names
131
+ new_decomposed_elements = {}
132
+
133
+ for key, _ in decomposed_elements.items():
134
+
135
  new_key = re.findall("(?:"+key+"\s*{\s*name\s=\s\")([A-Za-z\s]*)", tgrl_text)[0]
136
  new_values = []
137
+
138
  for element in decomposed_elements[key]:
139
  new_value = re.findall("(?:"+element+"\s*{\s*name\s=\s\")([A-Za-z\s;.,!?:-]*)", tgrl_text)[0]
140
  new_values.append(new_value)
141
+
142
  new_decomposed_elements[new_key] = new_values
143
 
144
+ # get contributing elements
145
+
146
+ new_tgrl_text = tgrl_text
147
+ contributing_elements = []
148
+
149
+ main_elements_1 = re.findall("\w+(?=\s+contributesTo)", new_tgrl_text)
150
+ for main_element in main_elements_1:
151
+ sub_element_1 = (re.findall(main_element+"(?: contributesTo )([A-Za-z\s]*)", new_tgrl_text)[0])
152
+ sub_element_1 = sub_element_1.replace(" ", "")
153
+ contribution = (re.findall(main_element+"(?: contributesTo )"+ sub_element_1 +"\s{(-*[0-9A-Za-z]*)", new_tgrl_text)[0])
154
+ new_tgrl_text = new_tgrl_text.replace(main_element+" contributesTo "+sub_element_1, '')
155
+ contributing_elements.append([main_element, sub_element_1, contribution])
156
+
157
+ contributing_elements_IDs_per_actor = {}
158
+ for element in contributing_elements:
159
+ corresponding_actor_1 = tgrl_text.rfind('actor', 0, tgrl_text.index(" "+element[0]))
160
+ corresponding_actor_1 = re.split(' |{', tgrl_text[corresponding_actor_1:])[1]
161
+ if corresponding_actor_1 not in contributing_elements_IDs_per_actor:
162
+ contributing_elements_IDs_per_actor[corresponding_actor_1] = []
163
+ contributing_elements_IDs_per_actor[corresponding_actor_1].append(element)
164
+
165
+ # Replace elements IDs with names
166
+ contributing_elements_per_actor = {}
167
+ for key, values in contributing_elements_IDs_per_actor.items():
168
+ contributing_elements = []
169
+ for elements in contributing_elements_IDs_per_actor[key]:
170
+ element_name_1 = re.findall("(?:"+elements[0]+"\s*{\s*name\s=\s\")([A-Za-z\s;.,!?:-]*)", tgrl_text)[0]
171
+ element_name_2 = re.findall("(?:"+elements[1]+"\s*{\s*name\s=\s\")([A-Za-z\s;.,!?:-]*)", tgrl_text)[0]
172
+ contributing_elements.append([element_name_1, element_name_2, elements[2]])
173
+ contributing_elements_per_actor[key] = contributing_elements
174
+
175
+ return elements, elements_per_actor, new_decomposed_elements, contributing_elements_per_actor
176
 
177
  # ************************************************************************
178