Spaces:
Running
Running
| """ | |
| Progress management utilities for Streamlit UI. | |
| """ | |
| from abc import ABC, abstractmethod | |
| from typing import Optional, Callable | |
| import streamlit as st | |
| class ProgressContext(ABC): | |
| """Base class for different progress UI patterns""" | |
| def __enter__(self) -> Callable[[float, str], None]: | |
| pass | |
| def __exit__(self, exc_type, exc_val, exc_tb): | |
| pass | |
| class StreamlitProgressContext(ProgressContext): | |
| """Standard Streamlit progress bar with automatic cleanup""" | |
| def __init__(self, placeholder, success_message: Optional[str] = None): | |
| self.placeholder = placeholder | |
| self.success_message = success_message | |
| self.progress_bar = None | |
| def __enter__(self): | |
| self.progress_bar = self.placeholder.progress(0, text="Starting...") | |
| return self.update_progress | |
| def update_progress(self, progress: float, text: str): | |
| if self.progress_bar: | |
| self.progress_bar.progress(progress, text=text) | |
| def __exit__(self, exc_type, exc_val, exc_tb): | |
| if self.progress_bar: | |
| self.progress_bar.empty() | |
| if exc_type is None and self.success_message: | |
| self.placeholder.success(self.success_message) | |
| elif exc_type is not None: | |
| self.placeholder.error(f"Error: {exc_val}") | |
| class MockProgressContext(ProgressContext): | |
| """Mock progress context for testing - captures progress updates without UI""" | |
| def __init__(self): | |
| self.updates = [] | |
| def __enter__(self): | |
| return self.capture_progress | |
| def capture_progress(self, progress: float, text: str): | |
| self.updates.append((progress, text)) | |
| def __exit__(self, *args): | |
| pass | |