turn the print into a gui
This commit is contained in:
parent
3510eb41ad
commit
b26f4abefa
4 changed files with 113 additions and 64 deletions
58
gui.py
Normal file
58
gui.py
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
import sys
|
||||||
|
from tkinter import Frame, Label, Tk
|
||||||
|
|
||||||
|
from src.clangformat import clang_format, parse_clang_format_output
|
||||||
|
from src.utils import analyze_args
|
||||||
|
|
||||||
|
|
||||||
|
class GUI:
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.name = "Errsy"
|
||||||
|
self.parent = Tk()
|
||||||
|
self.parent.resizable(False, False)
|
||||||
|
self.f = Frame(self.parent)
|
||||||
|
|
||||||
|
def start(self) -> None:
|
||||||
|
"""Affiche la fenêtre"""
|
||||||
|
self._main_screen()
|
||||||
|
self.f.grid()
|
||||||
|
# self.change_pos(1280, 720)
|
||||||
|
self.parent.title(self.name)
|
||||||
|
self.parent.mainloop()
|
||||||
|
|
||||||
|
def change_pos(self, x: int, y: int) -> None:
|
||||||
|
"""Change les dimensions de la fenêtre"""
|
||||||
|
width = self.parent.winfo_screenwidth()
|
||||||
|
height = self.parent.winfo_screenheight()
|
||||||
|
|
||||||
|
# Centre
|
||||||
|
x_i = (width // 2) - (x // 2)
|
||||||
|
y_i = (height // 2) - (y // 2)
|
||||||
|
|
||||||
|
self.parent.geometry(f"{x}x{y}+{x_i}+{y_i}")
|
||||||
|
|
||||||
|
def _main_screen(self):
|
||||||
|
"""Écran principal"""
|
||||||
|
Label(
|
||||||
|
self.parent,
|
||||||
|
text=f"{self.name} est une application qui permet d'utiliser "
|
||||||
|
"plus facilement clang-format",
|
||||||
|
).grid(column=0, row=0, columnspan=1)
|
||||||
|
self._analyse()
|
||||||
|
|
||||||
|
def _analyse(self) -> None:
|
||||||
|
"""Analyse les données"""
|
||||||
|
files = analyze_args(sys.argv[1:])
|
||||||
|
for file in files:
|
||||||
|
clang_format_output = clang_format(file)
|
||||||
|
parsed_output = parse_clang_format_output(clang_format_output)
|
||||||
|
|
||||||
|
if parsed_output:
|
||||||
|
for idx, error in enumerate(parsed_output):
|
||||||
|
Label(
|
||||||
|
self.parent,
|
||||||
|
text=f"Avertissement dans {error.filename} "
|
||||||
|
f"à la ligne {error.line_number}, caractère {error.column_number}.",
|
||||||
|
).grid(column=0, row=idx + 1, columnspan=1)
|
||||||
|
else:
|
||||||
|
print(f"Aucun avertissement trouvé dans {file}.")
|
66
main.py
66
main.py
|
@ -1,66 +1,4 @@
|
||||||
import re
|
from gui import GUI
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from src.errors import ClangError
|
|
||||||
from src.utils import analyze_args
|
|
||||||
|
|
||||||
|
|
||||||
def clang_format(file_path) -> str:
|
|
||||||
command = ["clang-format", "--dry-run", file_path]
|
|
||||||
try:
|
|
||||||
output = subprocess.check_output(command, stderr=subprocess.STDOUT, text=True)
|
|
||||||
except subprocess.CalledProcessError as e:
|
|
||||||
output = e.output
|
|
||||||
except FileNotFoundError as e:
|
|
||||||
print(f"Commande non trouvé : {e.filename}", file=sys.stderr)
|
|
||||||
print(
|
|
||||||
"clang est requis pour utilisé ce programme, installé-le via "
|
|
||||||
f"votre gestionnaire de paquet : {e.filename}",
|
|
||||||
file=sys.stderr,
|
|
||||||
)
|
|
||||||
exit(1)
|
|
||||||
|
|
||||||
return output
|
|
||||||
|
|
||||||
|
|
||||||
def parse_clang_format_output(output) -> list[ClangError]:
|
|
||||||
error_pattern = (
|
|
||||||
r"(?P<filename>.+):(?P<line_number>\d+):(?P<column_number>\d+):"
|
|
||||||
r" warning: code should be clang-formatted \[(?P<warning_message>.+)\]"
|
|
||||||
)
|
|
||||||
error_matches = re.finditer(error_pattern, output)
|
|
||||||
|
|
||||||
errors = []
|
|
||||||
for error_match in error_matches:
|
|
||||||
filename = str(error_match.group("filename"))
|
|
||||||
line_number = int(error_match.group("line_number"))
|
|
||||||
column_number = int(error_match.group("column_number"))
|
|
||||||
warning_message = str(error_match.group("warning_message"))
|
|
||||||
|
|
||||||
errors.append(
|
|
||||||
ClangError(
|
|
||||||
filename,
|
|
||||||
line_number,
|
|
||||||
column_number,
|
|
||||||
warning_message[1:],
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
return errors
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
files = analyze_args(sys.argv[1:])
|
GUI().start()
|
||||||
for file in files:
|
|
||||||
clang_format_output = clang_format(file)
|
|
||||||
parsed_output = parse_clang_format_output(clang_format_output)
|
|
||||||
|
|
||||||
if parsed_output:
|
|
||||||
for error in parsed_output:
|
|
||||||
print(
|
|
||||||
f"[{error.warning_message}] Avertissement dans {error.filename} "
|
|
||||||
f"à la ligne {error.line_number}, caractère {error.column_number}."
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
print(f"Aucun avertissement trouvé dans {file}.")
|
|
||||||
|
|
49
src/clangformat.py
Normal file
49
src/clangformat.py
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from src.errors import ClangError
|
||||||
|
|
||||||
|
|
||||||
|
def clang_format(file_path) -> str:
|
||||||
|
command = ["clang-format", "--dry-run", file_path]
|
||||||
|
try:
|
||||||
|
output = subprocess.check_output(command, stderr=subprocess.STDOUT, text=True)
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
output = e.output
|
||||||
|
except FileNotFoundError as e:
|
||||||
|
print(f"Commande non trouvé : {e.filename}", file=sys.stderr)
|
||||||
|
print(
|
||||||
|
"clang est requis pour utilisé ce programme, installé-le via "
|
||||||
|
f"votre gestionnaire de paquet : {e.filename}",
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
def parse_clang_format_output(output) -> list[ClangError]:
|
||||||
|
error_pattern = (
|
||||||
|
r"(?P<filename>.+):(?P<line_number>\d+):(?P<column_number>\d+):"
|
||||||
|
r" warning: code should be clang-formatted \[(?P<warning_message>.+)\]"
|
||||||
|
)
|
||||||
|
error_matches = re.finditer(error_pattern, output)
|
||||||
|
|
||||||
|
errors = []
|
||||||
|
for error_match in error_matches:
|
||||||
|
filename = str(error_match.group("filename"))
|
||||||
|
line_number = int(error_match.group("line_number"))
|
||||||
|
column_number = int(error_match.group("column_number"))
|
||||||
|
warning_message = str(error_match.group("warning_message"))
|
||||||
|
|
||||||
|
errors.append(
|
||||||
|
ClangError(
|
||||||
|
filename,
|
||||||
|
line_number,
|
||||||
|
column_number,
|
||||||
|
warning_message[1:],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
return errors
|
|
@ -8,6 +8,10 @@ def analyze_args(args: list) -> list[str]:
|
||||||
print("Trop d'arguments renseignés.", file=sys.stderr)
|
print("Trop d'arguments renseignés.", file=sys.stderr)
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
|
if not len(args):
|
||||||
|
print("Aucun argument renseigné.")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
if os.path.isdir(args[0]):
|
if os.path.isdir(args[0]):
|
||||||
args = iterate_over_directory(args[0])
|
args = iterate_over_directory(args[0])
|
||||||
else:
|
else:
|
||||||
|
|
Reference in a new issue