Source code for streamlit_app.app

#!/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()