-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGUI.py
111 lines (92 loc) · 4.78 KB
/
GUI.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import pygame
import random
import tkinter as tk
from main import KaunPaada
from tkinter import filedialog
GUI_TITLE = "Kaun Paada GUI"
GUI_DESCRIPTION = "Welcome to Kaun Paada aka Who Farted?\nThis is a code smell detection tool for Python\n\n"
HEADING_FONT = "Helvetica", 16, "bold"
SUBHEADING_FONT = "Helvetica", 14, "bold"
BODY_FONT = "Helvetica", 12, "normal"
SUPPORTED_FILE_TYPES = [("Python files", "*.py")]
AUDIO_FILES = ["assets/audio1.mp3", "assets/audio2.mp3", "assets/audio3.mp3"]
class FilePickerGUI:
def __init__(self):
self.window = tk.Tk()
self.kaun_paada = None
self.window.title('Kaun Paada GUI')
self.window.geometry('1000x500')
self.main_frame = tk.Frame(self.window)
self.my_canvas = tk.Canvas(self.main_frame)
self.my_scrollbar = tk.Scrollbar(self.main_frame, orient=tk.VERTICAL, command=self.my_canvas.yview)
self.second_frame = tk.Frame(self.my_canvas)
self.make_window_scrollable()
self.add_text(GUI_DESCRIPTION, font=HEADING_FONT)
self.add_text("Select a Python file to begin", font=BODY_FONT)
self.add_button('Select File', self.select_file)
def make_window_scrollable(self) -> None:
self.main_frame.pack(fill=tk.BOTH, expand=1)
self.my_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)
self.my_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
# Configure the canvas
self.my_canvas.configure(yscrollcommand=self.my_scrollbar.set)
self.my_canvas.bind('<Configure>', lambda e: self.my_canvas.configure(scrollregion=self.my_canvas.bbox('all')))
self.my_canvas.create_window((0, 0), window=self.second_frame, anchor="nw")
def select_file(self) -> None:
filepath = filedialog.askopenfilename(filetypes=SUPPORTED_FILE_TYPES)
print(f'Filepath selected: {filepath}')
self.handle_callback(filepath)
def handle_callback(self, filepath: str) -> None:
self.kaun_paada = KaunPaada(filepath)
self.display_dict_results(self.kaun_paada.long_method_detector(), "Long Methods Detected")
self.display_dict_results(self.kaun_paada.long_parameter_list_detector(), "Long Parameter Lists Detected")
# For enabling semantic code check, pass semantic_code_detector() as a param below
self.handle_duplicate_code_callback(self.kaun_paada.duplicate_code_detector())
# For enabling semantic code check, add a list param, extend if check, and pass to display function
def handle_duplicate_code_callback(self, duplicate_functions_list: list) -> None:
if duplicate_functions_list:
self.display_list_results(duplicate_functions_list, "Duplicate Functions based on Jaccard Similarity")
self.add_text("\nDuplicate Code has been detected. Do you want to refactor?", font=SUBHEADING_FONT)
self.add_button('Save Refactored File', command=self.save_file)
else:
self.add_text("No duplicate code found!", font=SUBHEADING_FONT)
self.add_text("No smells detected, so great job :)", font=HEADING_FONT)
def display_list_results(self, results_list: list, text_label: str = "") -> None:
self.add_text(text=text_label, font=SUBHEADING_FONT)
if not results_list:
self.add_text("None found! Congrats!")
return
self.play_random_audio()
for item in results_list:
self.add_text(item)
self.add_text("\n--------------------------------------------\n")
def display_dict_results(self, results_dict: dict, text_label: str = "") -> None:
self.add_text(text_label, font=SUBHEADING_FONT)
if not results_dict:
self.add_text("None found! Congrats!")
return
self.play_random_audio()
for key, value in results_dict.items():
self.add_text(f"{key}\t\t----------> {value}")
self.add_text("\n--------------------------------------------\n")
@staticmethod
def play_random_audio() -> None:
audio_file = random.choice(AUDIO_FILES)
pygame.mixer.init()
pygame.mixer.music.load(audio_file)
pygame.mixer.music.play()
def save_file(self) -> None:
filepath = filedialog.asksaveasfilename(defaultextension=".py", filetypes=SUPPORTED_FILE_TYPES)
if filepath:
self.kaun_paada.refactor_file(filepath)
def add_text(self, text: str, font: tuple = BODY_FONT) -> None:
new_label = tk.Label(self.second_frame, text=text, font=font)
new_label.pack()
def add_button(self, text: str, command: any, font: tuple = BODY_FONT) -> None:
new_button = tk.Button(self.second_frame, text=text, command=command, font=font)
new_button.pack()
def run(self) -> None:
self.window.mainloop()
if __name__ == "__main__":
gui = FilePickerGUI()
gui.run()