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")