Fix deprecated=False override precedence for included routes by dipenpadhiyar · Pull Request #15183 · fastapi/fastapi

Summary

Fix deprecated precedence when including routers so an explicit deprecated=False
on a route is not overridden by a parent app or router with deprecated=True.

This aligns behavior with expected precedence: route-level configuration should
override parent settings.


Repro

from fastapi import FastAPI, APIRouter

child = APIRouter()

@child.get("/x", deprecated=False)
def x():
    return {"ok": True}

app = FastAPI(deprecated=True)
app.include_router(child)

assert "deprecated" not in app.openapi()["paths"]["/x"]["get"]

Changes

Preserve explicit non-None deprecated values when merging route, router, and app settings

Add a regression test for deprecated=False overriding parent deprecated=True