Source code for reactpy.backend.default

from __future__ import annotations

import asyncio
from logging import getLogger
from sys import exc_info
from typing import Any, NoReturn

from reactpy.backend.types import BackendType
from reactpy.backend.utils import SUPPORTED_BACKENDS, all_implementations
from reactpy.types import RootComponentConstructor

logger = getLogger(__name__)
_DEFAULT_IMPLEMENTATION: BackendType[Any] | None = None


# BackendType.Options
[docs]class Options: # nocov """Configuration options that can be provided to the backend. This definition should not be used/instantiated. It exists only for type hinting purposes.""" def __init__(self, *args: Any, **kwds: Any) -> NoReturn: msg = "Default implementation has no options." raise ValueError(msg)
# BackendType.configure
[docs]def configure( app: Any, component: RootComponentConstructor, options: None = None ) -> None: """Configure the given app instance to display the given component""" if options is not None: # nocov msg = "Default implementation cannot be configured with options" raise ValueError(msg) return _default_implementation().configure(app, component)
# BackendType.create_development_app
[docs]def create_development_app() -> Any: """Create an application instance for development purposes""" return _default_implementation().create_development_app()
# BackendType.serve_development_app
[docs]async def serve_development_app( app: Any, host: str, port: int, started: asyncio.Event | None = None, ) -> None: """Run an application using a development server""" return await _default_implementation().serve_development_app( app, host, port, started )
def _default_implementation() -> BackendType[Any]: """Get the first available server implementation""" global _DEFAULT_IMPLEMENTATION # noqa: PLW0603 if _DEFAULT_IMPLEMENTATION is not None: return _DEFAULT_IMPLEMENTATION try: implementation = next(all_implementations()) except StopIteration: # nocov logger.debug("Backend implementation import failed", exc_info=exc_info()) supported_backends = ", ".join(SUPPORTED_BACKENDS) msg = ( "It seems you haven't installed a backend. To resolve this issue, " "you can install a backend by running:\n\n" '\033[1mpip install "reactpy[starlette]"\033[0m\n\n' f"Other supported backends include: {supported_backends}." ) raise RuntimeError(msg) from None else: _DEFAULT_IMPLEMENTATION = implementation return implementation