Source code for pysepal.solara.decorators

"""Decorators for working with GEE interfaces in Solara applications.

This module provides decorators that can be used to automatically
handle GEE interface initialization and error handling in Solara components.
"""

import logging
from functools import wraps
from typing import Any, Callable, Optional

import solara
from eeclient.exceptions import EEClientError
from solara.lab import headers

from pysepal.solara.session_manager import SessionManager

logger = logging.getLogger("sepalui.solara.decorators")


[docs] def with_sepal_sessions( show_loading: bool = True, waiting_message: str = "Waiting for authentication headers...", module_name: str = "default", error_handler: Optional[Callable[[Exception], None]] = None, ): """Decorator that ensures a GEE interface is available before running the Solara Page component. Args: show_loading: Whether to show loading messages when session is not ready. waiting_message: Message to show when waiting for headers. module_name: The module name for the SepalClient. error_handler: Custom error handler function. If None, uses default error handling. Returns: Decorator function. Example: .. code-block:: python @with_sepal_sessions(module_name="my.module") def Page(): gee_interface = get_current_gee_interface() sepal_client = get_current_sepal_client() # Your component logic here solara.Markdown("GEE interface is ready!") """ def decorator(component_func: Callable[..., Any]) -> Callable[..., Any]: @wraps(component_func) def wrapper(*args, **kwargs): # Check if headers are available first current_headers = headers.value if current_headers is None: if show_loading: solara.Info(waiting_message) return # Try to create session and handle errors try: session_manager = SessionManager() session_manager.create_session(module_name=module_name) # Session is ready, call the component return component_func(*args, **kwargs) except EEClientError as e: logger.error(f"GEE authentication error in {component_func.__name__}: {e}") if error_handler: error_handler(e) else: with solara.Error(): solara.Markdown(e.message) return except Exception as e: logger.error(f"Unexpected error in {component_func.__name__}: {e}", exc_info=True) if error_handler: error_handler(e) else: with solara.Error(): solara.Markdown(f"An error has occurred: {e}") return return wrapper return decorator