Route definition primitives for Python services.
Project description
RouteDef 🧭
Runtime-neutral route definitions for Python services.
routedef gives applications one route contract that can be mounted into multiple runtimes. The core package has
no FastAPI, Cloudflare, ASGI, auth, database, or application dependency. Runtime-specific code lives in adapters.
What It Provides ✅
RouteDef: method, path template, handler, and metadata.RouteRequest: canonical request object for handlers.RouteResponse: canonical response object for handlers.RouteTable: ordered method/path matching with{path_param}extraction.build_fastapi_router: FastAPI router integration.CloudflareDispatcher: direct Cloudflare Python Workers integration.
Why Use It 🎯
Use RouteDef when you need the same route definitions to work across more than one Python runtime, especially
when migrating between framework-hosted APIs and Cloudflare Python Workers.
- One handler contract instead of per-runtime handler shapes.
- App-owned auth and authorization through metadata, auth providers, and enforcers.
- Dependency-free core package with optional runtime adapters.
- Testable route behavior without starting a web server.
- Migration-friendly wrappers for legacy split-argument handlers.
Why Not 🚧
Do not use RouteDef as a full web framework, ORM, dependency injection container, auth library, or request
validation system. It intentionally does not own app policy, storage, schemas, background jobs, or runtime
lifecycle. If a service will only ever run in one framework and already has a stable route layer, the adapter
boundary may not be worth adding.
Architecture 🏗️
See docs/architecture.md for package boundaries and examples/README.md for generic samples covering route metadata policy, bearer-token auth, and legacy split-argument handlers.
Basic Usage 🚀
from routedef import RouteDef, RouteRequest, RouteResponse, RouteTable
async def get_item(request: RouteRequest[None, dict[str, object]]) -> RouteResponse:
return RouteResponse.json({"id": request.path_params["id"]})
routes = RouteTable([RouteDef("GET", "/v1/items/{id}", get_item)])
FastAPI
from fastapi import FastAPI
from routedef.adapters.fastapi import build_fastapi_router
app = FastAPI()
app.include_router(build_fastapi_router(routes))
Cloudflare Python Workers
from routedef.adapters.cloudflare import CloudflareDispatcher
from workers import WorkerEntrypoint
dispatcher = CloudflareDispatcher(routes)
class Default(WorkerEntrypoint):
async def fetch(self, request):
return await dispatcher.dispatch(request)
A real local Cloudflare fixture lives in examples/cloudflare-worker. Run it with:
uv run python scripts/check_cloudflare_worker.py
The integration script vendors the local src/routedef package into a temporary Python Worker project, runs
pywrangler sync, starts wrangler@latest dev, and probes routes over HTTP.
Quality Gates 🧪
uv run pre-commit run --all-files
uv run pytest -q --cov=src/routedef --cov-branch --cov-report=term-missing --cov-fail-under=100
uv run pre-commit run mutation-sweep --hook-stage manual
uv run pre-commit run cloudflare-worker-integration --hook-stage manual
The project requires 100% branch coverage, strict typing, security/dead-code/complexity checks, REUSE compliance, max-LOC checks, mutation testing, and a Cloudflare Worker runtime integration gate.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file routedef-0.1.1.tar.gz.
File metadata
- Download URL: routedef-0.1.1.tar.gz
- Upload date:
- Size: 47.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4a933aaa5614cf9a2ff8181a50193c175b56a70361181b9c91eb2cdff1927534
|
|
| MD5 |
42ebab89f24ac6fd53806c7c76a977f6
|
|
| BLAKE2b-256 |
9acb5f80916ef5ecd5839e906b5af4cc7c3cbcdeaa620015f098d397c44bcdf2
|
File details
Details for the file routedef-0.1.1-py3-none-any.whl.
File metadata
- Download URL: routedef-0.1.1-py3-none-any.whl
- Upload date:
- Size: 17.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ac366f886b146d81d74b13235828444729330ee6b0dc4383b9af599133ee096
|
|
| MD5 |
608c10cdaa0c950ca37f3945f4a3fdda
|
|
| BLAKE2b-256 |
56d3553ebdcd6f7b8c3f486ab123ffdb1fea754439adde1ef54661de6342da44
|