Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions assets/report_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ def add_header(self, total_ts, qtd_ts_in_projects, projects, ts_qtd): # step 1
</style>
</head>
<body>

<a href="log.csv">Download CSV</a>

<h1>Test Smells Analysis</h1>

Expand Down
61 changes: 61 additions & 0 deletions assets/report_generator_csv.py
Original file line number Diff line number Diff line change
@@ -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
102 changes: 50 additions & 52 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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 = [], []
Expand All @@ -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)
Expand All @@ -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")
Expand All @@ -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.')

Expand Down Expand Up @@ -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')
Expand All @@ -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)
Expand All @@ -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')
Expand Down Expand Up @@ -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")
Expand Down