App
openapi_first.app
openapi_first.app
OpenAPI-first application bootstrap for FastAPI.
This module provides OpenAPIFirstApp, a thin but strict abstraction
that enforces OpenAPI as the single source of truth for a FastAPI service.
Core principles
- The OpenAPI specification (JSON or YAML) defines the entire API surface.
- Every operationId in the OpenAPI spec must have a corresponding Python handler function.
- Handlers are plain Python callables (no FastAPI decorators).
- FastAPI route registration is derived exclusively from the spec.
- FastAPI's autogenerated OpenAPI schema is fully overridden.
What this module does
- Loads and validates an OpenAPI 3.x specification.
- Dynamically binds HTTP routes to handler functions using operationId.
- Registers routes with FastAPI at application startup.
- Ensures runtime behavior matches the OpenAPI contract exactly.
What this module does NOT do
- It does not generate OpenAPI specs.
- It does not generate client code.
- It does not introduce a new framework or lifecycle.
- It does not alter FastAPI dependency injection semantics.
Intended usage
This module is intended for teams that want:
- OpenAPI-first API development
- Strong contract enforcement
- Minimal FastAPI boilerplate
- Predictable, CI-friendly failures for spec/implementation drift
OpenAPIFirstApp
OpenAPIFirstApp(*, openapi_path: str, routes_module: Any, **fastapi_kwargs: Any)
Bases: FastAPI
FastAPI application enforcing OpenAPI-first design.
OpenAPIFirstApp subclasses FastAPI and replaces manual route
registration with OpenAPI-driven binding. All routes are derived
from the provided OpenAPI specification, and each operationId is
mapped to a Python function in the supplied routes module.
Parameters
openapi_path : str Filesystem path to the OpenAPI 3.x specification file. This specification is treated as the authoritative API contract.
module
Python module containing handler functions whose names correspond exactly to OpenAPI operationId values.
**fastapi_kwargs
Additional keyword arguments passed directly to fastapi.FastAPI
(e.g., title, version, middleware, lifespan handlers).
Raises
OpenAPIFirstError If the OpenAPI specification is invalid, or if any declared operationId does not have a corresponding handler function.
Behavior guarantees
- No route can exist without an OpenAPI declaration.
- No OpenAPI operation can exist without a handler.
- Swagger UI and
/openapi.jsonalways reflect the provided spec. - Handler functions remain framework-agnostic and testable.
Example
from openapi_first import OpenAPIFirstApp import app.routes as routes
app = OpenAPIFirstApp( ... openapi_path="app/openapi.json", ... routes_module=routes, ... title="Example Service" ... )