Spaces:
Running
Running
import gradio as gr | |
import flake8.main.application | |
import autopep8 | |
import pylint.lint | |
import isort | |
import black | |
import tempfile | |
import os | |
import difflib | |
import io | |
def lint_and_format(code, enable_flake8, enable_pylint, enable_isort, enable_black): | |
flake8_output = "" | |
pylint_output = "" | |
isort_output = "" | |
formatted_code = code | |
diff_output = "" | |
black_output = "" | |
# Temporary file for linters | |
with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.py') as temp_file: | |
temp_file.write(code) | |
temp_file_path = temp_file.name | |
try: | |
# Flake8 | |
if enable_flake8: | |
app = flake8.main.application.Application() | |
app.initialize(['--format=default', temp_file_path]) | |
app.run_checks() | |
# Corrected Flake8 output retrieval | |
flake8_output_stream = io.StringIO() | |
app.report_formatter.output_file = flake8_output_stream | |
app.report_formatter.start() | |
app.report_formatter.stop() | |
flake8_output = flake8_output_stream.getvalue().strip() | |
# Pylint | |
if enable_pylint: | |
pylint_output_stream = io.StringIO() | |
pylint_runner = pylint.lint.Run([temp_file_path], do_exit=False, output_stream=pylint_output_stream) | |
pylint_output = pylint_output_stream.getvalue().strip() | |
# isort | |
if enable_isort: | |
isort_output = isort.file(temp_file_path, show_diff=True).strip() | |
# Black | |
if enable_black: | |
try: | |
formatted_code = black.format_file_in_place( | |
src=temp_file_path, | |
fast=False, | |
mode=black.FileMode(), | |
write_back=black.WriteBack.YES, | |
) | |
with open(temp_file_path, "r") as f: | |
formatted_code = f.read() | |
except black.NothingChanged: | |
pass | |
# AutoPEP8 (if Black is not enabled) | |
if not enable_black: | |
formatted_code = autopep8.fix_code(formatted_code) | |
# Diff | |
diff = difflib.unified_diff(code.splitlines(keepends=True), formatted_code.splitlines(keepends=True), fromfile="original.py", tofile="formatted.py") | |
diff_output = "".join(diff) | |
return flake8_output, pylint_output, isort_output, formatted_code, diff_output | |
except Exception as e: | |
return f"An error occurred: {str(e)}", "", "", code, "" | |
finally: | |
os.remove(temp_file_path) | |
def main(): | |
with gr.Interface( | |
fn=lint_and_format, | |
inputs=[ | |
gr.Code(label="Python Code", language="python", lines=10), | |
gr.Checkbox(label="Enable Flake8", value=True), | |
gr.Checkbox(label="Enable Pylint", value=False), | |
gr.Checkbox(label="Enable isort", value=True), | |
gr.Checkbox(label="Enable Black", value=True), | |
], | |
outputs=[ | |
gr.Textbox(label="Flake8 Output"), | |
gr.Textbox(label="Pylint Output"), | |
gr.Textbox(label="isort Output"), | |
gr.Code(label="Formatted Code", language="python"), | |
gr.Textbox(label="Diff"), | |
], | |
title="Python Code Linter and Formatter", | |
description="Paste your Python code, and this tool will lint and format it using Flake8, Pylint, isort and Black/AutoPEP8.", | |
) as demo: | |
demo.launch() | |
if __name__ == "__main__": | |
main() |