From 56fbe994f0e712d5018803010e7cf569ef31e0d9 Mon Sep 17 00:00:00 2001 From: Ramon Navarro Bosch Date: Mon, 8 Jun 2026 01:54:41 +0200 Subject: [PATCH] Upgrade starlette --- hyperforge/pyproject.toml | 1 + hyperforge/src/hyperforge/api/app.py | 11 ++++++++--- hyperforge/src/hyperforge/fixtures.py | 2 +- hyperforge/src/hyperforge/standalone/app.py | 12 +++++++++--- uv.lock | 8 +++++--- 5 files changed, 24 insertions(+), 10 deletions(-) diff --git a/hyperforge/pyproject.toml b/hyperforge/pyproject.toml index 089b609..f1593c3 100644 --- a/hyperforge/pyproject.toml +++ b/hyperforge/pyproject.toml @@ -42,6 +42,7 @@ dependencies = [ "lru-dict", "sentry_sdk", "fastapi", + "starlette>1.0.0", ] diff --git a/hyperforge/src/hyperforge/api/app.py b/hyperforge/src/hyperforge/api/app.py index 0763236..2aab29c 100644 --- a/hyperforge/src/hyperforge/api/app.py +++ b/hyperforge/src/hyperforge/api/app.py @@ -1,3 +1,4 @@ +from contextlib import asynccontextmanager from typing import Any, Optional, Tuple import prometheus_client # type: ignore @@ -62,7 +63,13 @@ def __init__( *args, **kwargs, ): - super().__init__(*args, **kwargs) + @asynccontextmanager + async def lifespan(app: "HTTPApplication"): + await app.startup() + yield + await app.shutdown() + + super().__init__(*args, lifespan=lifespan, **kwargs) self.settings = settings self.data_manager_settings = data_manager_settings self.include_router(internal.router) @@ -76,8 +83,6 @@ def __init__( if self.extra_middlewares is not None: for extra_middleware in self.extra_middlewares: self.add_middleware(extra_middleware) - self.add_event_handler("startup", self.startup) - self.add_event_handler("shutdown", self.shutdown) async def startup(self) -> None: GLOBAL_REGISTRY.clear() diff --git a/hyperforge/src/hyperforge/fixtures.py b/hyperforge/src/hyperforge/fixtures.py index 3a48fae..fbc3187 100644 --- a/hyperforge/src/hyperforge/fixtures.py +++ b/hyperforge/src/hyperforge/fixtures.py @@ -33,6 +33,7 @@ drop_database, ) +import hyperforge # noqa: F401 from hyperforge.api.app import HTTPApplication from hyperforge.api.settings import Settings from hyperforge.broker.redis import RedisBroker @@ -43,7 +44,6 @@ from hyperforge.server.session import SessionManager from hyperforge.server.settings import Settings as ServerSettings from hyperforge.utils.http import SafeTransport -import hyperforge # noqa: F401 _package_path = pathlib.Path(hyperforge.__file__).parent.absolute() diff --git a/hyperforge/src/hyperforge/standalone/app.py b/hyperforge/src/hyperforge/standalone/app.py index 1e23f35..be303fe 100644 --- a/hyperforge/src/hyperforge/standalone/app.py +++ b/hyperforge/src/hyperforge/standalone/app.py @@ -6,6 +6,7 @@ NucliaDB required. """ +from contextlib import asynccontextmanager from pathlib import Path from typing import Any, Tuple @@ -137,9 +138,17 @@ def __init__( settings: StandaloneSettings, **kwargs: Any, ) -> None: + + @asynccontextmanager + async def lifespan(app: "StandaloneApplication"): + await app._startup() + yield + await app._shutdown() + super().__init__( title="arag standalone", description="Single-process agent RAG — interaction and MCP only", + lifespan=lifespan, **kwargs, ) self._agents_cfg = agents_cfg @@ -173,9 +182,6 @@ def __init__( allow_headers=["*"], ) - self.add_event_handler("startup", self._startup) - self.add_event_handler("shutdown", self._shutdown) - # ------------------------------------------------------------------ # Property used by interaction.py / oauth.py to read answers_subject # and oauth_subject without knowing about StandaloneSettings. diff --git a/uv.lock b/uv.lock index be2c9fb..40385bc 100644 --- a/uv.lock +++ b/uv.lock @@ -1269,6 +1269,7 @@ dependencies = [ { name = "ruff" }, { name = "sentry-sdk" }, { name = "sqlalchemy" }, + { name = "starlette" }, { name = "tenacity" }, { name = "types-redis" }, { name = "websockets" }, @@ -1315,6 +1316,7 @@ requires-dist = [ { name = "ruff", specifier = ">=0.15.10" }, { name = "sentry-sdk" }, { name = "sqlalchemy" }, + { name = "starlette", specifier = ">1.0.0" }, { name = "tenacity" }, { name = "types-redis", specifier = ">=4.6.0.20241004" }, { name = "websockets" }, @@ -4372,15 +4374,15 @@ wheels = [ [[package]] name = "starlette" -version = "0.50.0" +version = "1.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/b8/73a0e6a6e079a9d9cfa64113d771e421640b6f679a52eeb9b32f72d871a1/starlette-0.50.0.tar.gz", hash = "sha256:a2a17b22203254bcbc2e1f926d2d55f3f9497f769416b3190768befe598fa3ca", size = 2646985, upload-time = "2025-11-01T15:25:27.516Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/44/ec35f1b6e83094b997da438a02c8c9b0ade2b1e84cfc48bd4656780760a6/starlette-1.2.1.tar.gz", hash = "sha256:9b9b5ebb992e67d6093741e63c2f59e4f6fff986f81163c087867bd7b924b3f6", size = 2701854, upload-time = "2026-05-31T01:07:51.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/52/1064f510b141bd54025f9b55105e26d1fa970b9be67ad766380a3c9b74b0/starlette-0.50.0-py3-none-any.whl", hash = "sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca", size = 74033, upload-time = "2025-11-01T15:25:25.461Z" }, + { url = "https://files.pythonhosted.org/packages/1c/54/196d0c1db10af76baa4f64894448505d60d3cdf70ef92cbb35f46a4e4c71/starlette-1.2.1-py3-none-any.whl", hash = "sha256:4de0082d08c8f6764a85a54cf1120d6939507a19905c7768acad2a9f875d2b89", size = 73350, upload-time = "2026-05-31T01:07:50.09Z" }, ] [[package]]