From eeb22ce5c1094d5b6372e780ae611910abc90207 Mon Sep 17 00:00:00 2001 From: Artur Shiriev Date: Thu, 22 Oct 2026 08:37:47 +0300 Subject: [PATCH 1/2] ci: test Python 3.15 and 3.15t as supported versions --- .github/workflows/_checks.yml | 3 +++ README.md | 2 +- pyproject.toml | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/_checks.yml b/.github/workflows/_checks.yml index 2b5bb9f..6c38b35 100644 --- a/.github/workflows/_checks.yml +++ b/.github/workflows/_checks.yml @@ -53,6 +53,7 @@ jobs: - "3.12" - "3.13" - "3.14" + - "3.15" steps: - uses: actions/checkout@v6 - uses: extractions/setup-just@v4 @@ -72,6 +73,8 @@ jobs: include: - python-version: "3.14t" extras: "logging,sentry,fastapi,litestar,faststream,fastmcp,fastapi-metrics,litestar-metrics,faststream-metrics,fastmcp-metrics,otl-http" + - python-version: "3.15t" + extras: "logging,sentry,fastapi,litestar,faststream,fastmcp,fastapi-metrics,litestar-metrics,faststream-metrics,fastmcp-metrics,otl-http" steps: - uses: actions/checkout@v6 - uses: astral-sh/setup-uv@v8.2.0 diff --git a/README.md b/README.md index f9235a3..23bcd26 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ The following intentionally differ: - Configuration. `lite-bootstrap` uses frozen `dataclass` configs with no `pydantic` / `pydantic-settings` runtime dependency, which is what makes it "lite". `microbootstrap` configures everything through `pydantic-settings` models. - Extras. `lite-bootstrap` has one mandatory runtime dependency, the pure-Python `typing-extensions`. Every instrument (`sentry`, `otl`, `logging`, `pyroscope`) and every framework (`fastapi`, `litestar`, `faststream`, `fastmcp`) is its own extra, plus an opt-in `orjson` speedup for logging, per-pair combos (`fastapi-sentry`, `litestar-otl`, `faststream-metrics`, …) and `*-all` rollups. `microbootstrap` bundles the full observability stack (opentelemetry, sentry-sdk, structlog, pyroscope-io, rich, pydantic-settings, …) as base dependencies and only splits framework packages into extras. -- Free-threading. `lite-bootstrap` runs on free-threaded CPython 3.14t. Every extra whose dependencies are pure Python installs there. The rest are blocked upstream: `orjson` and `pyroscope` have no free-threaded wheels, and `otl` needs `grpcio`, so use `otl-http` instead. +- Free-threading. `lite-bootstrap` runs on free-threaded CPython 3.14t and 3.15t. Every extra whose dependencies are pure Python installs there. The rest are blocked upstream: `orjson` and `pyroscope` have no free-threaded wheels, and `otl` needs `grpcio`, so use `otl-http` instead. - Scope. `lite-bootstrap` only wires instruments. It does not include a Granian server runner or a console writer. ## Links diff --git a/pyproject.toml b/pyproject.toml index 91cbd6f..ab66c52 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Typing :: Typed", "Topic :: Software Development :: Libraries", ] From fb2d7ed69b01b20f491ba5df2adbe36013ef2e69 Mon Sep 17 00:00:00 2001 From: Artur Shiriev Date: Thu, 22 Oct 2026 09:12:03 +0300 Subject: [PATCH 2/2] test: cover UNSET's repr directly --- tests/test_types.py | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 tests/test_types.py diff --git a/tests/test_types.py b/tests/test_types.py new file mode 100644 index 0000000..76a0ba5 --- /dev/null +++ b/tests/test_types.py @@ -0,0 +1,5 @@ +from lite_bootstrap.types import UNSET + + +def test_unset_repr() -> None: + assert repr(UNSET) == "UNSET"