Spaces:
Paused
Paused
| 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() |