Browse Source

Make default operation IDs deterministic for multi-method routes

pull/14881/head
dawaman43 5 months ago
parent
commit
90ba034b60
  1. 3
      fastapi/utils.py
  2. 8
      tests/test_generate_unique_id_function.py

3
fastapi/utils.py

@ -98,7 +98,8 @@ def generate_unique_id(route: "APIRoute") -> str:
operation_id = f"{route.name}{route.path_format}" operation_id = f"{route.name}{route.path_format}"
operation_id = re.sub(r"\W", "_", operation_id) operation_id = re.sub(r"\W", "_", operation_id)
assert route.methods assert route.methods
operation_id = f"{operation_id}_{list(route.methods)[0].lower()}" method = sorted(route.methods)[0].lower()
operation_id = f"{operation_id}_{method}"
return operation_id return operation_id

8
tests/test_generate_unique_id_function.py

@ -29,6 +29,14 @@ class Message(BaseModel):
description: str description: str
def test_generate_unique_id_is_deterministic_with_multiple_methods():
def read_items(): # pragma: nocover - used for name only
return None
route = APIRoute("/items", read_items, methods=["POST", "GET"])
assert route.unique_id == "read_items_items_get"
def test_top_level_generate_unique_id(): def test_top_level_generate_unique_id():
app = FastAPI(generate_unique_id_function=custom_generate_unique_id) app = FastAPI(generate_unique_id_function=custom_generate_unique_id)
router = APIRouter() router = APIRouter()

Loading…
Cancel
Save