#!/usr/bin/env python
"""
Streamlit Application for RegressionLab
Web-based interface for curve fitting operations.
"""
# Ensure src/ is on sys.path so config, streamlit_app, i18n, utils are importable
# (required when run via Streamlit Cloud or `streamlit run app.py` without PYTHONPATH)
import sys
from pathlib import Path
_src_dir = Path(__file__).resolve().parent.parent
_src_str = str(_src_dir)
if _src_str not in sys.path:
sys.path.insert(0, _src_str)
import traceback # noqa: E402
from typing import Optional # noqa: E402
import streamlit as st # noqa: E402
# Local imports (lightweight at startup)
try:
from config import get_env, initialize_and_validate_config
from i18n import initialize_i18n, t
from utils import setup_logging, get_logger
from streamlit_app.theme import get_main_css, get_streamlit_theme
initialize_and_validate_config()
_initial_language = get_env("LANGUAGE", "es", str)
initialize_i18n(_initial_language)
setup_logging()
logger = get_logger(__name__)
except Exception as e:
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.error(f"Failed to initialize app: {e}")
logger.error(traceback.format_exc())
def t(key: str, **kwargs) -> str:
return key
def initialize_i18n(language: Optional[str] = None) -> None:
pass
from streamlit_app.sections import ( # noqa: E402
initialize_session_state,
setup_sidebar,
show_logo,
show_help_section,
mode_normal_fitting,
mode_multiple_datasets,
mode_checker_fitting,
mode_total_fitting,
mode_view_data,
)
[docs]
def main() -> None:
"""Main Streamlit application."""
try:
from config import __version__, AVAILABLE_EQUATION_TYPES
except ImportError as e:
st.error(f"Error importing configuration: {e}")
st.error("Please ensure all dependencies are installed correctly.")
logger.error(f"Import error: {e}", exc_info=True)
return
try:
st.set_page_config(
page_title="RegressionLab",
page_icon="đ",
layout="wide",
initial_sidebar_state="collapsed",
)
except Exception as e:
logger.warning(f"Page config already set: {e}")
# Apply theme from config (same colors/rules as tkinter app); cache for sections
if "streamlit_theme" not in st.session_state:
st.session_state.streamlit_theme = get_streamlit_theme()
_theme = st.session_state.streamlit_theme
st.markdown(get_main_css(_theme), unsafe_allow_html=True)
try:
initialize_session_state()
initialize_i18n(st.session_state.language)
operation_mode = setup_sidebar(__version__)
show_logo()
show_help_section()
mode_map = {
t("menu.normal_fitting"): mode_normal_fitting,
t("menu.multiple_datasets"): mode_multiple_datasets,
t("menu.checker_fitting"): mode_checker_fitting,
t("menu.total_fitting"): mode_total_fitting,
t("menu.view_data"): mode_view_data,
}
mode_handler = mode_map.get(operation_mode)
if mode_handler:
mode_handler(AVAILABLE_EQUATION_TYPES)
except Exception as e:
st.error(f"An error occurred while running the application: {e}")
st.error("Please check the logs for more details.")
logger.error(f"Application error: {e}", exc_info=True)
st.code(traceback.format_exc())
if __name__ == "__main__":
main()