From: Jacob Magnusson Date: Sat, 3 Jul 2021 17:15:59 +0000 (+0200) Subject: 🐛 Support custom OpenAPI / JSON Schema fields in the generated output OpenAPI (#1429) X-Git-Tag: 0.66.0~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0ed6c9234186ad61b6e6f21b557c978aed799253;p=thirdparty%2Ffastapi%2Ffastapi.git 🐛 Support custom OpenAPI / JSON Schema fields in the generated output OpenAPI (#1429) Co-authored-by: Sebastián Ramírez --- diff --git a/fastapi/openapi/models.py b/fastapi/openapi/models.py index fd480946dc..efbd88ad74 100644 --- a/fastapi/openapi/models.py +++ b/fastapi/openapi/models.py @@ -117,6 +117,9 @@ class SchemaBase(BaseModel): example: Optional[Any] = None deprecated: Optional[bool] = None + class Config: + extra: str = "allow" + class Schema(SchemaBase): allOf: Optional[List[SchemaBase]] = None diff --git a/tests/test_custom_schema_fields.py b/tests/test_custom_schema_fields.py new file mode 100644 index 0000000000..10b02608c3 --- /dev/null +++ b/tests/test_custom_schema_fields.py @@ -0,0 +1,51 @@ +from fastapi import FastAPI +from fastapi.testclient import TestClient +from pydantic import BaseModel + +app = FastAPI() + + +class Item(BaseModel): + name: str + + class Config: + schema_extra = { + "x-something-internal": {"level": 4}, + } + + +@app.get("/foo", response_model=Item) +def foo(): + return {"name": "Foo item"} + + +client = TestClient(app) + + +item_schema = { + "title": "Item", + "required": ["name"], + "type": "object", + "x-something-internal": { + "level": 4, + }, + "properties": { + "name": { + "title": "Name", + "type": "string", + } + }, +} + + +def test_custom_response_schema(): + response = client.get("/openapi.json") + assert response.status_code == 200, response.text + assert response.json()["components"]["schemas"]["Item"] == item_schema + + +def test_response(): + # For coverage + response = client.get("/foo") + assert response.status_code == 200, response.text + assert response.json() == {"name": "Foo item"}