import gradio as gr import json import time import traceback from validation import validate_json, validate_croissant, validate_records def process_file(file): results = [] # Check 1: JSON validation json_valid, json_message, json_data = validate_json(file.name) results.append(("JSON Format Validation", json_valid, json_message)) if not json_valid: return results # Check 2: Croissant validation croissant_valid, croissant_message = validate_croissant(json_data) results.append(("Croissant Schema Validation", croissant_valid, croissant_message)) if not croissant_valid: return results # Check 3: Records validation records_valid, records_message = validate_records(json_data) results.append(("Records Generation Test", records_valid, records_message)) return results def create_ui(): with gr.Blocks(theme=gr.themes.Soft()) as app: gr.Markdown("# Croissant JSON-LD Validator for NeurIPS") gr.Markdown(""" Upload your Croissant JSON-LD file to validate if it meets the requirements for NeurIPS submission. The validator will check: 1. If the file is valid JSON 2. If it passes Croissant schema validation 3. If records can be generated within a reasonable time """) with gr.Row(): file_input = gr.File(label="Upload Croissant JSON-LD File", file_types=[".json", ".jsonld"]) upload_progress = gr.HTML( """
Ready for upload
""", visible=True) validate_btn = gr.Button("Validate", variant="primary") # Create containers for each validation step validation_results = gr.HTML(visible=False) # Define CSS for the validation UI gr.HTML(""" """) def on_file_upload(file): if file is None: return """
Ready for upload
""", gr.update(visible=False) return """
✅ File uploaded successfully
""", gr.update(visible=False) def on_validate(file): if file is None: return gr.update(visible=False) # Process the file and get results results = process_file(file) # Build the HTML for validation results html = '
' for i, (test_name, passed, message) in enumerate(results): # Determine status class status_class = "status-success" if passed else "status-error" status_icon = "✓" if passed else "✗" # Use direct inline JavaScript manipulation instead of a function call html += f'''
{status_icon}
{test_name}
''' html += '
' # No separate JavaScript function needed return gr.update(value=html, visible=True) file_input.change(on_file_upload, inputs=file_input, outputs=[upload_progress, validation_results]) validate_btn.click(on_validate, inputs=file_input, outputs=validation_results) gr.HTML("""

Based on the Croissant format from MLCommons.

""") return app if __name__ == "__main__": app = create_ui() app.launch()