From dd6ab23b62187c8b60563bbf2f5324c8b8a901d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 30 Mar 2019 19:53:44 +0400 Subject: [PATCH] :sparkles: Add docs/tests extending OpenAPI (#126) --- .../tutorial/extending-openapi/image01.png | Bin 0 -> 64786 bytes docs/src/extending_openapi/tutorial001.py | 28 ++++++ docs/tutorial/extending-openapi.md | 90 ++++++++++++++++++ mkdocs.yml | 1 + .../test_extending_openapi/__init__.py | 0 .../test_tutorial001.py | 44 +++++++++ 6 files changed, 163 insertions(+) create mode 100644 docs/img/tutorial/extending-openapi/image01.png create mode 100644 docs/src/extending_openapi/tutorial001.py create mode 100644 docs/tutorial/extending-openapi.md create mode 100644 tests/test_tutorial/test_extending_openapi/__init__.py create mode 100644 tests/test_tutorial/test_extending_openapi/test_tutorial001.py diff --git a/docs/img/tutorial/extending-openapi/image01.png b/docs/img/tutorial/extending-openapi/image01.png new file mode 100644 index 0000000000000000000000000000000000000000..26d13293d9c6d557274dabddd858aad2dbfb44b1 GIT binary patch literal 64786 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 sX6?CV*{F@&cm-ReDoc's OpenAPI extension to include a custom logo. + +### Normal **FastAPI** + +First, write all your **FastAPI** application as normally: + +```Python hl_lines="1 4 7 8 9" +{!./src/extending_openapi/tutorial001.py!} +``` + +### Generate the OpenAPI schema + +Then, use the same utility function to generate the OpenAPI schema, inside a `custom_openapi()` function: + +```Python hl_lines="2 15 16 17 18 19 20" +{!./src/extending_openapi/tutorial001.py!} +``` + +### Modify the OpenAPI schema + +Now you can add the ReDoc extension, adding a custom `x-logo` to the `info` "object" in the OpenAPI schema: + +```Python hl_lines="21 22 23" +{!./src/extending_openapi/tutorial001.py!} +``` + +### Cache the OpenAPI schema + +You can use the property `.openapi_schema` as a "cache", to store your generated schema. + +That way, your application won't have to generate the schema every time a user opens your API docs. + +It will be generated only once, and then the same cached schema will be used for the next requests. + +```Python hl_lines="13 14 24 25" +{!./src/extending_openapi/tutorial001.py!} +``` + +### Override the method + +Now you can replace the `.openapi()` method with your new function. + +```Python hl_lines="28" +{!./src/extending_openapi/tutorial001.py!} +``` + +### Check it + +Once you go to http://127.0.0.1:8000/redoc you will see that you are using your custom logo (in this example, **FastAPI**'s logo): + + diff --git a/mkdocs.yml b/mkdocs.yml index f550d4867..4edc575f2 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -67,6 +67,7 @@ nav: - WebSockets: 'tutorial/websockets.md' - 'Events: startup - shutdown': 'tutorial/events.md' - Debugging: 'tutorial/debugging.md' + - Extending OpenAPI: 'tutorial/extending-openapi.md' - Concurrency and async / await: 'async.md' - Deployment: 'deployment.md' - Project Generation - Template: 'project-generation.md' diff --git a/tests/test_tutorial/test_extending_openapi/__init__.py b/tests/test_tutorial/test_extending_openapi/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_tutorial/test_extending_openapi/test_tutorial001.py b/tests/test_tutorial/test_extending_openapi/test_tutorial001.py new file mode 100644 index 000000000..860009614 --- /dev/null +++ b/tests/test_tutorial/test_extending_openapi/test_tutorial001.py @@ -0,0 +1,44 @@ +from starlette.testclient import TestClient + +from extending_openapi.tutorial001 import app + +client = TestClient(app) + +openapi_schema = { + "openapi": "3.0.2", + "info": { + "title": "Custom title", + "version": "2.5.0", + "description": "This is a very custom OpenAPI schema", + "x-logo": {"url": "https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png"}, + }, + "paths": { + "/items/": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + } + }, + "summary": "Read Items Get", + "operationId": "read_items_items__get", + } + } + }, +} + + +def test_openapi_schema(): + response = client.get("/openapi.json") + assert response.status_code == 200 + assert response.json() == openapi_schema + response = client.get("/openapi.json") + assert response.status_code == 200 + assert response.json() == openapi_schema + + +def test(): + response = client.get("/items/") + assert response.status_code == 200 + assert response.json() == [{"name": "Foo"}]