diff --git a/assets/report_generator.py b/assets/report_generator.py
index fa127c4..0c13943 100644
--- a/assets/report_generator.py
+++ b/assets/report_generator.py
@@ -29,6 +29,8 @@ def add_header(self, total_ts, qtd_ts_in_projects, projects, ts_qtd): # step 1
+
+Download CSV
Test Smells Analysis
diff --git a/assets/report_generator_csv.py b/assets/report_generator_csv.py
new file mode 100644
index 0000000..b3a893e
--- /dev/null
+++ b/assets/report_generator_csv.py
@@ -0,0 +1,61 @@
+import sys,re,pathlib,os,git,shutil,subprocess
+from components import SourceCode, Method, Classe, Data
+
+
+class ReportGeneratorCSV:
+
+ def __init__(self, tempdir):
+ self.file = open("./report/log.csv", 'w')
+ self.content = ''
+ self.number_of_test_smells = 1
+ self.tempdir = tempdir
+ self.add_csv_head()
+
+
+ def add_csv_head(self):
+ self.content += "".join([
+ '#,',
+ 'Project,',
+ 'File,',
+ 'Path,',
+ 'Test Smell,',
+ 'Method,',
+ 'start,end',
+ '\n'
+ ])
+
+ def add_csv_body(self, ts, method, lines, path):
+ self.content += "".join([
+ str(self.number_of_test_smells).lstrip(),',',
+ str(self.get_project_name(path)).lstrip(),',',
+ str(self.get_testfile_name(path)).lstrip(),',',
+ str(self.get_path(path)).lstrip(),',',
+ ts.lstrip(),',',
+ method.lstrip(),',',
+ str(lines)[1:-1],
+ '\n'
+ ])
+ self.number_of_test_smells += 1
+
+
+ def build(self): # final step (step 7)
+ self.file.write( self.content )
+ self.file.close()
+
+ def get_testfile_name(self, path):
+ for x in range(len(path)-1, -1, -1):
+ if (path[x] == '/'):
+ return path[x+1:]
+
+ def get_path(self, path):
+ for x in range(len(path)-1, -1, -1):
+ if (path[x] == '/'):
+ return path[0:x+1]
+
+ def get_project_name(self, path):
+ path2 = path.replace(self.tempdir+'/','')
+ path2 = path2[0:path2.find('/')]
+ return path2
+
+ def get_file_name(self):
+ return self.file.name
\ No newline at end of file
diff --git a/main.py b/main.py
index 387a511..35798db 100644
--- a/main.py
+++ b/main.py
@@ -5,13 +5,15 @@
from python_parser import *
from detector import *
from report_generator import *
+from report_generator_csv import *
import tkinter as tk
from tkinter import ttk
import tkinter.filedialog
from tkinter import messagebox
+from pathlib import Path
-def get_selected_test_file(lista):
+def get_selected_test_file(lista, tempdir):
if not lista.curselection():
tkinter.messagebox.showwarning(title=None, message="Please select a test file from the list for analysis.")
else:
@@ -39,26 +41,14 @@ def get_selected_test_file(lista):
ts_qtd.append( cont_proj )
cont_proj = 0
- report = ReportGenerator()
- report.add_header( cont_total, len(all_logs) , projects, ts_qtd)
- prev = None
- for index in range(len(all_logs)):
- report.add_table_header( projects[index], ts_qtd[index] )
- for log in all_logs[index]:
- if (log.lines == prev):
- pass
- else:
- report.add_table_body( log.test_smell_type, log.method_name, log.lines )
- prev = log.lines
- report.add_table_close(ts_qtd[index])
- report.add_footer()
- report.build()
+ report_generator(cont_total, all_logs, projects, ts_qtd)
+ report_generator_csv(all_logs,projects,tempdir)
url = os.path.abspath("./report/log.html")
webbrowser.open(url,new=1)
# sys.exit(0)
-def get_all_test_file(lista):
+def get_all_test_file(lista, tempdir):
if (tkinter.messagebox.askokcancel(title=None, message=str( lista.size() )+" test file(s) selected. Do you wish to continue?")):
all_logs, projects = [], []
@@ -83,20 +73,8 @@ def get_all_test_file(lista):
ts_qtd.append( cont_proj )
cont_proj = 0
- report = ReportGenerator()
- report.add_header( cont_total, len(all_logs) , projects, ts_qtd)
- prev = None
- for index in range(len(all_logs)):
- report.add_table_header( projects[index], ts_qtd[index] )
- for log in all_logs[index]:
- if (log.lines == prev):
- pass
- else:
- report.add_table_body( log.test_smell_type, log.method_name, log.lines )
- prev = log.lines
- report.add_table_close(ts_qtd[index])
- report.add_footer()
- report.build()
+ report_generator(cont_total, all_logs, projects, ts_qtd)
+ report_generator_csv(all_logs,projects,tempdir)
url = os.path.abspath("./report/log.html")
webbrowser.open(url,new=1)
@@ -111,7 +89,7 @@ def close_window_confirmation(newWindow):
if (tkinter.messagebox.askokcancel(title=None, message="Do you really want to close this window?")):
close_window(newWindow)
-def test_file_selection_window(nomes,paths):
+def test_file_selection_window(nomes,paths,tempdir):
newWindow = tk.Tk()
newWindow.protocol('WM_DELETE_WINDOW', lambda: close_window_confirmation(newWindow))
newWindow.wm_title("Select a Python test file")
@@ -132,20 +110,20 @@ def test_file_selection_window(nomes,paths):
for x in range(0,len(nomes)):
lista.insert(x, paths[x]+'/'+nomes[x])
- btn1 = tk.Button(newWindow, text='Select', command=lambda: get_selected_test_file(lista)).pack(fill=tk.X)
- btn2 = tk.Button(newWindow, text='Select All', command=lambda: get_all_test_file(lista)).pack(fill=tk.X)
+ btn1 = tk.Button(newWindow, text='Select', command=lambda: get_selected_test_file(lista, tempdir)).pack(fill=tk.X)
+ btn2 = tk.Button(newWindow, text='Select All', command=lambda: get_all_test_file(lista,tempdir)).pack(fill=tk.X)
btn3 = tk.Button(newWindow, text='Cancel', command=lambda: close_window(newWindow)).pack(fill=tk.X)
-def generate_test_file_list_log(files,nomes,paths):
+def generate_test_file_list_log(files,nomes,paths, tempdir):
if (files > 1):
tkinter.messagebox.showinfo(title=None, message=str(files) + ' Python test files found.')
root.withdraw() # hide home screen
- test_file_selection_window(nomes,paths)
+ test_file_selection_window(nomes,paths,tempdir)
elif (files == 1):
tkinter.messagebox.showinfo(title=None, message='1 Python test file found.')
root.withdraw() # hide home screen
- test_file_selection_window(nomes,paths)
+ test_file_selection_window(nomes,paths,tempdir)
else:
tkinter.messagebox.showinfo(title=None, message='No Python test file found.')
@@ -182,7 +160,7 @@ def search_test_file(tempdir):
nomes.append(x)
paths.append(dirName)
- generate_test_file_list_log(number_of_files,nomes,paths)
+ generate_test_file_list_log(number_of_files,nomes,paths,tempdir)
def select_file():
fname = tk.filedialog.askopenfilename(filetypes=[("Python files", ".py")],title='Choose a test file')
@@ -204,20 +182,7 @@ def select_file():
for x in log:
cont += 1
- report = ReportGenerator()
- report.add_header( cont, len(all_logs) , projects, ts_qtd)
- prev = None
- for index in range(len(all_logs)):
- report.add_table_header( projects[index], ts_qtd[index] )
- for log in all_logs[index]:
- if (log.lines == prev):
- pass
- else:
- report.add_table_body( log.test_smell_type, log.method_name, log.lines )
- prev = log.lines
- report.add_table_close(ts_qtd[index])
- report.add_footer()
- report.build()
+ report_generator(cont, all_logs, projects, ts_qtd)
url = os.path.abspath("./report/log.html")
webbrowser.open(url,new=1)
@@ -226,6 +191,35 @@ def select_file():
if( not is_test_file(fname) ):
tkinter.messagebox.showwarning(title=None, message="The selected file is not a test file.")
+def report_generator(cont, all_logs, projects, ts_qtd):
+ report = ReportGenerator()
+ report.add_header( cont, len(all_logs) , projects, ts_qtd)
+ prev = None
+ for index in range(len(all_logs)):
+ report.add_table_header( projects[index], ts_qtd[index] )
+ for log in all_logs[index]:
+ if (log.lines == prev):
+ pass
+ else:
+ report.add_table_body( log.test_smell_type, log.method_name, log.lines )
+ prev = log.lines
+ report.add_table_close(ts_qtd[index])
+ report.add_footer()
+ report.build()
+
+def report_generator_csv(all_logs, projects, tempdir):
+ report2 = ReportGeneratorCSV(tempdir)
+ prev2 = None
+ for index2 in range(len(all_logs)):
+ for log2 in all_logs[index2]:
+ if log2.lines == prev2:
+ pass
+ else:
+ report2.add_csv_body(log2.test_smell_type, log2.method_name, log2.lines, projects[index2])
+ prev2 = log2.lines
+ report2.build()
+ return report2.get_file_name()
+
def select_directory():
currdir = os.getcwd()
tempdir = tk.filedialog.askdirectory(parent=root, initialdir=currdir, title='Select a directory')
@@ -256,7 +250,11 @@ def set_github_url():
except Exception as e:
tkinter.messagebox.showinfo(title=None, message='Project not found. Please check GitHub URL and try again.')
-
+
+p = Path("./report/")
+if p.exists() == False:
+ os.mkdir("./report/")
+
root = tk.Tk()
root.resizable(width=False, height=False)
root.wm_title("TS Automatic Detector for Python")