# app.py import gradio as gr import ast import torch from pipeline import load_model, generate_tests, evaluate, compute_score # Load model once when app starts model, tokenizer = load_model(use_finetuned=True) def process_function(fn_code, old_test_code): """ Given a function and optional existing tests, generate improved tests and compute evaluation metrics. """ if not fn_code.strip(): return "Error: Function code is empty.", "", "" # Try to extract function name try: fn_name = next(n.name for n in ast.walk(ast.parse(fn_code)) if isinstance(n, ast.FunctionDef)) except: fn_name = "function" # Step 1: Evaluate old tests old_eval = evaluate(fn_code, old_test_code) old_score = compute_score(old_eval) # Step 2: Generate new tests new_tests = generate_tests(model, tokenizer, fn_code, old_test_code or "") try: new_eval = evaluate(fn_code, new_tests) new_score = compute_score(new_eval) except Exception as e: new_eval = {"error": str(e)} new_score = 0.0 improvement = new_score - old_score summary = f"Function: {fn_name}\nOld score: {old_score}\nNew score: {new_score}\nImprovement: {round(improvement*100, 2)}%" return summary, new_tests, str(new_eval) # Gradio UI with gr.Blocks() as demo: gr.Markdown("# 🧪 PyTest Generator Demo") gr.Markdown("Paste a Python function and optional existing test code. The model will generate improved test cases and provide evaluation metrics.") with gr.Row(): fn_input = gr.Textbox(label="Function Code (exact code needed)", placeholder="def add(a, b): ...", lines=10) test_input = gr.Textbox(label="Existing Tests (optional)", placeholder="def test_add(): ...", lines=10) output_summary = gr.Textbox(label="Evaluation Summary", lines=5) output_tests = gr.Textbox(label="Generated Test Code", lines=15) output_eval = gr.Textbox(label="Evaluation Details (JSON)", lines=15) run_btn = gr.Button("Generate Tests") run_btn.click(fn=process_function, inputs=[fn_input, test_input], outputs=[output_summary, output_tests, output_eval]) demo.launch()