CodeMixt / app.py
acecalisto3's picture
Update app.py
c9cb3bc verified
raw
history blame
14.8 kB
import gradio as gr
import subprocess
import random
import json
import os
import tempfile
import time
from pathlib import Path
from datetime import datetime
import asyncio
import aiohttp
from typing import List, Dict, Any
import logging
import black
from pylint import lint
from io import StringIO
# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
class EnhancedAppBuilder:
def __init__(self):
self.TEMPLATES = {
"Basic": "basic_app.json",
"Dashboard": "dashboard_template.json",
"Data Analysis": "data_analysis_template.json",
"ML Interface": "ml_interface_template.json"
}
self.THEMES = {
"Default": {},
"Dark": {"primary_hue": "slate", "secondary_hue": "slate"},
"Light": {"primary_hue": "blue", "secondary_hue": "blue"},
"Professional": {"primary_hue": "indigo", "secondary_hue": "indigo"}
}
self.ADVANCED_COMPONENTS = {
"Plot": {
"properties": {
"type": ["line", "bar", "scatter", "histogram"],
"data_source": "",
"x_axis": "",
"y_axis": ""
},
"code_snippet": 'gr.Plot(value=plot_{id}, label="{label}")'
},
"FileUploader": {
"properties": {
"file_types": [".csv", ".txt", ".pdf", ".png", ".jpg"],
"multiple": False
},
"code_snippet": 'gr.File(file_types={file_types}, label="{label}")'
},
"DataTable": {
"properties": {
"headers": [],
"row_count": 10,
"interactive": True
},
"code_snippet": 'gr.Dataframe(headers={headers}, interactive={interactive})'
},
"3D Plot": {
"properties": {
"type": ["surface", "scatter3d", "line3d"],
"data": None
},
"code_snippet": 'gr.Plot3D(value=plot3d_{id})'
}
}
async def validate_component(self, component: Dict) -> tuple:
"""Validate component configuration"""
try:
required_fields = ["type", "properties", "id"]
if not all(field in component for field in required_fields):
return False, "Missing required fields"
# Validate component type
if component["type"] not in {**components_registry, **self.ADVANCED_COMPONENTS}:
return False, f"Invalid component type: {component['type']}"
return True, "Component validation successful"
except Exception as e:
return False, f"Validation error: {str(e)}"
def format_code(self, code: str) -> str:
"""Format Python code using black"""
try:
return black.format_str(code, mode=black.FileMode())
except Exception as e:
logger.error(f"Code formatting error: {str(e)}")
return code
def lint_code(self, code: str) -> List[str]:
"""Run pylint on generated code"""
with tempfile.NamedTemporaryFile(mode='w', suffix='.py') as tmp:
tmp.write(code)
tmp.flush()
output = StringIO()
lint.Run([tmp.name], do_exit=False, reporter=lint.reporters.TextReporter(output))
return output.getvalue().split('\n')
async def optimize_layout(self, components: List[Dict]) -> List[Dict]:
"""Optimize component layout for better UX"""
# Group related components
groups = {}
for comp in components:
category = comp['type'].split('_')[0]
if category not in groups:
groups[category] = []
groups[category].append(comp)
# Arrange components in optimal order
optimized = []
for category in ['input', 'process', 'output']:
if category in groups:
optimized.extend(groups[category])
return optimized
class EnhancedAppCreationProcess(AppCreationProcess):
def __init__(self):
super().__init__()
self.builder = EnhancedAppBuilder()
self.history = []
self.current_theme = "Default"
self.custom_css = ""
self.event_handlers = {}
self.dependencies = []
def save_snapshot(self):
"""Save current state snapshot"""
snapshot = {
'timestamp': datetime.now().isoformat(),
'app_name': self.app_name,
'components': self.components.copy(),
'theme': self.current_theme,
'custom_css': self.custom_css
}
self.history.append(snapshot)
def restore_snapshot(self, index: int):
"""Restore from saved snapshot"""
if 0 <= index < len(self.history):
snapshot = self.history[index]
self.app_name = snapshot['app_name']
self.components = snapshot['components']
self.current_theme = snapshot['theme']
self.custom_css = snapshot['custom_css']
return "Snapshot restored successfully"
return "Invalid snapshot index"
async def generate_enhanced_code(self):
"""Generate enhanced application code"""
try:
# Start with imports
code = """import gradio as gr
import pandas as pd
import numpy as np
import plotly.express as px
from pathlib import Path
import logging
import json
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
"""
# Add theme configuration
theme_config = self.builder.THEMES.get(self.current_theme, {})
code += f"\ntheme = gr.themes.Default({', '.join(f'{k}={v!r}' for k, v in theme_config.items())})\n"
# Add custom CSS
if self.custom_css:
code += f"\ncustom_css = '''{self.custom_css}'''\n"
# Start app definition
code += f"\nwith gr.Blocks(theme=theme{',' if self.custom_css else ''} css=custom_css) as {self.app_name}:\n"
# Add components with layout optimization
optimized_components = await self.builder.optimize_layout(self.components)
# Generate component code
for component in optimized_components:
code += f" {Component(**component).render()}\n"
# Add event handlers
for handler in self.event_handlers:
code += f"\n {handler['trigger']}.change(fn={handler['function']}, "
code += f"inputs={handler['inputs']}, outputs={handler['outputs']})\n"
# Add launch configuration
code += f"\n{self.app_name}.launch(share=True, debug=True)\n"
# Format the code
formatted_code = self.builder.format_code(code)
# Run linting
lint_results = self.builder.lint_code(formatted_code)
return formatted_code, lint_results
except Exception as e:
logger.error(f"Code generation error: {str(e)}")
return str(e), []
async def deploy_enhanced(self):
"""Enhanced deployment process"""
try:
# Generate code
code, lint_results = await self.generate_enhanced_code()
# Create deployment directory
deploy_dir = Path(f"deployment_{self.app_name}")
deploy_dir.mkdir(exist_ok=True)
# Save main application file
with open(deploy_dir / "app.py", "w") as f:
f.write(code)
# Generate requirements.txt
requirements = [
"gradio>=3.50.2",
"pandas",
"numpy",
"plotly",
"pillow",
"scikit-learn"
]
with open(deploy_dir / "requirements.txt", "w") as f:
f.write("\n".join(requirements))
# Generate README.md
readme = f"""# {self.app_name}
Generated by Enhanced App Builder
## Features
- Interactive web interface
- Data visualization capabilities
- Responsive design with {self.current_theme} theme
- Advanced component integration
## Setup
1. Install requirements: `pip install -r requirements.txt`
2. Run the app: `python app.py`
"""
with open(deploy_dir / "README.md", "w") as f:
f.write(readme)
return {
"status": "success",
"message": f"Deployment files generated in {deploy_dir}",
"lint_results": lint_results
}
except Exception as e:
logger.error(f"Deployment error: {str(e)}")
return {
"status": "error",
"message": str(e)
}
# Create enhanced interface
def create_enhanced_interface():
app_process = EnhancedAppCreationProcess()
with gr.Blocks(theme=gr.themes.Default()) as iface:
gr.Markdown("# 🚀 Enhanced App Builder Pro")
with gr.Row():
with gr.Column(scale=2):
current_step = gr.Markdown(value=app_process.get_current_step_info())
with gr.Column(scale=1):
theme_dropdown = gr.Dropdown(
choices=list(app_process.builder.THEMES.keys()),
value="Default",
label="Theme"
)
with gr.Tabs():
# App Configuration Tab
with gr.TabItem("📱 App Configuration"):
with gr.Group():
app_name_input = gr.Textbox(label="App Name")
template_dropdown = gr.Dropdown(
choices=list(app_process.builder.TEMPLATES.keys()),
label="Template"
)
init_app_button = gr.Button("Initialize App", variant="primary")
init_status = gr.Markdown()
# Component Builder Tab
with gr.TabItem("🔧 Component Builder"):
with gr.Row():
with gr.Column():
component_type = gr.Dropdown(
choices=list({**components_registry, **app_process.builder.ADVANCED_COMPONENTS}.keys()),
label="Component Type"
)
add_component_button = gr.Button("Add Component")
with gr.Column():
components_display = gr.HTML()
# Style Editor Tab
with gr.TabItem("🎨 Style Editor"):
custom_css = gr.Code(
label="Custom CSS",
language="css"
)
apply_style_button = gr.Button("Apply Style")
style_status = gr.Markdown()
# Code Generator Tab
with gr.TabItem("💻 Code Generator"):
generate_code_button = gr.Button("Generate Code")
generated_code = gr.Code(language="python")
lint_results = gr.Markdown()
# Deployment Tab
with gr.TabItem("🚀 Deployment"):
with gr.Group():
deploy_button = gr.Button("Deploy Application")
deployment_status = gr.Markdown()
with gr.Accordion("Deployment Logs", open=False):
deployment_logs = gr.TextArea(label="Logs", interactive=False)
# Footer
gr.Markdown("---")
with gr.Row():
gr.Markdown("### 📊 Build Status")
components_count = gr.Number(label="Components", value=0)
validation_status = gr.Markdown()
# Event handlers
async def update_theme(theme_name):
app_process.current_theme = theme_name
return f"Theme updated to {theme_name}"
async def init_app(name, template):
try:
app_process.app_name = name
# Load template if selected
if template:
# Implementation for template loading
pass
app_process.save_snapshot()
return f"✅ App '{name}' initialized successfully with {template} template!"
except Exception as e:
return f"❌ Error: {str(e)}"
async def add_component(comp_type):
try:
result = app_process.add_component(comp_type)
count = len(app_process.components)
return result, count, "✅ Component added successfully"
except Exception as e:
return None, 0, f"❌ Error: {str(e)}"
async def generate_code():
try:
code, lint_results = await app_process.generate_enhanced_code()
return (
code,
"### Lint Results:\n" + "\n".join(lint_results)
)
except Exception as e:
return str(e), "❌ Error in code generation"
async def deploy():
try:
result = await app_process.deploy_enhanced()
return (
f"### Deployment Status: {result['status']}\n\n{result['message']}",
"\n".join(result.get('lint_results', []))
)
except Exception as e:
return f"❌ Deployment Error: {str(e)}", ""
# Connect event handlers
theme_dropdown.change(update_theme, inputs=[theme_dropdown], outputs=[style_status])
init_app_button.click(init_app, inputs=[app_name_input, template_dropdown], outputs=[init_status])
add_component_button.click(add_component, inputs=[component_type], outputs=[components_display, components_count, validation_status])
generate_code_button.click(generate_code, outputs=[generated_code, lint_results])
deploy_button.click(deploy, outputs=[deployment_status, deployment_logs])
return iface
# Launch the enhanced interface
if __name__ == "__main__":
iface = create_enhanced_interface()
iface.launch(
server_port=7860,
share=True,
debug=True
)