From f5d7df3c6ce0b7184404a87195393a48e1c6d2c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 21 Feb 2022 16:51:26 +0100 Subject: [PATCH 01/59] =?UTF-8?q?=E2=9C=A8=20Include=20route=20in=20scope?= =?UTF-8?q?=20to=20allow=20middleware=20and=20other=20tools=20to=20extract?= =?UTF-8?q?=20its=20information=20(#4603)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastapi/routing.py | 17 +++++++++++-- tests/test_route_scope.py | 50 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 tests/test_route_scope.py diff --git a/fastapi/routing.py b/fastapi/routing.py index f6d5370d6..7dae04521 100644 --- a/fastapi/routing.py +++ b/fastapi/routing.py @@ -13,6 +13,7 @@ from typing import ( Optional, Sequence, Set, + Tuple, Type, Union, ) @@ -44,7 +45,7 @@ from starlette.concurrency import run_in_threadpool from starlette.exceptions import HTTPException from starlette.requests import Request from starlette.responses import JSONResponse, Response -from starlette.routing import BaseRoute +from starlette.routing import BaseRoute, Match from starlette.routing import Mount as Mount # noqa from starlette.routing import ( compile_path, @@ -53,7 +54,7 @@ from starlette.routing import ( websocket_session, ) from starlette.status import WS_1008_POLICY_VIOLATION -from starlette.types import ASGIApp +from starlette.types import ASGIApp, Scope from starlette.websockets import WebSocket @@ -296,6 +297,12 @@ class APIWebSocketRoute(routing.WebSocketRoute): ) self.path_regex, self.path_format, self.param_convertors = compile_path(path) + def matches(self, scope: Scope) -> Tuple[Match, Scope]: + match, child_scope = super().matches(scope) + if match != Match.NONE: + child_scope["route"] = self + return match, child_scope + class APIRoute(routing.Route): def __init__( @@ -432,6 +439,12 @@ class APIRoute(routing.Route): dependency_overrides_provider=self.dependency_overrides_provider, ) + def matches(self, scope: Scope) -> Tuple[Match, Scope]: + match, child_scope = super().matches(scope) + if match != Match.NONE: + child_scope["route"] = self + return match, child_scope + class APIRouter(routing.Router): def __init__( diff --git a/tests/test_route_scope.py b/tests/test_route_scope.py new file mode 100644 index 000000000..a188e9a5f --- /dev/null +++ b/tests/test_route_scope.py @@ -0,0 +1,50 @@ +import pytest +from fastapi import FastAPI, Request, WebSocket, WebSocketDisconnect +from fastapi.routing import APIRoute, APIWebSocketRoute +from fastapi.testclient import TestClient + +app = FastAPI() + + +@app.get("/users/{user_id}") +async def get_user(user_id: str, request: Request): + route: APIRoute = request.scope["route"] + return {"user_id": user_id, "path": route.path} + + +@app.websocket("/items/{item_id}") +async def websocket_item(item_id: str, websocket: WebSocket): + route: APIWebSocketRoute = websocket.scope["route"] + await websocket.accept() + await websocket.send_json({"item_id": item_id, "path": route.path}) + + +client = TestClient(app) + + +def test_get(): + response = client.get("/users/rick") + assert response.status_code == 200, response.text + assert response.json() == {"user_id": "rick", "path": "/users/{user_id}"} + + +def test_invalid_method_doesnt_match(): + response = client.post("/users/rick") + assert response.status_code == 405, response.text + + +def test_invalid_path_doesnt_match(): + response = client.post("/usersx/rick") + assert response.status_code == 404, response.text + + +def test_websocket(): + with client.websocket_connect("/items/portal-gun") as websocket: + data = websocket.receive_json() + assert data == {"item_id": "portal-gun", "path": "/items/{item_id}"} + + +def test_websocket_invalid_path_doesnt_match(): + with pytest.raises(WebSocketDisconnect): + with client.websocket_connect("/itemsx/portal-gun") as websocket: + websocket.receive_json() From e95305905406e447223e35ee748f61b32de135fb Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 21 Feb 2022 15:52:03 +0000 Subject: [PATCH 02/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 64f9dde64..78265815e 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* ✨ Include route in scope to allow middleware and other tools to extract its information. PR [#4603](https://github.com/tiangolo/fastapi/pull/4603) by [@tiangolo](https://github.com/tiangolo). ## 0.74.0 From 440d2d2d1a72867b3f38b5c7359e021cccbfea8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 21 Feb 2022 16:54:18 +0100 Subject: [PATCH 03/59] =?UTF-8?q?=F0=9F=94=96=20Release=20version=200.74.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 5 +++++ fastapi/__init__.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 78265815e..c5ca7376d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,11 @@ ## Latest Changes + +## 0.74.1 + +### Features + * ✨ Include route in scope to allow middleware and other tools to extract its information. PR [#4603](https://github.com/tiangolo/fastapi/pull/4603) by [@tiangolo](https://github.com/tiangolo). ## 0.74.0 diff --git a/fastapi/__init__.py b/fastapi/__init__.py index 5772e7ec8..dc265558a 100644 --- a/fastapi/__init__.py +++ b/fastapi/__init__.py @@ -1,6 +1,6 @@ """FastAPI framework, high performance, easy to learn, fast to code, ready for production""" -__version__ = "0.74.0" +__version__ = "0.74.1" from starlette import status as status From 8a0d4c79c18e6bd219b965b9d50578c139e7efd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Fri, 4 Mar 2022 14:02:18 -0800 Subject: [PATCH 04/59] =?UTF-8?q?=E2=9C=A8=20Add=20support=20for=20custom?= =?UTF-8?q?=20`generate=5Funique=5Fid=5Ffunction`=20and=20docs=20for=20gen?= =?UTF-8?q?erating=20clients=20(#4650)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/advanced/generate-clients.md | 267 +++ .../img/tutorial/generate-clients/image01.png | Bin 0 -> 78022 bytes .../img/tutorial/generate-clients/image02.png | Bin 0 -> 59828 bytes .../img/tutorial/generate-clients/image03.png | Bin 0 -> 61043 bytes .../img/tutorial/generate-clients/image04.png | Bin 0 -> 53853 bytes .../img/tutorial/generate-clients/image05.png | Bin 0 -> 31091 bytes .../img/tutorial/generate-clients/image06.png | Bin 0 -> 43434 bytes .../img/tutorial/generate-clients/image07.png | Bin 0 -> 49947 bytes .../img/tutorial/generate-clients/image08.png | Bin 0 -> 30019 bytes docs/en/mkdocs.yml | 1 + docs_src/generate_clients/tutorial001.py | 28 + docs_src/generate_clients/tutorial001_py39.py | 26 + docs_src/generate_clients/tutorial002.py | 38 + docs_src/generate_clients/tutorial002_py39.py | 36 + docs_src/generate_clients/tutorial003.py | 44 + docs_src/generate_clients/tutorial003_py39.py | 42 + docs_src/generate_clients/tutorial004.py | 15 + fastapi/applications.py | 114 +- fastapi/openapi/utils.py | 41 +- fastapi/routing.py | 117 +- fastapi/utils.py | 24 +- tests/test_generate_unique_id_function.py | 1617 +++++++++++++++++ .../test_include_router_defaults_overrides.py | 8 +- .../test_generate_clients/__init__.py | 0 .../test_generate_clients/test_tutorial003.py | 188 ++ 25 files changed, 2536 insertions(+), 70 deletions(-) create mode 100644 docs/en/docs/advanced/generate-clients.md create mode 100644 docs/en/docs/img/tutorial/generate-clients/image01.png create mode 100644 docs/en/docs/img/tutorial/generate-clients/image02.png create mode 100644 docs/en/docs/img/tutorial/generate-clients/image03.png create mode 100644 docs/en/docs/img/tutorial/generate-clients/image04.png create mode 100644 docs/en/docs/img/tutorial/generate-clients/image05.png create mode 100644 docs/en/docs/img/tutorial/generate-clients/image06.png create mode 100644 docs/en/docs/img/tutorial/generate-clients/image07.png create mode 100644 docs/en/docs/img/tutorial/generate-clients/image08.png create mode 100644 docs_src/generate_clients/tutorial001.py create mode 100644 docs_src/generate_clients/tutorial001_py39.py create mode 100644 docs_src/generate_clients/tutorial002.py create mode 100644 docs_src/generate_clients/tutorial002_py39.py create mode 100644 docs_src/generate_clients/tutorial003.py create mode 100644 docs_src/generate_clients/tutorial003_py39.py create mode 100644 docs_src/generate_clients/tutorial004.py create mode 100644 tests/test_generate_unique_id_function.py create mode 100644 tests/test_tutorial/test_generate_clients/__init__.py create mode 100644 tests/test_tutorial/test_generate_clients/test_tutorial003.py diff --git a/docs/en/docs/advanced/generate-clients.md b/docs/en/docs/advanced/generate-clients.md new file mode 100644 index 000000000..f31a248d0 --- /dev/null +++ b/docs/en/docs/advanced/generate-clients.md @@ -0,0 +1,267 @@ +# Generate Clients + +As **FastAPI** is based on the OpenAPI specification, you get automatic compatibility with many tools, including the automatic API docs (provided by Swagger UI). + +One particular advantage that is not necessarily obvious is that you can **generate clients** (sometimes called **SDKs** ) for your API, for many different **programming languages**. + +## OpenAPI Client Generators + +There are many tools to generate clients from **OpenAPI**. + +A common tool is OpenAPI Generator. + +If you are building a **frontend**, a very interesting alternative is openapi-typescript-codegen. + +## Generate a TypeScript Frontend Client + +Let's start with a simple FastAPI application: + +=== "Python 3.6 and above" + + ```Python hl_lines="9-11 14-15 18 19 23" + {!> ../../../docs_src/generate_clients/tutorial001.py!} + ``` + +=== "Python 3.9 and above" + + ```Python hl_lines="7-9 12-13 16-17 21" + {!> ../../../docs_src/generate_clients/tutorial001_py39.py!} + ``` + +Notice that the *path operations* define the models they use for request payload and response payload, using the models `Item` and `ResponseMessage`. + +### API Docs + +If you go to the API docs, you will see that it has the **schemas** for the data to be sent in requests and received in responses: + + + +You can see those schemas because they were declared with the models in the app. + +That information is available in the app's **OpenAPI schema**, and then shown in the API docs (by Swagger UI). + +And that same information from the models that is included in OpenAPI is what can be used to **generate the client code**. + +### Generate a TypeScript Client + +Now that we have the app with the models, we can generate the client code for the frontend. + +#### Install `openapi-typescript-codegen` + +You can install `openapi-typescript-codegen` in your frontend code with: + +
+ +```console +$ npm install openapi-typescript-codegen --save-dev + +---> 100% +``` + +
+ +#### Generate Client Code + +To generate the client code you can use the command line application `openapi` that would now be installed. + +Because it is installed in the local project, you probably wouldn't be able to call that command directly, but you would put it on your `package.json` file. + +It could look like this: + +```JSON hl_lines="7" +{ + "name": "frontend-app", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "generate-client": "openapi --input http://localhost:8000/openapi.json --output ./src/client --client axios" + }, + "author": "", + "license": "", + "devDependencies": { + "openapi-typescript-codegen": "^0.20.1", + "typescript": "^4.6.2" + } +} +``` + +After having that NPM `generate-client` script there, you can run it with: + +
+ +```console +$ npm run generate-client + +frontend-app@1.0.0 generate-client /home/user/code/frontend-app +> openapi --input http://localhost:8000/openapi.json --output ./src/client --client axios +``` + +
+ +That command will generate code in `./src/client` and will use `axios` (the frontend HTTP library) internally. + +### Try Out the Client Code + +Now you can import and use the client code, it could look like this, notice that you get autocompletion for the methods: + + + +You will also get autocompletion for the payload to send: + + + +!!! tip + Notice the autocompletion for `name` and `price`, that was defined in the FastAPI application, in the `Item` model. + +You will have inline errors for the data that you send: + + + +The response object will also have autocompletion: + + + +## FastAPI App with Tags + +In many cases your FastAPI app will be bigger, and you will probably use tags to separate different groups of *path operations*. + +For example, you could have a section for **items** and another section for **users**, and they could be separated by tags: + + +=== "Python 3.6 and above" + + ```Python hl_lines="23 28 36" + {!> ../../../docs_src/generate_clients/tutorial002.py!} + ``` + +=== "Python 3.9 and above" + + ```Python hl_lines="21 26 34" + {!> ../../../docs_src/generate_clients/tutorial002_py39.py!} + ``` + +### Generate a TypeScript Client with Tags + +If you generate a client for a FastAPI app using tags, it will normally also separate the client code based on the tags. + +This way you will be able to have things ordered and grouped correctly for the client code: + + + +In this case you have: + +* `ItemsService` +* `UsersService` + +### Client Method Names + +Right now the generated method names like `createItemItemsPost` don't look very clean: + +```TypeScript +ItemsService.createItemItemsPost({name: "Plumbus", price: 5}) +``` + +...that's because the client generator uses the OpenAPI internal **operation ID** for each *path operation*. + +OpenAPI requires that each operation ID is unique across all the *path operations*, so FastAPI uses the **function name**, the **path**, and the **HTTP method/operation** to generate that operation ID, because that way it can make sure that the operation IDs are unique. + +But I'll show you how to improve that next. 🤓 + +## Custom Operation IDs and Better Method Names + +You can **modify** the way these operation IDs are **generated** to make them simpler and have **simpler method names** in the clients. + +In this case you will have to ensure that each operation ID is **unique** in some other way. + +For example, you could make sure that each *path operation* has a tag, and then generate the operation ID based on the **tag** and the *path operation* **name** (the function name). + +### Custom Generate Unique ID Function + +FastAPI uses a **unique ID** for each *path operation*, it is used for the **operation ID** and also for the names of any needed custom models, for requests or responses. + +You can customize that function. It takes an `APIRoute` and outputs a string. + +For example, here it is using the first tag (you will probably have only one tag) and the *path operation* name (the function name). + +You can then pass that custom function to **FastAPI** as the `generate_unique_id_function` parameter: + +=== "Python 3.6 and above" + + ```Python hl_lines="8-9 12" + {!> ../../../docs_src/generate_clients/tutorial003.py!} + ``` + +=== "Python 3.9 and above" + + ```Python hl_lines="6-7 10" + {!> ../../../docs_src/generate_clients/tutorial003_py39.py!} + ``` + +### Generate a TypeScript Client with Custom Operation IDs + +Now if you generate the client again, you will see that it has the improved method names: + + + +As you see, the method names now have the tag and then the function name, now they don't include information from the URL path and the HTTP operation. + +### Preprocess the OpenAPI Specification for the Client Generator + +The generated code still has some **duplicated information**. + +We already know that this method is related to the **items** because that word is in the `ItemsService` (taken from the tag), but we still have the tag name prefixed in the method name too. 😕 + +We will probably still want to keep it for OpenAPI in general, as that will ensure that the operation IDs are **unique**. + +But for the generated client we could **modify** the OpenAPI operation IDs right before generating the clients, just to make those method names nicer and **cleaner**. + +We could download the OpenAPI JSON to a file `openapi.json` and then we could **remove that prefixed tag** with a script like this: + +```Python +{!../../../docs_src/generate_clients/tutorial004.py!} +``` + +With that, the operation IDs would be renamed from things like `items-get_items` to just `get_items`, that way the client generator can generate simpler method names. + +### Generate a TypeScript Client with the Preprocessed OpenAPI + +Now as the end result is in a file `openapi.json`, you would modify the `package.json` to use that local file, for example: + +```JSON hl_lines="7" +{ + "name": "frontend-app", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "generate-client": "openapi --input ./openapi.json --output ./src/client --client axios" + }, + "author": "", + "license": "", + "devDependencies": { + "openapi-typescript-codegen": "^0.20.1", + "typescript": "^4.6.2" + } +} +``` + +After generating the new client, you would now have **clean method names**, with all the **autocompletion**, **inline errors**, etc: + + + +## Benefits + +When using the automatically generated clients you would **autocompletion** for: + +* Methods. +* Request payloads in the body, query parameters, etc. +* Response payloads. + +You would also have **inline errors** for everything. + +And whenever you update the backend code, and **regenerate** the frontend, it would have any new *path operations* available as methods, the old ones removed, and any other change would be reflected on the generated code. 🤓 + +This also means that if something changed it will be **reflected** on the client code automatically. And if you **build** the client it will error out if you have any **mismatch** in the data used. + +So, you would **detect many errors** very early in the development cycle instead of having to wait for the errors to show up to your final users in production and then trying to debug where the problem is. ✨ diff --git a/docs/en/docs/img/tutorial/generate-clients/image01.png b/docs/en/docs/img/tutorial/generate-clients/image01.png new file mode 100644 index 0000000000000000000000000000000000000000..f23d57773c8f4274b03750a231ca28700c17cd26 GIT binary patch literal 78022 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 literal 0 HcmV?d00001 diff --git a/docs/en/docs/img/tutorial/generate-clients/image02.png b/docs/en/docs/img/tutorial/generate-clients/image02.png new file mode 100644 index 0000000000000000000000000000000000000000..f991352eb319968b48d250dbce616f4fefee4a7a GIT binary patch literal 59828 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

^JVTJ_UZf80nR0bkG);Q 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%0DBXpx8 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 literal 0 HcmV?d00001 diff --git a/docs/en/docs/img/tutorial/generate-clients/image03.png b/docs/en/docs/img/tutorial/generate-clients/image03.png new file mode 100644 index 0000000000000000000000000000000000000000..e2514b0481a81262a307361c7e77a4464056f7b3 GIT binary patch literal 61043 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 G`~L<2+%|&% literal 0 HcmV?d00001 diff --git a/docs/en/docs/img/tutorial/generate-clients/image04.png b/docs/en/docs/img/tutorial/generate-clients/image04.png new file mode 100644 index 0000000000000000000000000000000000000000..777a695bbb1e3484f63594007e3fead45890c6c6 GIT binary patch literal 53853 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 literal 0 HcmV?d00001 diff --git a/docs/en/docs/img/tutorial/generate-clients/image05.png b/docs/en/docs/img/tutorial/generate-clients/image05.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e53179dcc2b244f2fbe62dced312a3c1ae5160 GIT binary patch literal 31091 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 literal 0 HcmV?d00001 diff --git a/docs/en/docs/img/tutorial/generate-clients/image06.png b/docs/en/docs/img/tutorial/generate-clients/image06.png new file mode 100644 index 0000000000000000000000000000000000000000..0e9a100ea4e8bac7a85e54915286a602e0d9c5e2 GIT binary patch literal 43434 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 O6l7KJ None: self._debug: bool = debug + self.title = title + self.description = description + self.version = version + self.terms_of_service = terms_of_service + self.contact = contact + self.license_info = license_info + self.openapi_url = openapi_url + self.openapi_tags = openapi_tags + self.root_path_in_servers = root_path_in_servers + self.docs_url = docs_url + self.redoc_url = redoc_url + self.swagger_ui_oauth2_redirect_url = swagger_ui_oauth2_redirect_url + self.swagger_ui_init_oauth = swagger_ui_init_oauth + self.swagger_ui_parameters = swagger_ui_parameters + self.servers = servers or [] + self.extra = extra + self.openapi_version = "3.0.2" + self.openapi_schema: Optional[Dict[str, Any]] = None + if self.openapi_url: + assert self.title, "A title must be provided for OpenAPI, e.g.: 'My API'" + assert self.version, "A version must be provided for OpenAPI, e.g.: '2.1.0'" + # TODO: remove when discarding the openapi_prefix parameter + if openapi_prefix: + logger.warning( + '"openapi_prefix" has been deprecated in favor of "root_path", which ' + "follows more closely the ASGI standard, is simpler, and more " + "automatic. Check the docs at " + "https://fastapi.tiangolo.com/advanced/sub-applications/" + ) + self.root_path = root_path or openapi_prefix self.state: State = State() + self.dependency_overrides: Dict[Callable[..., Any], Callable[..., Any]] = {} self.router: routing.APIRouter = routing.APIRouter( routes=routes, dependency_overrides_provider=self, @@ -83,6 +118,7 @@ class FastAPI(Starlette): deprecated=deprecated, include_in_schema=include_in_schema, responses=responses, + generate_unique_id_function=generate_unique_id_function, ) self.exception_handlers: Dict[ Union[int, Type[Exception]], @@ -99,40 +135,6 @@ class FastAPI(Starlette): [] if middleware is None else list(middleware) ) self.middleware_stack: ASGIApp = self.build_middleware_stack() - - self.title = title - self.description = description - self.version = version - self.terms_of_service = terms_of_service - self.contact = contact - self.license_info = license_info - self.servers = servers or [] - self.openapi_url = openapi_url - self.openapi_tags = openapi_tags - # TODO: remove when discarding the openapi_prefix parameter - if openapi_prefix: - logger.warning( - '"openapi_prefix" has been deprecated in favor of "root_path", which ' - "follows more closely the ASGI standard, is simpler, and more " - "automatic. Check the docs at " - "https://fastapi.tiangolo.com/advanced/sub-applications/" - ) - self.root_path = root_path or openapi_prefix - self.root_path_in_servers = root_path_in_servers - self.docs_url = docs_url - self.redoc_url = redoc_url - self.swagger_ui_oauth2_redirect_url = swagger_ui_oauth2_redirect_url - self.swagger_ui_init_oauth = swagger_ui_init_oauth - self.swagger_ui_parameters = swagger_ui_parameters - self.extra = extra - self.dependency_overrides: Dict[Callable[..., Any], Callable[..., Any]] = {} - - self.openapi_version = "3.0.2" - - if self.openapi_url: - assert self.title, "A title must be provided for OpenAPI, e.g.: 'My API'" - assert self.version, "A version must be provided for OpenAPI, e.g.: '2.1.0'" - self.openapi_schema: Optional[Dict[str, Any]] = None self.setup() def build_middleware_stack(self) -> ASGIApp: @@ -286,6 +288,9 @@ class FastAPI(Starlette): ), name: Optional[str] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[routing.APIRoute], str] = Default( + generate_unique_id + ), ) -> None: self.router.add_api_route( path, @@ -311,6 +316,7 @@ class FastAPI(Starlette): response_class=response_class, name=name, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) def api_route( @@ -338,6 +344,9 @@ class FastAPI(Starlette): response_class: Type[Response] = Default(JSONResponse), name: Optional[str] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[routing.APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: def decorator(func: DecoratedCallable) -> DecoratedCallable: self.router.add_api_route( @@ -364,6 +373,7 @@ class FastAPI(Starlette): response_class=response_class, name=name, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) return func @@ -395,6 +405,9 @@ class FastAPI(Starlette): include_in_schema: bool = True, default_response_class: Type[Response] = Default(JSONResponse), callbacks: Optional[List[BaseRoute]] = None, + generate_unique_id_function: Callable[[routing.APIRoute], str] = Default( + generate_unique_id + ), ) -> None: self.router.include_router( router, @@ -406,6 +419,7 @@ class FastAPI(Starlette): include_in_schema=include_in_schema, default_response_class=default_response_class, callbacks=callbacks, + generate_unique_id_function=generate_unique_id_function, ) def get( @@ -433,6 +447,9 @@ class FastAPI(Starlette): name: Optional[str] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[routing.APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: return self.router.get( path, @@ -457,6 +474,7 @@ class FastAPI(Starlette): name=name, callbacks=callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) def put( @@ -484,6 +502,9 @@ class FastAPI(Starlette): name: Optional[str] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[routing.APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: return self.router.put( path, @@ -508,6 +529,7 @@ class FastAPI(Starlette): name=name, callbacks=callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) def post( @@ -535,6 +557,9 @@ class FastAPI(Starlette): name: Optional[str] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[routing.APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: return self.router.post( path, @@ -559,6 +584,7 @@ class FastAPI(Starlette): name=name, callbacks=callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) def delete( @@ -586,6 +612,9 @@ class FastAPI(Starlette): name: Optional[str] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[routing.APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: return self.router.delete( path, @@ -610,6 +639,7 @@ class FastAPI(Starlette): name=name, callbacks=callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) def options( @@ -637,6 +667,9 @@ class FastAPI(Starlette): name: Optional[str] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[routing.APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: return self.router.options( path, @@ -661,6 +694,7 @@ class FastAPI(Starlette): name=name, callbacks=callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) def head( @@ -688,6 +722,9 @@ class FastAPI(Starlette): name: Optional[str] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[routing.APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: return self.router.head( path, @@ -712,6 +749,7 @@ class FastAPI(Starlette): name=name, callbacks=callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) def patch( @@ -739,6 +777,9 @@ class FastAPI(Starlette): name: Optional[str] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[routing.APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: return self.router.patch( path, @@ -763,6 +804,7 @@ class FastAPI(Starlette): name=name, callbacks=callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) def trace( @@ -790,6 +832,9 @@ class FastAPI(Starlette): name: Optional[str] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[routing.APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: return self.router.trace( path, @@ -814,4 +859,5 @@ class FastAPI(Starlette): name=name, callbacks=callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) diff --git a/fastapi/openapi/utils.py b/fastapi/openapi/utils.py index aff76b15e..58a748d04 100644 --- a/fastapi/openapi/utils.py +++ b/fastapi/openapi/utils.py @@ -1,5 +1,6 @@ import http.client import inspect +import warnings from enum import Enum from typing import Any, Dict, List, Optional, Sequence, Set, Tuple, Type, Union, cast @@ -140,7 +141,15 @@ def get_openapi_operation_request_body( return request_body_oai -def generate_operation_id(*, route: routing.APIRoute, method: str) -> str: +def generate_operation_id( + *, route: routing.APIRoute, method: str +) -> str: # pragma: nocover + warnings.warn( + "fastapi.openapi.utils.generate_operation_id() was deprecated, " + "it is not used internally, and will be removed soon", + DeprecationWarning, + stacklevel=2, + ) if route.operation_id: return route.operation_id path: str = route.path_format @@ -154,7 +163,7 @@ def generate_operation_summary(*, route: routing.APIRoute, method: str) -> str: def get_openapi_operation_metadata( - *, route: routing.APIRoute, method: str + *, route: routing.APIRoute, method: str, operation_ids: Set[str] ) -> Dict[str, Any]: operation: Dict[str, Any] = {} if route.tags: @@ -162,14 +171,25 @@ def get_openapi_operation_metadata( operation["summary"] = generate_operation_summary(route=route, method=method) if route.description: operation["description"] = route.description - operation["operationId"] = generate_operation_id(route=route, method=method) + operation_id = route.operation_id or route.unique_id + if operation_id in operation_ids: + message = ( + f"Duplicate Operation ID {operation_id} for function " + + f"{route.endpoint.__name__}" + ) + file_name = getattr(route.endpoint, "__globals__", {}).get("__file__") + if file_name: + message += f" at {file_name}" + warnings.warn(message) + operation_ids.add(operation_id) + operation["operationId"] = operation_id if route.deprecated: operation["deprecated"] = route.deprecated return operation def get_openapi_path( - *, route: routing.APIRoute, model_name_map: Dict[type, str] + *, route: routing.APIRoute, model_name_map: Dict[type, str], operation_ids: Set[str] ) -> Tuple[Dict[str, Any], Dict[str, Any], Dict[str, Any]]: path = {} security_schemes: Dict[str, Any] = {} @@ -183,7 +203,9 @@ def get_openapi_path( route_response_media_type: Optional[str] = current_response_class.media_type if route.include_in_schema: for method in route.methods: - operation = get_openapi_operation_metadata(route=route, method=method) + operation = get_openapi_operation_metadata( + route=route, method=method, operation_ids=operation_ids + ) parameters: List[Dict[str, Any]] = [] flat_dependant = get_flat_dependant(route.dependant, skip_repeats=True) security_definitions, operation_security = get_openapi_security_definitions( @@ -217,7 +239,9 @@ def get_openapi_path( cb_security_schemes, cb_definitions, ) = get_openapi_path( - route=callback, model_name_map=model_name_map + route=callback, + model_name_map=model_name_map, + operation_ids=operation_ids, ) callbacks[callback.name] = {callback.path: cb_path} operation["callbacks"] = callbacks @@ -384,6 +408,7 @@ def get_openapi( output["servers"] = servers components: Dict[str, Dict[str, Any]] = {} paths: Dict[str, Dict[str, Any]] = {} + operation_ids: Set[str] = set() flat_models = get_flat_models_from_routes(routes) model_name_map = get_model_name_map(flat_models) definitions = get_model_definitions( @@ -391,7 +416,9 @@ def get_openapi( ) for route in routes: if isinstance(route, routing.APIRoute): - result = get_openapi_path(route=route, model_name_map=model_name_map) + result = get_openapi_path( + route=route, model_name_map=model_name_map, operation_ids=operation_ids + ) if result: path, security_schemes, path_definitions = result if path: diff --git a/fastapi/routing.py b/fastapi/routing.py index 7dae04521..0f416ac42 100644 --- a/fastapi/routing.py +++ b/fastapi/routing.py @@ -34,7 +34,7 @@ from fastapi.types import DecoratedCallable from fastapi.utils import ( create_cloned_field, create_response_field, - generate_operation_id_for_path, + generate_unique_id, get_value_or_default, ) from pydantic import BaseModel @@ -335,21 +335,47 @@ class APIRoute(routing.Route): dependency_overrides_provider: Optional[Any] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Union[ + Callable[["APIRoute"], str], DefaultPlaceholder + ] = Default(generate_unique_id), ) -> None: - # normalise enums e.g. http.HTTPStatus - if isinstance(status_code, IntEnum): - status_code = int(status_code) self.path = path self.endpoint = endpoint + self.response_model = response_model + self.summary = summary + self.response_description = response_description + self.deprecated = deprecated + self.operation_id = operation_id + self.response_model_include = response_model_include + self.response_model_exclude = response_model_exclude + self.response_model_by_alias = response_model_by_alias + self.response_model_exclude_unset = response_model_exclude_unset + self.response_model_exclude_defaults = response_model_exclude_defaults + self.response_model_exclude_none = response_model_exclude_none + self.include_in_schema = include_in_schema + self.response_class = response_class + self.dependency_overrides_provider = dependency_overrides_provider + self.callbacks = callbacks + self.openapi_extra = openapi_extra + self.generate_unique_id_function = generate_unique_id_function + self.tags = tags or [] + self.responses = responses or {} self.name = get_name(endpoint) if name is None else name self.path_regex, self.path_format, self.param_convertors = compile_path(path) if methods is None: methods = ["GET"] self.methods: Set[str] = set([method.upper() for method in methods]) - self.unique_id = generate_operation_id_for_path( - name=self.name, path=self.path_format, method=list(methods)[0] - ) - self.response_model = response_model + if isinstance(generate_unique_id_function, DefaultPlaceholder): + current_generate_unique_id: Callable[ + ["APIRoute"], str + ] = generate_unique_id_function.value + else: + current_generate_unique_id = generate_unique_id_function + self.unique_id = self.operation_id or current_generate_unique_id(self) + # normalize enums e.g. http.HTTPStatus + if isinstance(status_code, IntEnum): + status_code = int(status_code) + self.status_code = status_code if self.response_model: assert ( status_code not in STATUS_CODES_WITH_NO_BODY @@ -371,19 +397,14 @@ class APIRoute(routing.Route): else: self.response_field = None # type: ignore self.secure_cloned_response_field = None - self.status_code = status_code - self.tags = tags or [] if dependencies: self.dependencies = list(dependencies) else: self.dependencies = [] - self.summary = summary self.description = description or inspect.cleandoc(self.endpoint.__doc__ or "") # if a "form feed" character (page break) is found in the description text, # truncate description text to the content preceding the first "form feed" self.description = self.description.split("\f")[0] - self.response_description = response_description - self.responses = responses or {} response_fields = {} for additional_status_code, response in self.responses.items(): assert isinstance(response, dict), "An additional response must be a dict" @@ -399,16 +420,6 @@ class APIRoute(routing.Route): self.response_fields: Dict[Union[int, str], ModelField] = response_fields else: self.response_fields = {} - self.deprecated = deprecated - self.operation_id = operation_id - self.response_model_include = response_model_include - self.response_model_exclude = response_model_exclude - self.response_model_by_alias = response_model_by_alias - self.response_model_exclude_unset = response_model_exclude_unset - self.response_model_exclude_defaults = response_model_exclude_defaults - self.response_model_exclude_none = response_model_exclude_none - self.include_in_schema = include_in_schema - self.response_class = response_class assert callable(endpoint), "An endpoint must be a callable" self.dependant = get_dependant(path=self.path_format, call=self.endpoint) @@ -418,10 +429,7 @@ class APIRoute(routing.Route): get_parameterless_sub_dependant(depends=depends, path=self.path_format), ) self.body_field = get_body_field(dependant=self.dependant, name=self.unique_id) - self.dependency_overrides_provider = dependency_overrides_provider - self.callbacks = callbacks self.app = request_response(self.get_route_handler()) - self.openapi_extra = openapi_extra def get_route_handler(self) -> Callable[[Request], Coroutine[Any, Any, Response]]: return get_request_handler( @@ -465,6 +473,9 @@ class APIRouter(routing.Router): on_shutdown: Optional[Sequence[Callable[[], Any]]] = None, deprecated: Optional[bool] = None, include_in_schema: bool = True, + generate_unique_id_function: Callable[[APIRoute], str] = Default( + generate_unique_id + ), ) -> None: super().__init__( routes=routes, # type: ignore # in Starlette @@ -488,6 +499,7 @@ class APIRouter(routing.Router): self.dependency_overrides_provider = dependency_overrides_provider self.route_class = route_class self.default_response_class = default_response_class + self.generate_unique_id_function = generate_unique_id_function def add_api_route( self, @@ -519,6 +531,9 @@ class APIRouter(routing.Router): route_class_override: Optional[Type[APIRoute]] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Union[ + Callable[[APIRoute], str], DefaultPlaceholder + ] = Default(generate_unique_id), ) -> None: route_class = route_class_override or self.route_class responses = responses or {} @@ -535,6 +550,9 @@ class APIRouter(routing.Router): current_callbacks = self.callbacks.copy() if callbacks: current_callbacks.extend(callbacks) + current_generate_unique_id = get_value_or_default( + generate_unique_id_function, self.generate_unique_id_function + ) route = route_class( self.prefix + path, endpoint=endpoint, @@ -561,6 +579,7 @@ class APIRouter(routing.Router): dependency_overrides_provider=self.dependency_overrides_provider, callbacks=current_callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=current_generate_unique_id, ) self.routes.append(route) @@ -590,6 +609,9 @@ class APIRouter(routing.Router): name: Optional[str] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: def decorator(func: DecoratedCallable) -> DecoratedCallable: self.add_api_route( @@ -617,6 +639,7 @@ class APIRouter(routing.Router): name=name, callbacks=callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) return func @@ -654,6 +677,9 @@ class APIRouter(routing.Router): callbacks: Optional[List[BaseRoute]] = None, deprecated: Optional[bool] = None, include_in_schema: bool = True, + generate_unique_id_function: Callable[[APIRoute], str] = Default( + generate_unique_id + ), ) -> None: if prefix: assert prefix.startswith("/"), "A path prefix must start with '/'" @@ -694,6 +720,12 @@ class APIRouter(routing.Router): current_callbacks.extend(callbacks) if route.callbacks: current_callbacks.extend(route.callbacks) + current_generate_unique_id = get_value_or_default( + route.generate_unique_id_function, + router.generate_unique_id_function, + generate_unique_id_function, + self.generate_unique_id_function, + ) self.add_api_route( prefix + route.path, route.endpoint, @@ -722,6 +754,7 @@ class APIRouter(routing.Router): route_class_override=type(route), callbacks=current_callbacks, openapi_extra=route.openapi_extra, + generate_unique_id_function=current_generate_unique_id, ) elif isinstance(route, routing.Route): methods = list(route.methods or []) # type: ignore # in Starlette @@ -770,6 +803,9 @@ class APIRouter(routing.Router): name: Optional[str] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: return self.api_route( path=path, @@ -795,6 +831,7 @@ class APIRouter(routing.Router): name=name, callbacks=callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) def put( @@ -822,6 +859,9 @@ class APIRouter(routing.Router): name: Optional[str] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: return self.api_route( path=path, @@ -847,6 +887,7 @@ class APIRouter(routing.Router): name=name, callbacks=callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) def post( @@ -874,6 +915,9 @@ class APIRouter(routing.Router): name: Optional[str] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: return self.api_route( path=path, @@ -899,6 +943,7 @@ class APIRouter(routing.Router): name=name, callbacks=callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) def delete( @@ -926,6 +971,9 @@ class APIRouter(routing.Router): name: Optional[str] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: return self.api_route( path=path, @@ -951,6 +999,7 @@ class APIRouter(routing.Router): name=name, callbacks=callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) def options( @@ -978,6 +1027,9 @@ class APIRouter(routing.Router): name: Optional[str] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: return self.api_route( path=path, @@ -1003,6 +1055,7 @@ class APIRouter(routing.Router): name=name, callbacks=callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) def head( @@ -1030,6 +1083,9 @@ class APIRouter(routing.Router): name: Optional[str] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: return self.api_route( path=path, @@ -1055,6 +1111,7 @@ class APIRouter(routing.Router): name=name, callbacks=callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) def patch( @@ -1082,6 +1139,9 @@ class APIRouter(routing.Router): name: Optional[str] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: return self.api_route( path=path, @@ -1107,6 +1167,7 @@ class APIRouter(routing.Router): name=name, callbacks=callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) def trace( @@ -1134,6 +1195,9 @@ class APIRouter(routing.Router): name: Optional[str] = None, callbacks: Optional[List[BaseRoute]] = None, openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[APIRoute], str] = Default( + generate_unique_id + ), ) -> Callable[[DecoratedCallable], DecoratedCallable]: return self.api_route( @@ -1160,4 +1224,5 @@ class APIRouter(routing.Router): name=name, callbacks=callbacks, openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, ) diff --git a/fastapi/utils.py b/fastapi/utils.py index 8913d85b2..b9301499a 100644 --- a/fastapi/utils.py +++ b/fastapi/utils.py @@ -1,8 +1,9 @@ import functools import re +import warnings from dataclasses import is_dataclass from enum import Enum -from typing import Any, Dict, Optional, Set, Type, Union, cast +from typing import TYPE_CHECKING, Any, Dict, Optional, Set, Type, Union, cast import fastapi from fastapi.datastructures import DefaultPlaceholder, DefaultType @@ -13,6 +14,9 @@ from pydantic.fields import FieldInfo, ModelField, UndefinedType from pydantic.schema import model_process_schema from pydantic.utils import lenient_issubclass +if TYPE_CHECKING: # pragma: nocover + from .routing import APIRoute + def get_model_definitions( *, @@ -119,13 +123,29 @@ def create_cloned_field( return new_field -def generate_operation_id_for_path(*, name: str, path: str, method: str) -> str: +def generate_operation_id_for_path( + *, name: str, path: str, method: str +) -> str: # pragma: nocover + warnings.warn( + "fastapi.utils.generate_operation_id_for_path() was deprecated, " + "it is not used internally, and will be removed soon", + DeprecationWarning, + stacklevel=2, + ) operation_id = name + path operation_id = re.sub("[^0-9a-zA-Z_]", "_", operation_id) operation_id = operation_id + "_" + method.lower() return operation_id +def generate_unique_id(route: "APIRoute") -> str: + operation_id = route.name + route.path_format + operation_id = re.sub("[^0-9a-zA-Z_]", "_", operation_id) + assert route.methods + operation_id = operation_id + "_" + list(route.methods)[0].lower() + return operation_id + + def deep_dict_update(main_dict: Dict[Any, Any], update_dict: Dict[Any, Any]) -> None: for key in update_dict: if ( diff --git a/tests/test_generate_unique_id_function.py b/tests/test_generate_unique_id_function.py new file mode 100644 index 000000000..ffc0e3844 --- /dev/null +++ b/tests/test_generate_unique_id_function.py @@ -0,0 +1,1617 @@ +import warnings +from typing import List + +from fastapi import APIRouter, FastAPI +from fastapi.routing import APIRoute +from fastapi.testclient import TestClient +from pydantic import BaseModel + + +def custom_generate_unique_id(route: APIRoute): + return f"foo_{route.name}" + + +def custom_generate_unique_id2(route: APIRoute): + return f"bar_{route.name}" + + +def custom_generate_unique_id3(route: APIRoute): + return f"baz_{route.name}" + + +class Item(BaseModel): + name: str + price: float + + +class Message(BaseModel): + title: str + description: str + + +def test_top_level_generate_unique_id(): + app = FastAPI(generate_unique_id_function=custom_generate_unique_id) + router = APIRouter() + + @app.post("/", response_model=List[Item], responses={404: {"model": List[Message]}}) + def post_root(item1: Item, item2: Item): + return item1, item2 # pragma: nocover + + @router.post( + "/router", response_model=List[Item], responses={404: {"model": List[Message]}} + ) + def post_router(item1: Item, item2: Item): + return item1, item2 # pragma: nocover + + app.include_router(router) + client = TestClient(app) + response = client.get("/openapi.json") + data = response.json() + assert data == { + "openapi": "3.0.2", + "info": {"title": "FastAPI", "version": "0.1.0"}, + "paths": { + "/": { + "post": { + "summary": "Post Root", + "operationId": "foo_post_root", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_foo_post_root" + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Foo Post Root", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + } + } + }, + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "title": "Response 404 Foo Post Root", + "type": "array", + "items": { + "$ref": "#/components/schemas/Message" + }, + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/router": { + "post": { + "summary": "Post Router", + "operationId": "foo_post_router", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_foo_post_router" + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Foo Post Router", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + } + } + }, + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "title": "Response 404 Foo Post Router", + "type": "array", + "items": { + "$ref": "#/components/schemas/Message" + }, + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + }, + "components": { + "schemas": { + "Body_foo_post_root": { + "title": "Body_foo_post_root", + "required": ["item1", "item2"], + "type": "object", + "properties": { + "item1": {"$ref": "#/components/schemas/Item"}, + "item2": {"$ref": "#/components/schemas/Item"}, + }, + }, + "Body_foo_post_router": { + "title": "Body_foo_post_router", + "required": ["item1", "item2"], + "type": "object", + "properties": { + "item1": {"$ref": "#/components/schemas/Item"}, + "item2": {"$ref": "#/components/schemas/Item"}, + }, + }, + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": {"$ref": "#/components/schemas/ValidationError"}, + } + }, + }, + "Item": { + "title": "Item", + "required": ["name", "price"], + "type": "object", + "properties": { + "name": {"title": "Name", "type": "string"}, + "price": {"title": "Price", "type": "number"}, + }, + }, + "Message": { + "title": "Message", + "required": ["title", "description"], + "type": "object", + "properties": { + "title": {"title": "Title", "type": "string"}, + "description": {"title": "Description", "type": "string"}, + }, + }, + "ValidationError": { + "title": "ValidationError", + "required": ["loc", "msg", "type"], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": {"type": "string"}, + }, + "msg": {"title": "Message", "type": "string"}, + "type": {"title": "Error Type", "type": "string"}, + }, + }, + } + }, + } + + +def test_router_overrides_generate_unique_id(): + app = FastAPI(generate_unique_id_function=custom_generate_unique_id) + router = APIRouter(generate_unique_id_function=custom_generate_unique_id2) + + @app.post("/", response_model=List[Item], responses={404: {"model": List[Message]}}) + def post_root(item1: Item, item2: Item): + return item1, item2 # pragma: nocover + + @router.post( + "/router", response_model=List[Item], responses={404: {"model": List[Message]}} + ) + def post_router(item1: Item, item2: Item): + return item1, item2 # pragma: nocover + + app.include_router(router) + client = TestClient(app) + response = client.get("/openapi.json") + data = response.json() + assert data == { + "openapi": "3.0.2", + "info": {"title": "FastAPI", "version": "0.1.0"}, + "paths": { + "/": { + "post": { + "summary": "Post Root", + "operationId": "foo_post_root", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_foo_post_root" + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Foo Post Root", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + } + } + }, + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "title": "Response 404 Foo Post Root", + "type": "array", + "items": { + "$ref": "#/components/schemas/Message" + }, + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/router": { + "post": { + "summary": "Post Router", + "operationId": "bar_post_router", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_bar_post_router" + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Bar Post Router", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + } + } + }, + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "title": "Response 404 Bar Post Router", + "type": "array", + "items": { + "$ref": "#/components/schemas/Message" + }, + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + }, + "components": { + "schemas": { + "Body_bar_post_router": { + "title": "Body_bar_post_router", + "required": ["item1", "item2"], + "type": "object", + "properties": { + "item1": {"$ref": "#/components/schemas/Item"}, + "item2": {"$ref": "#/components/schemas/Item"}, + }, + }, + "Body_foo_post_root": { + "title": "Body_foo_post_root", + "required": ["item1", "item2"], + "type": "object", + "properties": { + "item1": {"$ref": "#/components/schemas/Item"}, + "item2": {"$ref": "#/components/schemas/Item"}, + }, + }, + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": {"$ref": "#/components/schemas/ValidationError"}, + } + }, + }, + "Item": { + "title": "Item", + "required": ["name", "price"], + "type": "object", + "properties": { + "name": {"title": "Name", "type": "string"}, + "price": {"title": "Price", "type": "number"}, + }, + }, + "Message": { + "title": "Message", + "required": ["title", "description"], + "type": "object", + "properties": { + "title": {"title": "Title", "type": "string"}, + "description": {"title": "Description", "type": "string"}, + }, + }, + "ValidationError": { + "title": "ValidationError", + "required": ["loc", "msg", "type"], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": {"type": "string"}, + }, + "msg": {"title": "Message", "type": "string"}, + "type": {"title": "Error Type", "type": "string"}, + }, + }, + } + }, + } + + +def test_router_include_overrides_generate_unique_id(): + app = FastAPI(generate_unique_id_function=custom_generate_unique_id) + router = APIRouter(generate_unique_id_function=custom_generate_unique_id2) + + @app.post("/", response_model=List[Item], responses={404: {"model": List[Message]}}) + def post_root(item1: Item, item2: Item): + return item1, item2 # pragma: nocover + + @router.post( + "/router", response_model=List[Item], responses={404: {"model": List[Message]}} + ) + def post_router(item1: Item, item2: Item): + return item1, item2 # pragma: nocover + + app.include_router(router, generate_unique_id_function=custom_generate_unique_id3) + client = TestClient(app) + response = client.get("/openapi.json") + data = response.json() + assert data == { + "openapi": "3.0.2", + "info": {"title": "FastAPI", "version": "0.1.0"}, + "paths": { + "/": { + "post": { + "summary": "Post Root", + "operationId": "foo_post_root", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_foo_post_root" + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Foo Post Root", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + } + } + }, + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "title": "Response 404 Foo Post Root", + "type": "array", + "items": { + "$ref": "#/components/schemas/Message" + }, + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/router": { + "post": { + "summary": "Post Router", + "operationId": "bar_post_router", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_bar_post_router" + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Bar Post Router", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + } + } + }, + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "title": "Response 404 Bar Post Router", + "type": "array", + "items": { + "$ref": "#/components/schemas/Message" + }, + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + }, + "components": { + "schemas": { + "Body_bar_post_router": { + "title": "Body_bar_post_router", + "required": ["item1", "item2"], + "type": "object", + "properties": { + "item1": {"$ref": "#/components/schemas/Item"}, + "item2": {"$ref": "#/components/schemas/Item"}, + }, + }, + "Body_foo_post_root": { + "title": "Body_foo_post_root", + "required": ["item1", "item2"], + "type": "object", + "properties": { + "item1": {"$ref": "#/components/schemas/Item"}, + "item2": {"$ref": "#/components/schemas/Item"}, + }, + }, + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": {"$ref": "#/components/schemas/ValidationError"}, + } + }, + }, + "Item": { + "title": "Item", + "required": ["name", "price"], + "type": "object", + "properties": { + "name": {"title": "Name", "type": "string"}, + "price": {"title": "Price", "type": "number"}, + }, + }, + "Message": { + "title": "Message", + "required": ["title", "description"], + "type": "object", + "properties": { + "title": {"title": "Title", "type": "string"}, + "description": {"title": "Description", "type": "string"}, + }, + }, + "ValidationError": { + "title": "ValidationError", + "required": ["loc", "msg", "type"], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": {"type": "string"}, + }, + "msg": {"title": "Message", "type": "string"}, + "type": {"title": "Error Type", "type": "string"}, + }, + }, + } + }, + } + + +def test_subrouter_top_level_include_overrides_generate_unique_id(): + app = FastAPI(generate_unique_id_function=custom_generate_unique_id) + router = APIRouter() + sub_router = APIRouter(generate_unique_id_function=custom_generate_unique_id2) + + @app.post("/", response_model=List[Item], responses={404: {"model": List[Message]}}) + def post_root(item1: Item, item2: Item): + return item1, item2 # pragma: nocover + + @router.post( + "/router", response_model=List[Item], responses={404: {"model": List[Message]}} + ) + def post_router(item1: Item, item2: Item): + return item1, item2 # pragma: nocover + + @sub_router.post( + "/subrouter", + response_model=List[Item], + responses={404: {"model": List[Message]}}, + ) + def post_subrouter(item1: Item, item2: Item): + return item1, item2 # pragma: nocover + + router.include_router(sub_router) + app.include_router(router, generate_unique_id_function=custom_generate_unique_id3) + client = TestClient(app) + response = client.get("/openapi.json") + data = response.json() + assert data == { + "openapi": "3.0.2", + "info": {"title": "FastAPI", "version": "0.1.0"}, + "paths": { + "/": { + "post": { + "summary": "Post Root", + "operationId": "foo_post_root", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_foo_post_root" + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Foo Post Root", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + } + } + }, + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "title": "Response 404 Foo Post Root", + "type": "array", + "items": { + "$ref": "#/components/schemas/Message" + }, + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/router": { + "post": { + "summary": "Post Router", + "operationId": "baz_post_router", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_baz_post_router" + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Baz Post Router", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + } + } + }, + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "title": "Response 404 Baz Post Router", + "type": "array", + "items": { + "$ref": "#/components/schemas/Message" + }, + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/subrouter": { + "post": { + "summary": "Post Subrouter", + "operationId": "bar_post_subrouter", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_bar_post_subrouter" + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Bar Post Subrouter", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + } + } + }, + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "title": "Response 404 Bar Post Subrouter", + "type": "array", + "items": { + "$ref": "#/components/schemas/Message" + }, + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + }, + "components": { + "schemas": { + "Body_bar_post_subrouter": { + "title": "Body_bar_post_subrouter", + "required": ["item1", "item2"], + "type": "object", + "properties": { + "item1": {"$ref": "#/components/schemas/Item"}, + "item2": {"$ref": "#/components/schemas/Item"}, + }, + }, + "Body_baz_post_router": { + "title": "Body_baz_post_router", + "required": ["item1", "item2"], + "type": "object", + "properties": { + "item1": {"$ref": "#/components/schemas/Item"}, + "item2": {"$ref": "#/components/schemas/Item"}, + }, + }, + "Body_foo_post_root": { + "title": "Body_foo_post_root", + "required": ["item1", "item2"], + "type": "object", + "properties": { + "item1": {"$ref": "#/components/schemas/Item"}, + "item2": {"$ref": "#/components/schemas/Item"}, + }, + }, + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": {"$ref": "#/components/schemas/ValidationError"}, + } + }, + }, + "Item": { + "title": "Item", + "required": ["name", "price"], + "type": "object", + "properties": { + "name": {"title": "Name", "type": "string"}, + "price": {"title": "Price", "type": "number"}, + }, + }, + "Message": { + "title": "Message", + "required": ["title", "description"], + "type": "object", + "properties": { + "title": {"title": "Title", "type": "string"}, + "description": {"title": "Description", "type": "string"}, + }, + }, + "ValidationError": { + "title": "ValidationError", + "required": ["loc", "msg", "type"], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": {"type": "string"}, + }, + "msg": {"title": "Message", "type": "string"}, + "type": {"title": "Error Type", "type": "string"}, + }, + }, + } + }, + } + + +def test_router_path_operation_overrides_generate_unique_id(): + app = FastAPI(generate_unique_id_function=custom_generate_unique_id) + router = APIRouter(generate_unique_id_function=custom_generate_unique_id2) + + @app.post("/", response_model=List[Item], responses={404: {"model": List[Message]}}) + def post_root(item1: Item, item2: Item): + return item1, item2 # pragma: nocover + + @router.post( + "/router", + response_model=List[Item], + responses={404: {"model": List[Message]}}, + generate_unique_id_function=custom_generate_unique_id3, + ) + def post_router(item1: Item, item2: Item): + return item1, item2 # pragma: nocover + + app.include_router(router) + client = TestClient(app) + response = client.get("/openapi.json") + data = response.json() + assert data == { + "openapi": "3.0.2", + "info": {"title": "FastAPI", "version": "0.1.0"}, + "paths": { + "/": { + "post": { + "summary": "Post Root", + "operationId": "foo_post_root", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_foo_post_root" + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Foo Post Root", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + } + } + }, + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "title": "Response 404 Foo Post Root", + "type": "array", + "items": { + "$ref": "#/components/schemas/Message" + }, + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/router": { + "post": { + "summary": "Post Router", + "operationId": "baz_post_router", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_baz_post_router" + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Baz Post Router", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + } + } + }, + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "title": "Response 404 Baz Post Router", + "type": "array", + "items": { + "$ref": "#/components/schemas/Message" + }, + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + }, + "components": { + "schemas": { + "Body_baz_post_router": { + "title": "Body_baz_post_router", + "required": ["item1", "item2"], + "type": "object", + "properties": { + "item1": {"$ref": "#/components/schemas/Item"}, + "item2": {"$ref": "#/components/schemas/Item"}, + }, + }, + "Body_foo_post_root": { + "title": "Body_foo_post_root", + "required": ["item1", "item2"], + "type": "object", + "properties": { + "item1": {"$ref": "#/components/schemas/Item"}, + "item2": {"$ref": "#/components/schemas/Item"}, + }, + }, + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": {"$ref": "#/components/schemas/ValidationError"}, + } + }, + }, + "Item": { + "title": "Item", + "required": ["name", "price"], + "type": "object", + "properties": { + "name": {"title": "Name", "type": "string"}, + "price": {"title": "Price", "type": "number"}, + }, + }, + "Message": { + "title": "Message", + "required": ["title", "description"], + "type": "object", + "properties": { + "title": {"title": "Title", "type": "string"}, + "description": {"title": "Description", "type": "string"}, + }, + }, + "ValidationError": { + "title": "ValidationError", + "required": ["loc", "msg", "type"], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": {"type": "string"}, + }, + "msg": {"title": "Message", "type": "string"}, + "type": {"title": "Error Type", "type": "string"}, + }, + }, + } + }, + } + + +def test_app_path_operation_overrides_generate_unique_id(): + app = FastAPI(generate_unique_id_function=custom_generate_unique_id) + router = APIRouter(generate_unique_id_function=custom_generate_unique_id2) + + @app.post( + "/", + response_model=List[Item], + responses={404: {"model": List[Message]}}, + generate_unique_id_function=custom_generate_unique_id3, + ) + def post_root(item1: Item, item2: Item): + return item1, item2 # pragma: nocover + + @router.post( + "/router", + response_model=List[Item], + responses={404: {"model": List[Message]}}, + ) + def post_router(item1: Item, item2: Item): + return item1, item2 # pragma: nocover + + app.include_router(router) + client = TestClient(app) + response = client.get("/openapi.json") + data = response.json() + assert data == { + "openapi": "3.0.2", + "info": {"title": "FastAPI", "version": "0.1.0"}, + "paths": { + "/": { + "post": { + "summary": "Post Root", + "operationId": "baz_post_root", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_baz_post_root" + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Baz Post Root", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + } + } + }, + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "title": "Response 404 Baz Post Root", + "type": "array", + "items": { + "$ref": "#/components/schemas/Message" + }, + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/router": { + "post": { + "summary": "Post Router", + "operationId": "bar_post_router", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_bar_post_router" + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Bar Post Router", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + } + } + }, + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "title": "Response 404 Bar Post Router", + "type": "array", + "items": { + "$ref": "#/components/schemas/Message" + }, + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + }, + "components": { + "schemas": { + "Body_bar_post_router": { + "title": "Body_bar_post_router", + "required": ["item1", "item2"], + "type": "object", + "properties": { + "item1": {"$ref": "#/components/schemas/Item"}, + "item2": {"$ref": "#/components/schemas/Item"}, + }, + }, + "Body_baz_post_root": { + "title": "Body_baz_post_root", + "required": ["item1", "item2"], + "type": "object", + "properties": { + "item1": {"$ref": "#/components/schemas/Item"}, + "item2": {"$ref": "#/components/schemas/Item"}, + }, + }, + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": {"$ref": "#/components/schemas/ValidationError"}, + } + }, + }, + "Item": { + "title": "Item", + "required": ["name", "price"], + "type": "object", + "properties": { + "name": {"title": "Name", "type": "string"}, + "price": {"title": "Price", "type": "number"}, + }, + }, + "Message": { + "title": "Message", + "required": ["title", "description"], + "type": "object", + "properties": { + "title": {"title": "Title", "type": "string"}, + "description": {"title": "Description", "type": "string"}, + }, + }, + "ValidationError": { + "title": "ValidationError", + "required": ["loc", "msg", "type"], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": {"type": "string"}, + }, + "msg": {"title": "Message", "type": "string"}, + "type": {"title": "Error Type", "type": "string"}, + }, + }, + } + }, + } + + +def test_callback_override_generate_unique_id(): + app = FastAPI(generate_unique_id_function=custom_generate_unique_id) + callback_router = APIRouter(generate_unique_id_function=custom_generate_unique_id2) + + @callback_router.post( + "/post-callback", + response_model=List[Item], + responses={404: {"model": List[Message]}}, + generate_unique_id_function=custom_generate_unique_id3, + ) + def post_callback(item1: Item, item2: Item): + return item1, item2 # pragma: nocover + + @app.post( + "/", + response_model=List[Item], + responses={404: {"model": List[Message]}}, + generate_unique_id_function=custom_generate_unique_id3, + callbacks=callback_router.routes, + ) + def post_root(item1: Item, item2: Item): + return item1, item2 # pragma: nocover + + @app.post( + "/tocallback", + response_model=List[Item], + responses={404: {"model": List[Message]}}, + ) + def post_with_callback(item1: Item, item2: Item): + return item1, item2 # pragma: nocover + + client = TestClient(app) + response = client.get("/openapi.json") + data = response.json() + assert data == { + "openapi": "3.0.2", + "info": {"title": "FastAPI", "version": "0.1.0"}, + "paths": { + "/": { + "post": { + "summary": "Post Root", + "operationId": "baz_post_root", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_baz_post_root" + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Baz Post Root", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + } + } + }, + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "title": "Response 404 Baz Post Root", + "type": "array", + "items": { + "$ref": "#/components/schemas/Message" + }, + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "callbacks": { + "post_callback": { + "/post-callback": { + "post": { + "summary": "Post Callback", + "operationId": "baz_post_callback", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_baz_post_callback" + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Baz Post Callback", + "type": "array", + "items": { + "$ref": "#/components/schemas/Item" + }, + } + } + }, + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "title": "Response 404 Baz Post Callback", + "type": "array", + "items": { + "$ref": "#/components/schemas/Message" + }, + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + } + } + }, + } + }, + "/tocallback": { + "post": { + "summary": "Post With Callback", + "operationId": "foo_post_with_callback", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_foo_post_with_callback" + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Foo Post With Callback", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + } + } + }, + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "title": "Response 404 Foo Post With Callback", + "type": "array", + "items": { + "$ref": "#/components/schemas/Message" + }, + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + }, + "components": { + "schemas": { + "Body_baz_post_callback": { + "title": "Body_baz_post_callback", + "required": ["item1", "item2"], + "type": "object", + "properties": { + "item1": {"$ref": "#/components/schemas/Item"}, + "item2": {"$ref": "#/components/schemas/Item"}, + }, + }, + "Body_baz_post_root": { + "title": "Body_baz_post_root", + "required": ["item1", "item2"], + "type": "object", + "properties": { + "item1": {"$ref": "#/components/schemas/Item"}, + "item2": {"$ref": "#/components/schemas/Item"}, + }, + }, + "Body_foo_post_with_callback": { + "title": "Body_foo_post_with_callback", + "required": ["item1", "item2"], + "type": "object", + "properties": { + "item1": {"$ref": "#/components/schemas/Item"}, + "item2": {"$ref": "#/components/schemas/Item"}, + }, + }, + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": {"$ref": "#/components/schemas/ValidationError"}, + } + }, + }, + "Item": { + "title": "Item", + "required": ["name", "price"], + "type": "object", + "properties": { + "name": {"title": "Name", "type": "string"}, + "price": {"title": "Price", "type": "number"}, + }, + }, + "Message": { + "title": "Message", + "required": ["title", "description"], + "type": "object", + "properties": { + "title": {"title": "Title", "type": "string"}, + "description": {"title": "Description", "type": "string"}, + }, + }, + "ValidationError": { + "title": "ValidationError", + "required": ["loc", "msg", "type"], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": {"type": "string"}, + }, + "msg": {"title": "Message", "type": "string"}, + "type": {"title": "Error Type", "type": "string"}, + }, + }, + } + }, + } + + +def test_warn_duplicate_operation_id(): + def broken_operation_id(route: APIRoute): + return "foo" + + app = FastAPI(generate_unique_id_function=broken_operation_id) + + @app.post("/") + def post_root(item1: Item): + return item1 # pragma: nocover + + @app.post("/second") + def post_second(item1: Item): + return item1 # pragma: nocover + + @app.post("/third") + def post_third(item1: Item): + return item1 # pragma: nocover + + client = TestClient(app) + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + client.get("/openapi.json") + assert len(w) == 2 + assert issubclass(w[-1].category, UserWarning) + assert "Duplicate Operation ID" in str(w[-1].message) diff --git a/tests/test_include_router_defaults_overrides.py b/tests/test_include_router_defaults_overrides.py index c46cb6701..5dd7e7098 100644 --- a/tests/test_include_router_defaults_overrides.py +++ b/tests/test_include_router_defaults_overrides.py @@ -1,3 +1,5 @@ +import warnings + import pytest from fastapi import APIRouter, Depends, FastAPI, Response from fastapi.responses import JSONResponse @@ -343,7 +345,11 @@ client = TestClient(app) def test_openapi(): client = TestClient(app) - response = client.get("/openapi.json") + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + response = client.get("/openapi.json") + assert issubclass(w[-1].category, UserWarning) + assert "Duplicate Operation ID" in str(w[-1].message) assert response.json() == openapi_schema diff --git a/tests/test_tutorial/test_generate_clients/__init__.py b/tests/test_tutorial/test_generate_clients/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_tutorial/test_generate_clients/test_tutorial003.py b/tests/test_tutorial/test_generate_clients/test_tutorial003.py new file mode 100644 index 000000000..d79123163 --- /dev/null +++ b/tests/test_tutorial/test_generate_clients/test_tutorial003.py @@ -0,0 +1,188 @@ +from fastapi.testclient import TestClient + +from docs_src.generate_clients.tutorial003 import app + +client = TestClient(app) + +openapi_schema = { + "openapi": "3.0.2", + "info": {"title": "FastAPI", "version": "0.1.0"}, + "paths": { + "/items/": { + "get": { + "tags": ["items"], + "summary": "Get Items", + "operationId": "items-get_items", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Items-Get Items", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + } + } + }, + } + }, + }, + "post": { + "tags": ["items"], + "summary": "Create Item", + "operationId": "items-create_item", + "requestBody": { + "content": { + "application/json": { + "schema": {"$ref": "#/components/schemas/Item"} + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResponseMessage" + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + }, + }, + "/users/": { + "post": { + "tags": ["users"], + "summary": "Create User", + "operationId": "users-create_user", + "requestBody": { + "content": { + "application/json": { + "schema": {"$ref": "#/components/schemas/User"} + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResponseMessage" + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + }, + "components": { + "schemas": { + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": {"$ref": "#/components/schemas/ValidationError"}, + } + }, + }, + "Item": { + "title": "Item", + "required": ["name", "price"], + "type": "object", + "properties": { + "name": {"title": "Name", "type": "string"}, + "price": {"title": "Price", "type": "number"}, + }, + }, + "ResponseMessage": { + "title": "ResponseMessage", + "required": ["message"], + "type": "object", + "properties": {"message": {"title": "Message", "type": "string"}}, + }, + "User": { + "title": "User", + "required": ["username", "email"], + "type": "object", + "properties": { + "username": {"title": "Username", "type": "string"}, + "email": {"title": "Email", "type": "string"}, + }, + }, + "ValidationError": { + "title": "ValidationError", + "required": ["loc", "msg", "type"], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": {"type": "string"}, + }, + "msg": {"title": "Message", "type": "string"}, + "type": {"title": "Error Type", "type": "string"}, + }, + }, + } + }, +} + + +def test_openapi(): + with client: + response = client.get("/openapi.json") + + assert response.json() == openapi_schema + + +def test_post_items(): + response = client.post("/items/", json={"name": "Foo", "price": 5}) + assert response.status_code == 200, response.text + assert response.json() == {"message": "Item received"} + + +def test_post_users(): + response = client.post( + "/users/", json={"username": "Foo", "email": "foo@example.com"} + ) + assert response.status_code == 200, response.text + assert response.json() == {"message": "User received"} + + +def test_get_items(): + response = client.get("/items/") + assert response.status_code == 200, response.text + assert response.json() == [ + {"name": "Plumbus", "price": 3}, + {"name": "Portal Gun", "price": 9001}, + ] From 786b5858e5b18ebb9722d0fc48c5ba39bb0c0d33 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 4 Mar 2022 22:02:55 +0000 Subject: [PATCH 05/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index c5ca7376d..266578c97 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* ✨ Add support for custom `generate_unique_id_function` and docs for generating clients. PR [#4650](https://github.com/tiangolo/fastapi/pull/4650) by [@tiangolo](https://github.com/tiangolo). ## 0.74.1 From 586d17bfb592a904bceab0647cfdacaea51b7e1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Fri, 4 Mar 2022 23:08:06 +0100 Subject: [PATCH 06/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 266578c97..a28b255f5 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,7 +2,8 @@ ## Latest Changes -* ✨ Add support for custom `generate_unique_id_function` and docs for generating clients. PR [#4650](https://github.com/tiangolo/fastapi/pull/4650) by [@tiangolo](https://github.com/tiangolo). + +* ✨ Add support for custom `generate_unique_id_function` and docs for generating clients. New docs: [Advanced - Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/). PR [#4650](https://github.com/tiangolo/fastapi/pull/4650) by [@tiangolo](https://github.com/tiangolo). ## 0.74.1 From 19769d04836f8144aa7af32d6d0af356aaa92093 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Fri, 4 Mar 2022 23:09:11 +0100 Subject: [PATCH 07/59] =?UTF-8?q?=F0=9F=94=96=20Release=20version=200.75.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 2 ++ fastapi/__init__.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index a28b255f5..a34c87567 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -3,6 +3,8 @@ ## Latest Changes +## 0.75.0 + * ✨ Add support for custom `generate_unique_id_function` and docs for generating clients. New docs: [Advanced - Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/). PR [#4650](https://github.com/tiangolo/fastapi/pull/4650) by [@tiangolo](https://github.com/tiangolo). ## 0.74.1 diff --git a/fastapi/__init__.py b/fastapi/__init__.py index dc265558a..4bce5f017 100644 --- a/fastapi/__init__.py +++ b/fastapi/__init__.py @@ -1,6 +1,6 @@ """FastAPI framework, high performance, easy to learn, fast to code, ready for production""" -__version__ = "0.74.1" +__version__ = "0.75.0" from starlette import status as status From c89dc736bd576bc1a9e2bb893576b59c6b906b97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Fri, 4 Mar 2022 23:11:21 +0100 Subject: [PATCH 08/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index a34c87567..2feb9dfff 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -5,6 +5,8 @@ ## 0.75.0 +### Features + * ✨ Add support for custom `generate_unique_id_function` and docs for generating clients. New docs: [Advanced - Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/). PR [#4650](https://github.com/tiangolo/fastapi/pull/4650) by [@tiangolo](https://github.com/tiangolo). ## 0.74.1 From 9f38a05954f9d307c8f2a1a6e9f8ef2f938755cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 5 Mar 2022 10:49:15 -0800 Subject: [PATCH 09/59] =?UTF-8?q?=F0=9F=93=9D=20Add=20Jina's=20QA=20Bot=20?= =?UTF-8?q?to=20the=20docs=20to=20help=20people=20that=20want=20to=20ask?= =?UTF-8?q?=20quick=20questions=20(#4655)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: yanlong.wang --- docs/en/overrides/main.html | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index adc6f79fb..5255bfd9b 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -61,3 +61,35 @@ {% endblock %} +{%- block scripts %} +{{ super() }} + + + + + + + +{%- endblock %} From abd148f63a3a4fc9c110a8fe3da571ae8e37d57c Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 5 Mar 2022 18:49:46 +0000 Subject: [PATCH 10/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 2feb9dfff..68292286e 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 📝 Add Jina's QA Bot to the docs to help people that want to ask quick questions. PR [#4655](https://github.com/tiangolo/fastapi/pull/4655) by [@tiangolo](https://github.com/tiangolo). ## 0.75.0 From 87e29ec2c54ce3651939cc4d10e05d07a2f8b9ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 5 Mar 2022 19:52:18 +0100 Subject: [PATCH 11/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 68292286e..d8df7a622 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,7 +2,7 @@ ## Latest Changes -* 📝 Add Jina's QA Bot to the docs to help people that want to ask quick questions. PR [#4655](https://github.com/tiangolo/fastapi/pull/4655) by [@tiangolo](https://github.com/tiangolo). +* 📝 Add Jina's QA Bot to the docs to help people that want to ask quick questions. PR [#4655](https://github.com/tiangolo/fastapi/pull/4655) by [@tiangolo](https://github.com/tiangolo) based on original PR [#4626](https://github.com/tiangolo/fastapi/pull/4626) by [@hanxiao](https://github.com/hanxiao). ## 0.75.0 From 9aa698aa67b2507e289db30652e52f6ba163911c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 9 Mar 2022 21:29:40 -0500 Subject: [PATCH 12/59] =?UTF-8?q?=F0=9F=94=A7=20Add=20Classiq=20sponsor=20?= =?UTF-8?q?(#4671)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + docs/en/data/sponsors.yml | 3 +++ docs/en/docs/img/sponsors/classiq-banner.png | Bin 0 -> 5321 bytes docs/en/docs/img/sponsors/classiq.png | Bin 0 -> 6286 bytes docs/en/overrides/main.html | 6 ++++++ 5 files changed, 10 insertions(+) create mode 100644 docs/en/docs/img/sponsors/classiq-banner.png create mode 100644 docs/en/docs/img/sponsors/classiq.png diff --git a/README.md b/README.md index bec58aad1..5ed443ad1 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ The key features are: + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 4d63a7288..cc9201fbe 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -11,6 +11,9 @@ gold: - url: https://striveworks.us/careers?utm_source=fastapi&utm_medium=sponsor_banner&utm_campaign=feb_march#openings title: https://striveworks.us/careers img: https://fastapi.tiangolo.com/img/sponsors/striveworks.png + - url: https://www.classiq.io/careers + title: Join the team building a new SaaS platform that will change the computing world + img: https://fastapi.tiangolo.com/img/sponsors/classiq.png silver: - url: https://www.deta.sh/?ref=fastapi title: The launchpad for all your (team's) ideas diff --git a/docs/en/docs/img/sponsors/classiq-banner.png b/docs/en/docs/img/sponsors/classiq-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..8a0d6ac741907732efcd69b7a0e2a5b29e48aeec GIT binary patch literal 5321 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 V0r@Q>O`z!r($+9guTr%Q`yVU$Jsto6 literal 0 HcmV?d00001 diff --git a/docs/en/docs/img/sponsors/classiq.png b/docs/en/docs/img/sponsors/classiq.png new file mode 100644 index 0000000000000000000000000000000000000000..189c6bbe8a4ad558391ae4b54412c8c9ed09f65b GIT binary patch literal 6286 zcmcIp_cI(|x7Jtho!DTNh_Xr&y?3Gut9MpgEqYs`*C2ZDMDLv-dh~=KI;#W`WwFZ5 zcjx{AcjnIh;k0+o%z0+cob%2+Cq_#{i3pz_9}NwSNJUv*=b!!aPi$~;{^^e5-qC*s z&rKQPiH1f%@gG4)%g&|!_lWMPqa=$~H_dqXFTk>wc`Jj4)|fxZ1DZlC@lOV-mFEMX>RD$Saw#mw)9h~qEor!K&{T)W{14sTugD6%G;Ra(lt`` zutpOlHXTR#+80zGZq=v}1v1hc+S2JCzJ@+8R4mj6%OZkZk+)Y5zcvESkn6A_)EvV2 z>R@B_)PGuHQUWmtc3iBaF45xr8=dZ|SfsT}Ju!f|K(O>^2VAa{Cc~v zC^)rzLI3T~NAowBk(X{uBtTKSHrV4@4dgZp^004jw{gnXOzFg~A^J_d=TA$qQ~%?h zhJkCZ+v=~O*y*MIps^amzcE!*BY8`!>K%U=PWg6lXfsZ7`oU^6r{BaCC2g1@lYT=H z#qHfAhVC_i4;0Ohd2(5ku&!M~!PB*oYXTl`;(h%$fXkp79?#s8jQj}q(02~NOPxu6 z&A3Saz(rnAC1@6kdnyly7YMk7X8B(Y41z$G5p2a71#5ZP(RE$WhR(nH%nD1ccZm1; zWPap^flPr=^|@Cg7Zp!kU-jb9MD_Xl)*<{(b%yo~6z8y^f} z=W*>u<=D-$J>VmF(g$JrP3!6J7i|<)_>x87z!<%~qq}-rDcSTq*`W2a1iUra zw|{fKQ?3(;0LTd>P!Wb4n-1wntafYqcn&4a2teG*zB`wjNet-4?u<5nL(fh#7S<7{ zPr5kS_L|W}=v}(L^Xec9yuaaBa`@F{YpkZ#pDam8-lmhX!jkgFQJMsJKT%_JUJ>SX z0xjq)JoHjamWa*YF`f9bKOURTMf(B|3}gH#1fe32x$^V8?y_ts$K`SSwGwW3Tt0M) zjMna*Y9B$qSaXv6^Qkq;_`3=94#+Ocf=zF6Tl#kOb5qb=(y_qVNonpzR zb^sL7fkMsFc^;Qlm+IGUe|l?6h5S8ao5_=?t}rfTYE0?KKXAjTlNb2X1GYi=m9Xv# ziycnn6qk)}BcucffE%{iB#)g3clQ8Ea4O%4efh&5ZY6p3mEXXJ^{P^Cp*>t7`8cTQ zgHx@odNw_*S{RXRyIn@-tn>x!WDsR|f6sK$@{Fc`BRujNjFb}m0j+2bY5Dnk*#q=l zmeEmw(r>kWU|bDS zbgv03qinbf$sG2IC+}!_!(ViI9CGMq3GB^o5eD|9dWU?MJbxj2B*uwVlL>YkGXcA% z3BldXeVy&`WX4dFCtTgGC(IXT%}SXSh*R)t&2Cx39xZ?MRU3}3(`>y*A{FS8{1|Pb z&y7-Q#;wli5vsC*48AGL3R<;WaCVUpqNVHhxVkzro!SkM5qcjEvHr$k2rMKnDNY?jBYYvz%6#35|CCszM`jNqNuaaA`e=McI07eSYwsF^x z7qhM$chfc8H{x!6U?CdAS7c{xQg-n}*F5HWJf_JOl{-3pX+$0DaRKy)#tv@2Rkc&4 z$WDD0MrT24$;Rde>4=j;m(0-I61G{A#Sruzsq3}%EW~pj(Oh_jv7J@@3{f

#8&X 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 Rf9C@<6$K6XI$4Xb{{s5EMvMRe literal 0 HcmV?d00001 diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index 5255bfd9b..1c09405e5 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -58,6 +58,12 @@ +

{% endblock %} From fab2a765de051380e94db4dd5748c6ec96759853 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 10 Mar 2022 02:30:13 +0000 Subject: [PATCH 13/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index d8df7a622..136c708c1 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 🔧 Add Classiq sponsor. PR [#4671](https://github.com/tiangolo/fastapi/pull/4671) by [@tiangolo](https://github.com/tiangolo). * 📝 Add Jina's QA Bot to the docs to help people that want to ask quick questions. PR [#4655](https://github.com/tiangolo/fastapi/pull/4655) by [@tiangolo](https://github.com/tiangolo) based on original PR [#4626](https://github.com/tiangolo/fastapi/pull/4626) by [@hanxiao](https://github.com/hanxiao). ## 0.75.0 From cf8b40e660ad60f7febec7ea4fc7e1a79493ecb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Tue, 15 Mar 2022 10:47:36 -0500 Subject: [PATCH 14/59] =?UTF-8?q?=F0=9F=94=A7=20Update=20Classiq=20sponsor?= =?UTF-8?q?=20links=20(#4688)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- docs/en/data/sponsors.yml | 2 +- docs/en/overrides/main.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5ed443ad1..0fb25cc7e 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ The key features are: - + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index cc9201fbe..65a114584 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -11,7 +11,7 @@ gold: - url: https://striveworks.us/careers?utm_source=fastapi&utm_medium=sponsor_banner&utm_campaign=feb_march#openings title: https://striveworks.us/careers img: https://fastapi.tiangolo.com/img/sponsors/striveworks.png - - url: https://www.classiq.io/careers + - url: https://classiq.link/n4s title: Join the team building a new SaaS platform that will change the computing world img: https://fastapi.tiangolo.com/img/sponsors/classiq.png silver: diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index 1c09405e5..83c26e72a 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -59,7 +59,7 @@
- + From 6125dc72cdf245573b3eb2cba66ed8d1e52ba2cd Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 15 Mar 2022 15:48:22 +0000 Subject: [PATCH 15/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 136c708c1..b7ccd67f6 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 🔧 Update Classiq sponsor links. PR [#4688](https://github.com/tiangolo/fastapi/pull/4688) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add Classiq sponsor. PR [#4671](https://github.com/tiangolo/fastapi/pull/4671) by [@tiangolo](https://github.com/tiangolo). * 📝 Add Jina's QA Bot to the docs to help people that want to ask quick questions. PR [#4655](https://github.com/tiangolo/fastapi/pull/4655) by [@tiangolo](https://github.com/tiangolo) based on original PR [#4626](https://github.com/tiangolo/fastapi/pull/4626) by [@hanxiao](https://github.com/hanxiao). From d3eb78709030650f24f5e31730f47591d6cef4cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 17 Mar 2022 13:36:21 -0500 Subject: [PATCH 16/59] =?UTF-8?q?=F0=9F=90=9B=20Fix=20FastAPI=20People=20g?= =?UTF-8?q?eneration=20to=20include=20missing=20file=20in=20commit=20(#469?= =?UTF-8?q?5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/actions/people/app/main.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/.github/actions/people/app/main.py b/.github/actions/people/app/main.py index dc0bbc4c0..0b6ff4063 100644 --- a/.github/actions/people/app/main.py +++ b/.github/actions/people/app/main.py @@ -501,9 +501,16 @@ if __name__ == "__main__": github_sponsors_path = Path("./docs/en/data/github_sponsors.yml") people_old_content = people_path.read_text(encoding="utf-8") github_sponsors_old_content = github_sponsors_path.read_text(encoding="utf-8") - new_people_content = yaml.dump(people, sort_keys=False, width=200, allow_unicode=True) - new_github_sponsors_content = yaml.dump(github_sponsors, sort_keys=False, width=200, allow_unicode=True) - if people_old_content == new_people_content and github_sponsors_old_content == new_github_sponsors_content: + new_people_content = yaml.dump( + people, sort_keys=False, width=200, allow_unicode=True + ) + new_github_sponsors_content = yaml.dump( + github_sponsors, sort_keys=False, width=200, allow_unicode=True + ) + if ( + people_old_content == new_people_content + and github_sponsors_old_content == new_github_sponsors_content + ): logging.info("The FastAPI People data hasn't changed, finishing.") sys.exit(0) people_path.write_text(new_people_content, encoding="utf-8") @@ -517,7 +524,9 @@ if __name__ == "__main__": logging.info(f"Creating a new branch {branch_name}") subprocess.run(["git", "checkout", "-b", branch_name], check=True) logging.info("Adding updated file") - subprocess.run(["git", "add", str(people_path)], check=True) + subprocess.run( + ["git", "add", str(people_path), str(github_sponsors_path)], check=True + ) logging.info("Committing updated file") message = "👥 Update FastAPI People" result = subprocess.run(["git", "commit", "-m", message], check=True) From fd6ce6739231b4c00fb44c956ff761d6a32ad13c Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 17 Mar 2022 18:36:57 +0000 Subject: [PATCH 17/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index b7ccd67f6..bbe6ce221 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 🐛 Fix FastAPI People generation to include missing file in commit. PR [#4695](https://github.com/tiangolo/fastapi/pull/4695) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update Classiq sponsor links. PR [#4688](https://github.com/tiangolo/fastapi/pull/4688) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add Classiq sponsor. PR [#4671](https://github.com/tiangolo/fastapi/pull/4671) by [@tiangolo](https://github.com/tiangolo). * 📝 Add Jina's QA Bot to the docs to help people that want to ask quick questions. PR [#4655](https://github.com/tiangolo/fastapi/pull/4655) by [@tiangolo](https://github.com/tiangolo) based on original PR [#4626](https://github.com/tiangolo/fastapi/pull/4626) by [@hanxiao](https://github.com/hanxiao). From 7982aa514313eb7ee7cfecc71efba5a43cd43bc9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 17 Mar 2022 15:19:43 -0500 Subject: [PATCH 18/59] =?UTF-8?q?=F0=9F=91=A5=20Update=20FastAPI=20People?= =?UTF-8?q?=20(#4699)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions --- docs/en/data/github_sponsors.yml | 427 +++++++++++++++++++++---------- docs/en/data/people.yml | 182 +++++++------ 2 files changed, 377 insertions(+), 232 deletions(-) diff --git a/docs/en/data/github_sponsors.yml b/docs/en/data/github_sponsors.yml index 162a8dbe2..1d8dc9984 100644 --- a/docs/en/data/github_sponsors.yml +++ b/docs/en/data/github_sponsors.yml @@ -1,67 +1,115 @@ sponsors: -- - login: jina-ai +- - login: cryptapi + avatarUrl: https://avatars.githubusercontent.com/u/44925437?u=61369138589bc7fee6c417f3fbd50fbd38286cc4&v=4 + url: https://github.com/cryptapi + - login: jina-ai avatarUrl: https://avatars.githubusercontent.com/u/60539444?v=4 url: https://github.com/jina-ai +- - login: InesIvanova + avatarUrl: https://avatars.githubusercontent.com/u/22920417?u=409882ec1df6dbd77455788bb383a8de223dbf6f&v=4 + url: https://github.com/InesIvanova +- - login: chaserowbotham + avatarUrl: https://avatars.githubusercontent.com/u/97751084?v=4 + url: https://github.com/chaserowbotham - - login: mikeckennedy - avatarUrl: https://avatars.githubusercontent.com/u/2035561?v=4 + avatarUrl: https://avatars.githubusercontent.com/u/2035561?u=1bb18268bcd4d9249e1f783a063c27df9a84c05b&v=4 url: https://github.com/mikeckennedy - - login: RodneyU215 - avatarUrl: https://avatars.githubusercontent.com/u/3329665?u=ec6a9adf8e7e8e306eed7d49687c398608d1604f&v=4 - url: https://github.com/RodneyU215 - login: Trivie avatarUrl: https://avatars.githubusercontent.com/u/8161763?v=4 url: https://github.com/Trivie - login: deta avatarUrl: https://avatars.githubusercontent.com/u/47275976?v=4 url: https://github.com/deta + - login: deepset-ai + avatarUrl: https://avatars.githubusercontent.com/u/51827949?v=4 + url: https://github.com/deepset-ai - login: investsuite avatarUrl: https://avatars.githubusercontent.com/u/73833632?v=4 url: https://github.com/investsuite - - login: vimsoHQ - avatarUrl: https://avatars.githubusercontent.com/u/77627231?v=4 - url: https://github.com/vimsoHQ -- - login: newrelic - avatarUrl: https://avatars.githubusercontent.com/u/31739?v=4 - url: https://github.com/newrelic - - login: qaas +- - login: qaas avatarUrl: https://avatars.githubusercontent.com/u/8503759?u=10a6b4391ad6ab4cf9487ce54e3fcb61322d1efc&v=4 url: https://github.com/qaas -- - login: johnadjei + - login: xoflare + avatarUrl: https://avatars.githubusercontent.com/u/74335107?v=4 + url: https://github.com/xoflare + - login: Striveworks + avatarUrl: https://avatars.githubusercontent.com/u/45523576?v=4 + url: https://github.com/Striveworks + - login: BoostryJP + avatarUrl: https://avatars.githubusercontent.com/u/57932412?v=4 + url: https://github.com/BoostryJP +- - login: bolau + avatarUrl: https://avatars.githubusercontent.com/u/488733?u=902c9f9b85db0e21aca11bf30d904ee8e87fffef&v=4 + url: https://github.com/bolau + - login: johnadjei avatarUrl: https://avatars.githubusercontent.com/u/767860?v=4 url: https://github.com/johnadjei + - login: HiredScore + avatarUrl: https://avatars.githubusercontent.com/u/3908850?v=4 + url: https://github.com/HiredScore - login: wdwinslow avatarUrl: https://avatars.githubusercontent.com/u/11562137?u=dc01daafb354135603a263729e3d26d939c0c452&v=4 url: https://github.com/wdwinslow -- - login: kamalgill - avatarUrl: https://avatars.githubusercontent.com/u/133923?u=0df9181d97436ce330e9acf90ab8a54b7022efe7&v=4 - url: https://github.com/kamalgill +- - login: orvad + avatarUrl: https://avatars.githubusercontent.com/u/7700522?v=4 + url: https://github.com/orvad +- - login: moellenbeck + avatarUrl: https://avatars.githubusercontent.com/u/169372?v=4 + url: https://github.com/moellenbeck + - login: RodneyU215 + avatarUrl: https://avatars.githubusercontent.com/u/3329665?u=ec6a9adf8e7e8e306eed7d49687c398608d1604f&v=4 + url: https://github.com/RodneyU215 - login: grillazz avatarUrl: https://avatars.githubusercontent.com/u/3415861?u=16d7d0ffa5dfb99f8834f8f76d90e138ba09b94a&v=4 url: https://github.com/grillazz - login: tizz98 avatarUrl: https://avatars.githubusercontent.com/u/5739698?u=f095a3659e3a8e7c69ccd822696990b521ea25f9&v=4 url: https://github.com/tizz98 + - login: mntolia + avatarUrl: https://avatars.githubusercontent.com/u/10390224?v=4 + url: https://github.com/mntolia - login: jmaralc avatarUrl: https://avatars.githubusercontent.com/u/21101214?u=b15a9f07b7cbf6c9dcdbcb6550bbd2c52f55aa50&v=4 url: https://github.com/jmaralc - - login: AlexandruSimion - avatarUrl: https://avatars.githubusercontent.com/u/71321732?v=4 - url: https://github.com/AlexandruSimion + - login: Filimoa + avatarUrl: https://avatars.githubusercontent.com/u/21352040?u=75e02d102d2ee3e3d793e555fa5c63045913ccb0&v=4 + url: https://github.com/Filimoa + - login: marutoraman + avatarUrl: https://avatars.githubusercontent.com/u/33813153?v=4 + url: https://github.com/marutoraman + - login: mainframeindustries + avatarUrl: https://avatars.githubusercontent.com/u/55092103?v=4 + url: https://github.com/mainframeindustries + - login: A-Edge + avatarUrl: https://avatars.githubusercontent.com/u/59514131?v=4 + url: https://github.com/A-Edge - - login: samuelcolvin avatarUrl: https://avatars.githubusercontent.com/u/4039449?u=807390ba9cfe23906c3bf8a0d56aaca3cf2bfa0d&v=4 url: https://github.com/samuelcolvin - login: jokull avatarUrl: https://avatars.githubusercontent.com/u/701?u=0532b62166893d5160ef795c4c8b7512d971af05&v=4 url: https://github.com/jokull + - login: jefftriplett + avatarUrl: https://avatars.githubusercontent.com/u/50527?u=af1ddfd50f6afd6d99f333ba2ac8d0a5b245ea74&v=4 + url: https://github.com/jefftriplett + - login: kamalgill + avatarUrl: https://avatars.githubusercontent.com/u/133923?u=0df9181d97436ce330e9acf90ab8a54b7022efe7&v=4 + url: https://github.com/kamalgill + - login: jsutton + avatarUrl: https://avatars.githubusercontent.com/u/280777?v=4 + url: https://github.com/jsutton + - login: deserat + avatarUrl: https://avatars.githubusercontent.com/u/299332?v=4 + url: https://github.com/deserat + - login: ericof + avatarUrl: https://avatars.githubusercontent.com/u/306014?u=cf7c8733620397e6584a451505581c01c5d842d7&v=4 + url: https://github.com/ericof - login: wshayes avatarUrl: https://avatars.githubusercontent.com/u/365303?u=07ca03c5ee811eb0920e633cc3c3db73dbec1aa5&v=4 url: https://github.com/wshayes - login: koxudaxi avatarUrl: https://avatars.githubusercontent.com/u/630670?u=507d8577b4b3670546b449c4c2ccbc5af40d72f7&v=4 url: https://github.com/koxudaxi - - login: falkben - avatarUrl: https://avatars.githubusercontent.com/u/653031?u=0c8d8f33d87f1aa1a6488d3f02105e9abc838105&v=4 - url: https://github.com/falkben - login: jqueguiner avatarUrl: https://avatars.githubusercontent.com/u/690878?u=e4835b2a985a0f2d52018e4926cb5a58c26a62e8&v=4 url: https://github.com/jqueguiner @@ -71,18 +119,15 @@ sponsors: - login: ltieman avatarUrl: https://avatars.githubusercontent.com/u/1084689?u=e69b17de17cb3ca141a17daa7ccbe173ceb1eb17&v=4 url: https://github.com/ltieman - - login: mrmattwright - avatarUrl: https://avatars.githubusercontent.com/u/1277725?v=4 - url: https://github.com/mrmattwright - login: westonsteimel avatarUrl: https://avatars.githubusercontent.com/u/1593939?u=0f2c0e3647f916fe295d62fa70da7a4c177115e3&v=4 url: https://github.com/westonsteimel - login: timdrijvers avatarUrl: https://avatars.githubusercontent.com/u/1694939?v=4 url: https://github.com/timdrijvers - - login: mrgnw - avatarUrl: https://avatars.githubusercontent.com/u/2504532?u=7ec43837a6d0afa80f96f0788744ea6341b89f97&v=4 - url: https://github.com/mrgnw + - login: corleyma + avatarUrl: https://avatars.githubusercontent.com/u/2080732?u=aed2ff652294a87d666b1c3f6dbe98104db76d26&v=4 + url: https://github.com/corleyma - login: madisonmay avatarUrl: https://avatars.githubusercontent.com/u/2645393?u=f22b93c6ea345a4d26a90a3834dfc7f0789fcb63&v=4 url: https://github.com/madisonmay @@ -93,32 +138,50 @@ sponsors: avatarUrl: https://avatars.githubusercontent.com/u/3148093?v=4 url: https://github.com/andre1sk - login: Shark009 - avatarUrl: https://avatars.githubusercontent.com/u/3163309?v=4 + avatarUrl: https://avatars.githubusercontent.com/u/3163309?u=0c6f4091b0eda05c44c390466199826e6dc6e431&v=4 url: https://github.com/Shark009 + - login: dblackrun + avatarUrl: https://avatars.githubusercontent.com/u/3528486?v=4 + url: https://github.com/dblackrun + - login: zsinx6 + avatarUrl: https://avatars.githubusercontent.com/u/3532625?u=ba75a5dc744d1116ccfeaaf30d41cb2fe81fe8dd&v=4 + url: https://github.com/zsinx6 + - login: anomaly + avatarUrl: https://avatars.githubusercontent.com/u/3654837?v=4 + url: https://github.com/anomaly - login: peterHoburg avatarUrl: https://avatars.githubusercontent.com/u/3860655?u=f55f47eb2d6a9b495e806ac5a044e3ae01ccc1fa&v=4 url: https://github.com/peterHoburg - login: jaredtrog avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4 url: https://github.com/jaredtrog + - login: oliverxchen + avatarUrl: https://avatars.githubusercontent.com/u/4471774?u=534191f25e32eeaadda22dfab4b0a428733d5489&v=4 + url: https://github.com/oliverxchen - login: CINOAdam - avatarUrl: https://avatars.githubusercontent.com/u/4728508?u=34c3d58cb900fed475d0172b436c66a94ad739ed&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/4728508?u=76ef23f06ae7c604e009873bc27cf0ea9ba738c9&v=4 url: https://github.com/CINOAdam - - login: dudil - avatarUrl: https://avatars.githubusercontent.com/u/4785835?u=58b7ea39123e0507f3b2996448a27256b16fd697&v=4 - url: https://github.com/dudil + - login: ScrimForever + avatarUrl: https://avatars.githubusercontent.com/u/5040124?u=091ec38bfe16d6e762099e91309b59f248616a65&v=4 + url: https://github.com/ScrimForever - login: ennui93 avatarUrl: https://avatars.githubusercontent.com/u/5300907?u=5b5452725ddb391b2caaebf34e05aba873591c3a&v=4 url: https://github.com/ennui93 - login: MacroPower avatarUrl: https://avatars.githubusercontent.com/u/5648814?u=e13991efd1e03c44c911f919872e750530ded633&v=4 url: https://github.com/MacroPower - - login: ginomempin - avatarUrl: https://avatars.githubusercontent.com/u/6091865?v=4 - url: https://github.com/ginomempin + - login: Yaleesa + avatarUrl: https://avatars.githubusercontent.com/u/6135475?v=4 + url: https://github.com/Yaleesa - login: iwpnd avatarUrl: https://avatars.githubusercontent.com/u/6152183?u=b2286006daafff5f991557344fee20b5da59639a&v=4 url: https://github.com/iwpnd + - login: simw + avatarUrl: https://avatars.githubusercontent.com/u/6322526?v=4 + url: https://github.com/simw + - login: pkucmus + avatarUrl: https://avatars.githubusercontent.com/u/6347418?u=98f5918b32e214a168a2f5d59b0b8ebdf57dca0d&v=4 + url: https://github.com/pkucmus - login: s3ich4n avatarUrl: https://avatars.githubusercontent.com/u/6926298?u=ba3025d698e1c986655e776ae383a3d60d9d578e&v=4 url: https://github.com/s3ich4n @@ -126,116 +189,158 @@ sponsors: avatarUrl: https://avatars.githubusercontent.com/u/7015688?u=3afb0ba200feebbc7f958950e92db34df2a3c172&v=4 url: https://github.com/Rehket - login: christippett - avatarUrl: https://avatars.githubusercontent.com/u/7218120?u=434b9d29287d7de25772d94ddc74a9bd6d969284&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/7218120?u=f21f93b9c14edefef75645bf4d64c819b7d4afd7&v=4 url: https://github.com/christippett + - login: hiancdtrsnm + avatarUrl: https://avatars.githubusercontent.com/u/7343177?v=4 + url: https://github.com/hiancdtrsnm - login: Kludex - avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=cf8455cb899806b774a3a71073f88583adec99f6&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex - login: Shackelford-Arden avatarUrl: https://avatars.githubusercontent.com/u/7362263?v=4 url: https://github.com/Shackelford-Arden - - login: cristeaadrian - avatarUrl: https://avatars.githubusercontent.com/u/9112724?v=4 - url: https://github.com/cristeaadrian - - login: otivvormes - avatarUrl: https://avatars.githubusercontent.com/u/11317418?u=6de1edefb6afd0108c0ad2816bd6efc4464a9c44&v=4 - url: https://github.com/otivvormes - - login: iambobmae - avatarUrl: https://avatars.githubusercontent.com/u/12390270?u=c9a35c2ee5092a9b4135ebb1f91b7f521c467031&v=4 - url: https://github.com/iambobmae - - login: ronaldnwilliams - avatarUrl: https://avatars.githubusercontent.com/u/13632749?u=ac41a086d0728bf66a9d2bee9e5e377041ff44a4&v=4 - url: https://github.com/ronaldnwilliams + - login: Vikka + avatarUrl: https://avatars.githubusercontent.com/u/9381120?u=4bfc7032a824d1ed1994aa8256dfa597c8f187ad&v=4 + url: https://github.com/Vikka + - login: Ge0f3 + avatarUrl: https://avatars.githubusercontent.com/u/11887760?u=ccd80f1ac36dcb8517ef5c4e702e8cc5a80cad2f&v=4 + url: https://github.com/Ge0f3 + - login: gokulyc + avatarUrl: https://avatars.githubusercontent.com/u/13468848?u=269f269d3e70407b5fb80138c52daba7af783997&v=4 + url: https://github.com/gokulyc + - login: dannywade + avatarUrl: https://avatars.githubusercontent.com/u/13680237?u=418ee985bd41577b20fde81417fb2d901e875e8a&v=4 + url: https://github.com/dannywade - login: pablonnaoji avatarUrl: https://avatars.githubusercontent.com/u/15187159?u=afc15bd5a4ba9c5c7206bbb1bcaeef606a0932e0&v=4 url: https://github.com/pablonnaoji - - login: natenka - avatarUrl: https://avatars.githubusercontent.com/u/15850513?u=00d1083c980d0b4ce32835dc07eee7f43f34fd2f&v=4 - url: https://github.com/natenka - - login: la-mar - avatarUrl: https://avatars.githubusercontent.com/u/16618300?u=7755c0521d2bb0d704f35a51464b15c1e2e6c4da&v=4 - url: https://github.com/la-mar - login: robintully avatarUrl: https://avatars.githubusercontent.com/u/17059673?u=862b9bb01513f5acd30df97433cb97a24dbfb772&v=4 url: https://github.com/robintully - - login: ShaulAb - avatarUrl: https://avatars.githubusercontent.com/u/18129076?u=2c8d48e47f2dbee15c3f89c3d17d4c356504386c&v=4 - url: https://github.com/ShaulAb + - login: tobiasfeil + avatarUrl: https://avatars.githubusercontent.com/u/17533713?u=bc6b0bec46f342d13c41695db90685d1c58d534e&v=4 + url: https://github.com/tobiasfeil - login: wedwardbeck avatarUrl: https://avatars.githubusercontent.com/u/19333237?u=1de4ae2bf8d59eb4c013f21d863cbe0f2010575f&v=4 url: https://github.com/wedwardbeck - login: linusg avatarUrl: https://avatars.githubusercontent.com/u/19366641?u=125e390abef8fff3b3b0d370c369cba5d7fd4c67&v=4 url: https://github.com/linusg + - login: stradivari96 + avatarUrl: https://avatars.githubusercontent.com/u/19752586?u=255f5f06a768f518b20cebd6963e840ac49294fd&v=4 + url: https://github.com/stradivari96 - login: RedCarpetUp avatarUrl: https://avatars.githubusercontent.com/u/20360440?v=4 url: https://github.com/RedCarpetUp - - login: Filimoa - avatarUrl: https://avatars.githubusercontent.com/u/21352040?u=75e02d102d2ee3e3d793e555fa5c63045913ccb0&v=4 - url: https://github.com/Filimoa - - login: raminsj13 - avatarUrl: https://avatars.githubusercontent.com/u/24259406?u=d51f2a526312ebba150a06936ed187ca0727d329&v=4 - url: https://github.com/raminsj13 + - login: shuheng-liu + avatarUrl: https://avatars.githubusercontent.com/u/22414322?u=813c45f30786c6b511b21a661def025d8f7b609e&v=4 + url: https://github.com/shuheng-liu - login: comoelcometa avatarUrl: https://avatars.githubusercontent.com/u/25950317?u=c6751efa038561b9bc5fa56d1033d5174e10cd65&v=4 url: https://github.com/comoelcometa + - login: LarryGF + avatarUrl: https://avatars.githubusercontent.com/u/26148349?u=431bb34d36d41c172466252242175281ae132152&v=4 + url: https://github.com/LarryGF - login: veprimk avatarUrl: https://avatars.githubusercontent.com/u/29689749?u=f8cb5a15a286e522e5b189bc572d5a1a90217fb2&v=4 url: https://github.com/veprimk - login: orihomie avatarUrl: https://avatars.githubusercontent.com/u/29889683?u=6bc2135a52fcb3a49e69e7d50190796618185fda&v=4 url: https://github.com/orihomie - - login: SaltyCoco - avatarUrl: https://avatars.githubusercontent.com/u/31451104?u=6ee4e17c07d21b7054f54a12fa9cc377a1b24ff9&v=4 - url: https://github.com/SaltyCoco + - login: meysam81 + avatarUrl: https://avatars.githubusercontent.com/u/30233243?u=64dc9fc62d039892c6fb44d804251cad5537132b&v=4 + url: https://github.com/meysam81 - login: mauroalejandrojm avatarUrl: https://avatars.githubusercontent.com/u/31569442?u=cdada990a1527926a36e95f62c30a8b48bbc49a1&v=4 url: https://github.com/mauroalejandrojm - - login: bulkw4r3 - avatarUrl: https://avatars.githubusercontent.com/u/35562532?u=0b812a14a02de14bf73d05fb2b2760a67bacffc2&v=4 - url: https://github.com/bulkw4r3 + - login: Leay15 + avatarUrl: https://avatars.githubusercontent.com/u/32212558?u=c4aa9c1737e515959382a5515381757b1fd86c53&v=4 + url: https://github.com/Leay15 + - login: AlrasheedA + avatarUrl: https://avatars.githubusercontent.com/u/33544979?u=7fe66bf62b47682612b222e3e8f4795ef3be769b&v=4 + url: https://github.com/AlrasheedA + - login: ProteinQure + avatarUrl: https://avatars.githubusercontent.com/u/33707203?v=4 + url: https://github.com/ProteinQure + - login: guligon90 + avatarUrl: https://avatars.githubusercontent.com/u/35070513?u=b48c05f669d1ea1d329f90dc70e45f10b569ef55&v=4 + url: https://github.com/guligon90 - login: ybressler avatarUrl: https://avatars.githubusercontent.com/u/40807730?u=6621dc9ab53b697912ab2a32211bb29ae90a9112&v=4 url: https://github.com/ybressler - login: dbanty - avatarUrl: https://avatars.githubusercontent.com/u/43723790?u=0cf33e4f40efc2ea206a1189fd63a11344eb88ed&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/43723790?u=9bcce836bbce55835291c5b2ac93a4e311f4b3c3&v=4 url: https://github.com/dbanty + - login: rafsaf + avatarUrl: https://avatars.githubusercontent.com/u/51059348?u=be9f06b8ced2d2b677297decc781fa8ce4f7ddbd&v=4 + url: https://github.com/rafsaf - login: dudikbender avatarUrl: https://avatars.githubusercontent.com/u/53487583?u=494f85229115076121b3639a3806bbac1c6ae7f6&v=4 url: https://github.com/dudikbender + - login: jorge4larcon + avatarUrl: https://avatars.githubusercontent.com/u/54189123?v=4 + url: https://github.com/jorge4larcon + - login: daisuke8000 + avatarUrl: https://avatars.githubusercontent.com/u/55035595?u=5025e379cd3655ae1a96039efc85223a873d2e38&v=4 + url: https://github.com/daisuke8000 - login: primer-io avatarUrl: https://avatars.githubusercontent.com/u/62146168?v=4 url: https://github.com/primer-io - - login: tkrestiankova - avatarUrl: https://avatars.githubusercontent.com/u/67013045?v=4 - url: https://github.com/tkrestiankova + - login: around + avatarUrl: https://avatars.githubusercontent.com/u/62425723?v=4 + url: https://github.com/around + - login: predictionmachine + avatarUrl: https://avatars.githubusercontent.com/u/63719559?v=4 + url: https://github.com/predictionmachine - login: daverin avatarUrl: https://avatars.githubusercontent.com/u/70378377?u=6d1814195c0de7162820eaad95a25b423a3869c0&v=4 url: https://github.com/daverin - login: anthonycepeda avatarUrl: https://avatars.githubusercontent.com/u/72019805?u=892f700c79f9732211bd5221bf16eec32356a732&v=4 url: https://github.com/anthonycepeda - - login: an-tho-ny - avatarUrl: https://avatars.githubusercontent.com/u/74874159?v=4 - url: https://github.com/an-tho-ny + - login: abdurrahim84 + avatarUrl: https://avatars.githubusercontent.com/u/79488613?v=4 + url: https://github.com/abdurrahim84 + - login: NinaHwang + avatarUrl: https://avatars.githubusercontent.com/u/79563565?u=1741703bd6c8f491503354b363a86e879b4c1cab&v=4 + url: https://github.com/NinaHwang + - login: dotlas + avatarUrl: https://avatars.githubusercontent.com/u/88832003?v=4 + url: https://github.com/dotlas + - login: pyt3h + avatarUrl: https://avatars.githubusercontent.com/u/99658549?v=4 + url: https://github.com/pyt3h +- - login: '837477' + avatarUrl: https://avatars.githubusercontent.com/u/37999795?u=543b0bd0e8f283db0fc50754e5d13f6afba8cbea&v=4 + url: https://github.com/837477 + - login: naheedroomy + avatarUrl: https://avatars.githubusercontent.com/u/46345736?v=4 + url: https://github.com/naheedroomy - - login: linux-china avatarUrl: https://avatars.githubusercontent.com/u/46711?v=4 url: https://github.com/linux-china + - login: ddanier + avatarUrl: https://avatars.githubusercontent.com/u/113563?v=4 + url: https://github.com/ddanier - login: jhb avatarUrl: https://avatars.githubusercontent.com/u/142217?v=4 url: https://github.com/jhb + - login: justinrmiller + avatarUrl: https://avatars.githubusercontent.com/u/143998?u=b507a940394d4fc2bc1c27cea2ca9c22538874bd&v=4 + url: https://github.com/justinrmiller + - login: bryanculbertson + avatarUrl: https://avatars.githubusercontent.com/u/144028?u=defda4f90e93429221cc667500944abde60ebe4a&v=4 + url: https://github.com/bryanculbertson - login: yourkin - avatarUrl: https://avatars.githubusercontent.com/u/178984?v=4 + avatarUrl: https://avatars.githubusercontent.com/u/178984?u=163b8c6d9b2d240164ade467cbc9efb16d2432e4&v=4 url: https://github.com/yourkin - - login: jmagnusson - avatarUrl: https://avatars.githubusercontent.com/u/190835?v=4 - url: https://github.com/jmagnusson - - login: sakti - avatarUrl: https://avatars.githubusercontent.com/u/196178?u=0110be74c4270244546f1b610334042cd16bb8ad&v=4 - url: https://github.com/sakti - login: slafs avatarUrl: https://avatars.githubusercontent.com/u/210173?v=4 url: https://github.com/slafs + - login: assem-ch + avatarUrl: https://avatars.githubusercontent.com/u/315228?u=e0c5ab30726d3243a40974bb9bae327866e42d9b&v=4 + url: https://github.com/assem-ch - login: adamghill avatarUrl: https://avatars.githubusercontent.com/u/317045?u=f1349d5ffe84a19f324e204777859fbf69ddf633&v=4 url: https://github.com/adamghill @@ -245,21 +350,33 @@ sponsors: - login: dmig avatarUrl: https://avatars.githubusercontent.com/u/388564?v=4 url: https://github.com/dmig - - login: hongqn - avatarUrl: https://avatars.githubusercontent.com/u/405587?u=470b4c04832e45141fd5264d3354845cc9fc6466&v=4 - url: https://github.com/hongqn - login: rinckd avatarUrl: https://avatars.githubusercontent.com/u/546002?u=1fcc7e664dc86524a0af6837a0c222829c3fd4e5&v=4 url: https://github.com/rinckd + - login: securancy + avatarUrl: https://avatars.githubusercontent.com/u/606673?v=4 + url: https://github.com/securancy + - login: falkben + avatarUrl: https://avatars.githubusercontent.com/u/653031?u=0c8d8f33d87f1aa1a6488d3f02105e9abc838105&v=4 + url: https://github.com/falkben - login: hardbyte avatarUrl: https://avatars.githubusercontent.com/u/855189?u=aa29e92f34708814d6b67fcd47ca4cf2ce1c04ed&v=4 url: https://github.com/hardbyte + - login: clstaudt + avatarUrl: https://avatars.githubusercontent.com/u/875194?u=46a92f9f837d0ba150ae0f1d91091dd2f4ebb6cc&v=4 + url: https://github.com/clstaudt + - login: scari + avatarUrl: https://avatars.githubusercontent.com/u/964251?v=4 + url: https://github.com/scari - login: Pytlicek avatarUrl: https://avatars.githubusercontent.com/u/1430522?u=169dba3bfbc04ed214a914640ff435969f19ddb3&v=4 url: https://github.com/Pytlicek - - login: okken - avatarUrl: https://avatars.githubusercontent.com/u/1568356?u=0a991a21bdc62e2bea9ad311652f2c45f453dc84&v=4 - url: https://github.com/okken + - login: Celeborn2BeAlive + avatarUrl: https://avatars.githubusercontent.com/u/1659465?u=944517e4db0f6df65070074e81cabdad9c8a434b&v=4 + url: https://github.com/Celeborn2BeAlive + - login: WillHogan + avatarUrl: https://avatars.githubusercontent.com/u/1661551?u=7036c064cf29781470573865264ec8e60b6b809f&v=4 + url: https://github.com/WillHogan - login: cbonoz avatarUrl: https://avatars.githubusercontent.com/u/2351087?u=fd3e8030b2cc9fbfbb54a65e9890c548a016f58b&v=4 url: https://github.com/cbonoz @@ -269,111 +386,147 @@ sponsors: - login: rglsk avatarUrl: https://avatars.githubusercontent.com/u/2768101?u=e349c88673f2155fe021331377c656a9d74bcc25&v=4 url: https://github.com/rglsk - - login: Atem18 - avatarUrl: https://avatars.githubusercontent.com/u/2875254?v=4 - url: https://github.com/Atem18 - login: paul121 avatarUrl: https://avatars.githubusercontent.com/u/3116995?u=6e2d8691cc345e63ee02e4eb4d7cef82b1fcbedc&v=4 url: https://github.com/paul121 - login: igorcorrea avatarUrl: https://avatars.githubusercontent.com/u/3438238?u=c57605077c31a8f7b2341fc4912507f91b4a5621&v=4 url: https://github.com/igorcorrea - - login: anthcor + - login: anthonycorletti avatarUrl: https://avatars.githubusercontent.com/u/3477132?v=4 - url: https://github.com/anthcor - - login: zsinx6 - avatarUrl: https://avatars.githubusercontent.com/u/3532625?u=ba75a5dc744d1116ccfeaaf30d41cb2fe81fe8dd&v=4 - url: https://github.com/zsinx6 + url: https://github.com/anthonycorletti - login: pawamoy avatarUrl: https://avatars.githubusercontent.com/u/3999221?u=b030e4c89df2f3a36bc4710b925bdeb6745c9856&v=4 url: https://github.com/pawamoy - - login: spyker77 - avatarUrl: https://avatars.githubusercontent.com/u/4953435?u=03c724c6f8fbab5cd6575b810c0c91c652fa4f79&v=4 - url: https://github.com/spyker77 - - login: JonasKs - avatarUrl: https://avatars.githubusercontent.com/u/5310116?u=98a049f3e1491bffb91e1feb7e93def6881a9389&v=4 - url: https://github.com/JonasKs + - login: Alisa-lisa + avatarUrl: https://avatars.githubusercontent.com/u/4137964?u=e7e393504f554f4ff15863a1e01a5746863ef9ce&v=4 + url: https://github.com/Alisa-lisa + - login: unredundant + avatarUrl: https://avatars.githubusercontent.com/u/5607577?u=57dd0023365bec03f4fc566df6b81bc0a264a47d&v=4 + url: https://github.com/unredundant + - login: Baghdady92 + avatarUrl: https://avatars.githubusercontent.com/u/5708590?v=4 + url: https://github.com/Baghdady92 - login: holec avatarUrl: https://avatars.githubusercontent.com/u/6438041?u=f5af71ec85b3a9d7b8139cb5af0512b02fa9ab1e&v=4 url: https://github.com/holec - - login: BartlomiejRasztabiga - avatarUrl: https://avatars.githubusercontent.com/u/8852711?u=ed213d60f7a423df31ceb1004aa3ec60e612cb98&v=4 - url: https://github.com/BartlomiejRasztabiga - login: davanstrien avatarUrl: https://avatars.githubusercontent.com/u/8995957?u=fb2aad2b52bb4e7b56db6d7c8ecc9ae1eac1b984&v=4 url: https://github.com/davanstrien - login: and-semakin avatarUrl: https://avatars.githubusercontent.com/u/9129071?u=ea77ddf7de4bc375d546bf2825ed420eaddb7666&v=4 url: https://github.com/and-semakin + - login: yenchenLiu + avatarUrl: https://avatars.githubusercontent.com/u/9199638?u=8cdf5ae507448430d90f6f3518d1665a23afe99b&v=4 + url: https://github.com/yenchenLiu - login: VivianSolide - avatarUrl: https://avatars.githubusercontent.com/u/9358572?u=ffb2e2ec522a15dcd3f0af1f9fd1df4afe418afa&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/9358572?u=4a38ef72dd39e8b262bd5ab819992128b55c52b4&v=4 url: https://github.com/VivianSolide + - login: xncbf + avatarUrl: https://avatars.githubusercontent.com/u/9462045?u=ded074228b35b46a76b980d2dda522e45277f96d&v=4 + url: https://github.com/xncbf + - login: DMantis + avatarUrl: https://avatars.githubusercontent.com/u/9536869?v=4 + url: https://github.com/DMantis - login: hard-coders - avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=f2d3d2038c55d86d7f9348f4e6c5e30191e4ee8b&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=95db33927bbff1ed1c07efddeb97ac2ff33068ed&v=4 url: https://github.com/hard-coders - - login: satwikkansal - avatarUrl: https://avatars.githubusercontent.com/u/10217535?u=b12d6ef74ea297de9e46da6933b1a5b7ba9e6a61&v=4 - url: https://github.com/satwikkansal - login: pheanex avatarUrl: https://avatars.githubusercontent.com/u/10408624?u=5b6bab6ee174aa6e991333e06eb29f628741013d&v=4 url: https://github.com/pheanex - - login: wotori - avatarUrl: https://avatars.githubusercontent.com/u/10486621?u=0044c295b91694b8c9bccc0a805681f794250f7b&v=4 - url: https://github.com/wotori - login: JimFawkes avatarUrl: https://avatars.githubusercontent.com/u/12075115?u=dc58ecfd064d72887c34bf500ddfd52592509acd&v=4 url: https://github.com/JimFawkes - login: logan-connolly avatarUrl: https://avatars.githubusercontent.com/u/16244943?u=8ae66dfbba936463cc8aa0dd7a6d2b4c0cc757eb&v=4 url: https://github.com/logan-connolly - - login: iPr0ger - avatarUrl: https://avatars.githubusercontent.com/u/19322290?v=4 - url: https://github.com/iPr0ger + - login: cdsre + avatarUrl: https://avatars.githubusercontent.com/u/16945936?v=4 + url: https://github.com/cdsre + - login: jangia + avatarUrl: https://avatars.githubusercontent.com/u/17927101?u=9261b9bb0c3e3bb1ecba43e8915dc58d8c9a077e&v=4 + url: https://github.com/jangia - login: ghandic avatarUrl: https://avatars.githubusercontent.com/u/23500353?u=e2e1d736f924d9be81e8bfc565b6d8836ba99773&v=4 url: https://github.com/ghandic - - login: MoronVV - avatarUrl: https://avatars.githubusercontent.com/u/24293616?v=4 - url: https://github.com/MoronVV - login: fstau avatarUrl: https://avatars.githubusercontent.com/u/24669867?u=60e7c8c09f8dafabee8fc3edcd6f9e19abbff918&v=4 url: https://github.com/fstau - login: mertguvencli avatarUrl: https://avatars.githubusercontent.com/u/29762151?u=16a906d90df96c8cff9ea131a575c4bc171b1523&v=4 url: https://github.com/mertguvencli - - login: rgreen32 - avatarUrl: https://avatars.githubusercontent.com/u/35779241?u=c9d64ad1ab364b6a1ec8e3d859da9ca802d681d8&v=4 - url: https://github.com/rgreen32 + - login: dwreeves + avatarUrl: https://avatars.githubusercontent.com/u/31971762?u=69732aba05aa5cf0780866349ebe109cf632b047&v=4 + url: https://github.com/dwreeves + - login: kitaramu0401 + avatarUrl: https://avatars.githubusercontent.com/u/33246506?u=929e6efa2c518033b8097ba524eb5347a069bb3b&v=4 + url: https://github.com/kitaramu0401 + - login: engineerjoe440 + avatarUrl: https://avatars.githubusercontent.com/u/33275230?u=eb223cad27017bb1e936ee9b429b450d092d0236&v=4 + url: https://github.com/engineerjoe440 + - login: declon + avatarUrl: https://avatars.githubusercontent.com/u/36180226?v=4 + url: https://github.com/declon + - login: d-e-h-i-o + avatarUrl: https://avatars.githubusercontent.com/u/36816716?v=4 + url: https://github.com/d-e-h-i-o - login: askurihin avatarUrl: https://avatars.githubusercontent.com/u/37978981?v=4 url: https://github.com/askurihin - login: JitPackJoyride - avatarUrl: https://avatars.githubusercontent.com/u/40203625?u=9638bfeacfa5940358188f8205ce662bba022b53&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/40203625?u=cfad4285914e018af72a3f3c16d8ac11321201e3&v=4 url: https://github.com/JitPackJoyride - login: es3n1n - avatarUrl: https://avatars.githubusercontent.com/u/40367813?u=e881a3880f1e342d19a1ea7c8e1b6d76c52dc294&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/40367813?u=cfaaedfb5da6c2c00330f8ebb041cd39c6a6273d&v=4 url: https://github.com/es3n1n - login: ilias-ant avatarUrl: https://avatars.githubusercontent.com/u/42189572?u=a2d6121bac4d125d92ec207460fa3f1842d37e66&v=4 url: https://github.com/ilias-ant - login: arrrrrmin - avatarUrl: https://avatars.githubusercontent.com/u/43553423?u=05600727f1cfe75f440bb3fddd49bfea84b1e894&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/43553423?u=fee5739394fea074cb0b66929d070114a5067aae&v=4 url: https://github.com/arrrrrmin + - login: 4heck + avatarUrl: https://avatars.githubusercontent.com/u/45015299?u=7dfb2aca55bff66849396588828a90e090212f81&v=4 + url: https://github.com/4heck + - login: igorezersky + avatarUrl: https://avatars.githubusercontent.com/u/46680020?u=a20a595c881dbe5658c906fecc7eff125efb4fd4&v=4 + url: https://github.com/igorezersky - login: akanz1 avatarUrl: https://avatars.githubusercontent.com/u/51492342?u=2280f57134118714645e16b535c1a37adf6b369b&v=4 url: https://github.com/akanz1 -- - login: leogregianin - avatarUrl: https://avatars.githubusercontent.com/u/1684053?u=94ddd387601bd1805034dbe83e6eba0491c15323&v=4 - url: https://github.com/leogregianin + - login: rooflexx + avatarUrl: https://avatars.githubusercontent.com/u/58993673?u=f8ba450460f1aea18430ed1e4a3889049a3b4dfa&v=4 + url: https://github.com/rooflexx + - login: denisyao1 + avatarUrl: https://avatars.githubusercontent.com/u/60019356?v=4 + url: https://github.com/denisyao1 + - login: apar-tiwari + avatarUrl: https://avatars.githubusercontent.com/u/61064197?v=4 + url: https://github.com/apar-tiwari + - login: 0417taehyun + avatarUrl: https://avatars.githubusercontent.com/u/63915557?u=47debaa860fd52c9b98c97ef357ddcec3b3fb399&v=4 + url: https://github.com/0417taehyun + - login: alessio-proietti + avatarUrl: https://avatars.githubusercontent.com/u/67370599?u=8ac73db1e18e946a7681f173abdb640516f88515&v=4 + url: https://github.com/alessio-proietti +- - login: spyker77 + avatarUrl: https://avatars.githubusercontent.com/u/4953435?u=03c724c6f8fbab5cd6575b810c0c91c652fa4f79&v=4 + url: https://github.com/spyker77 + - login: backbord + avatarUrl: https://avatars.githubusercontent.com/u/6814946?v=4 + url: https://github.com/backbord - login: sadikkuzu avatarUrl: https://avatars.githubusercontent.com/u/23168063?u=765ed469c44c004560079210ccdad5b29938eaa9&v=4 url: https://github.com/sadikkuzu + - login: MoronVV + avatarUrl: https://avatars.githubusercontent.com/u/24293616?v=4 + url: https://github.com/MoronVV - login: gabrielmbmb avatarUrl: https://avatars.githubusercontent.com/u/29572918?u=92084ed7242160dee4d20aece923a10c59758ee5&v=4 url: https://github.com/gabrielmbmb - - login: starhype - avatarUrl: https://avatars.githubusercontent.com/u/36908028?u=6df41f7b62f0f673f1ecbc87e9cbadaa4fcb0767&v=4 - url: https://github.com/starhype - - login: pixel365 - avatarUrl: https://avatars.githubusercontent.com/u/53819609?u=9e0309c5420ec4624aececd3ca2d7105f7f68133&v=4 - url: https://github.com/pixel365 + - login: danburonline + avatarUrl: https://avatars.githubusercontent.com/u/34251194?u=2cad4388c1544e539ecb732d656e42fb07b4ff2d&v=4 + url: https://github.com/danburonline + - login: foryourselfand + avatarUrl: https://avatars.githubusercontent.com/u/43334967?u=8abd999f94bc0852d035b765155d5138a88288ce&v=4 + url: https://github.com/foryourselfand diff --git a/docs/en/data/people.yml b/docs/en/data/people.yml index ebbe446ee..591800a35 100644 --- a/docs/en/data/people.yml +++ b/docs/en/data/people.yml @@ -1,13 +1,13 @@ maintainers: - login: tiangolo - answers: 1237 - prs: 280 + answers: 1240 + prs: 289 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=5cad72c846b7aba2e960546af490edc7375dafc4&v=4 url: https://github.com/tiangolo experts: - login: Kludex - count: 319 - avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=3682d9b9b93bef272f379ab623dc031c8d71432e&v=4 + count: 330 + avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex - login: dmontagu count: 262 @@ -29,14 +29,14 @@ experts: count: 130 avatarUrl: https://avatars.githubusercontent.com/u/331403?v=4 url: https://github.com/phy25 +- login: raphaelauv + count: 71 + avatarUrl: https://avatars.githubusercontent.com/u/10202690?u=e6f86f5c0c3026a15d6b51792fa3e532b12f1371&v=4 + url: https://github.com/raphaelauv - login: ArcLightSlavik count: 71 avatarUrl: https://avatars.githubusercontent.com/u/31127044?u=81a84af39c89b898b0fbc5a04e8834f60f23e55a&v=4 url: https://github.com/ArcLightSlavik -- login: raphaelauv - count: 68 - avatarUrl: https://avatars.githubusercontent.com/u/10202690?u=e6f86f5c0c3026a15d6b51792fa3e532b12f1371&v=4 - url: https://github.com/raphaelauv - login: falkben count: 58 avatarUrl: https://avatars.githubusercontent.com/u/653031?u=0c8d8f33d87f1aa1a6488d3f02105e9abc838105&v=4 @@ -50,7 +50,7 @@ experts: avatarUrl: https://avatars.githubusercontent.com/u/16958893?u=f8be7088d5076d963984a21f95f44e559192d912&v=4 url: https://github.com/insomnes - login: Dustyposa - count: 42 + count: 43 avatarUrl: https://avatars.githubusercontent.com/u/27180793?u=5cf2877f50b3eb2bc55086089a78a36f07042889&v=4 url: https://github.com/Dustyposa - login: includeamin @@ -65,22 +65,26 @@ experts: count: 33 avatarUrl: https://avatars.githubusercontent.com/u/28061158?u=72309cc1f2e04e40fa38b29969cb4e9d3f722e7b&v=4 url: https://github.com/prostomarkeloff +- login: frankie567 + count: 31 + avatarUrl: https://avatars.githubusercontent.com/u/1144727?u=85c025e3fcc7bd79a5665c63ee87cdf8aae13374&v=4 + url: https://github.com/frankie567 +- login: adriangb + count: 31 + avatarUrl: https://avatars.githubusercontent.com/u/1755071?u=81f0262df34e1460ca546fbd0c211169c2478532&v=4 + url: https://github.com/adriangb - login: krishnardt count: 31 avatarUrl: https://avatars.githubusercontent.com/u/31960541?u=47f4829c77f4962ab437ffb7995951e41eeebe9b&v=4 url: https://github.com/krishnardt -- login: adriangb - count: 30 - avatarUrl: https://avatars.githubusercontent.com/u/1755071?u=81f0262df34e1460ca546fbd0c211169c2478532&v=4 - url: https://github.com/adriangb - login: wshayes count: 29 avatarUrl: https://avatars.githubusercontent.com/u/365303?u=07ca03c5ee811eb0920e633cc3c3db73dbec1aa5&v=4 url: https://github.com/wshayes -- login: frankie567 - count: 29 - avatarUrl: https://avatars.githubusercontent.com/u/1144727?u=85c025e3fcc7bd79a5665c63ee87cdf8aae13374&v=4 - url: https://github.com/frankie567 +- login: panla + count: 26 + avatarUrl: https://avatars.githubusercontent.com/u/41326348?u=ba2fda6b30110411ecbf406d187907e2b420ac19&v=4 + url: https://github.com/panla - login: chbndrhnns count: 25 avatarUrl: https://avatars.githubusercontent.com/u/7534547?v=4 @@ -93,10 +97,6 @@ experts: count: 25 avatarUrl: https://avatars.githubusercontent.com/u/43723790?u=9bcce836bbce55835291c5b2ac93a4e311f4b3c3&v=4 url: https://github.com/dbanty -- login: panla - count: 25 - avatarUrl: https://avatars.githubusercontent.com/u/41326348?u=ba2fda6b30110411ecbf406d187907e2b420ac19&v=4 - url: https://github.com/panla - login: SirTelemak count: 24 avatarUrl: https://avatars.githubusercontent.com/u/9435877?u=719327b7d2c4c62212456d771bfa7c6b8dbb9eac&v=4 @@ -113,6 +113,10 @@ experts: count: 21 avatarUrl: https://avatars.githubusercontent.com/u/565544?v=4 url: https://github.com/chris-allnutt +- login: jgould22 + count: 20 + avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 + url: https://github.com/jgould22 - login: retnikt count: 19 avatarUrl: https://avatars.githubusercontent.com/u/24581770?v=4 @@ -141,14 +145,14 @@ experts: count: 16 avatarUrl: https://avatars.githubusercontent.com/u/41964673?u=9f2174f9d61c15c6e3a4c9e3aeee66f711ce311f&v=4 url: https://github.com/dstlny -- login: jgould22 - count: 14 - avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 - url: https://github.com/jgould22 - login: harunyasar - count: 14 + count: 16 avatarUrl: https://avatars.githubusercontent.com/u/1765494?u=5b1ab7c582db4b4016fa31affe977d10af108ad4&v=4 url: https://github.com/harunyasar +- login: rafsaf + count: 15 + avatarUrl: https://avatars.githubusercontent.com/u/51059348?u=be9f06b8ced2d2b677297decc781fa8ce4f7ddbd&v=4 + url: https://github.com/rafsaf - login: haizaar count: 13 avatarUrl: https://avatars.githubusercontent.com/u/58201?u=4f1f9843d69433ca0d380d95146cfe119e5fdac4&v=4 @@ -189,43 +193,31 @@ experts: count: 10 avatarUrl: https://avatars.githubusercontent.com/u/2858306?u=1bb1182a5944e93624b7fb26585f22c8f7a9d76e&v=4 url: https://github.com/oligond +- login: n8sty + count: 10 + avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 + url: https://github.com/n8sty last_month_active: -- login: harunyasar - count: 10 - avatarUrl: https://avatars.githubusercontent.com/u/1765494?u=5b1ab7c582db4b4016fa31affe977d10af108ad4&v=4 - url: https://github.com/harunyasar +- login: yinziyan1206 + count: 7 + avatarUrl: https://avatars.githubusercontent.com/u/37829370?v=4 + url: https://github.com/yinziyan1206 +- login: Kludex + count: 6 + avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 + url: https://github.com/Kludex - login: jgould22 - count: 10 + count: 3 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 - login: rafsaf - count: 9 + count: 3 avatarUrl: https://avatars.githubusercontent.com/u/51059348?u=be9f06b8ced2d2b677297decc781fa8ce4f7ddbd&v=4 url: https://github.com/rafsaf -- login: STeveShary - count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/5167622?u=de8f597c81d6336fcebc37b32dfd61a3f877160c&v=4 - url: https://github.com/STeveShary -- login: ahnaf-zamil +- login: gmanny count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/57180217?u=849128b146771ace47beca5b5ff68eb82905dd6d&v=4 - url: https://github.com/ahnaf-zamil -- login: lucastosetto - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/89307132?u=56326696423df7126c9e7c702ee58f294db69a2a&v=4 - url: https://github.com/lucastosetto -- login: blokje - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/851418?v=4 - url: https://github.com/blokje -- login: MatthijsKok - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/7658129?u=1243e32d57e13abc45e3f5235ed5b9197e0d2b41&v=4 - url: https://github.com/MatthijsKok -- login: Kludex - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=3682d9b9b93bef272f379ab623dc031c8d71432e&v=4 - url: https://github.com/Kludex + avatarUrl: https://avatars.githubusercontent.com/u/1166296?v=4 + url: https://github.com/gmanny top_contributors: - login: waynerv count: 25 @@ -265,7 +257,7 @@ top_contributors: url: https://github.com/RunningIkkyu - login: Kludex count: 7 - avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=3682d9b9b93bef272f379ab623dc031c8d71432e&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex - login: hard-coders count: 7 @@ -306,7 +298,7 @@ top_contributors: top_reviewers: - login: Kludex count: 93 - avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=3682d9b9b93bef272f379ab623dc031c8d71432e&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex - login: waynerv count: 47 @@ -324,6 +316,10 @@ top_reviewers: count: 45 avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=826f228edf0bab0d19ad1d5c4ba4df1047ccffef&v=4 url: https://github.com/ycd +- login: cikay + count: 40 + avatarUrl: https://avatars.githubusercontent.com/u/24587499?u=e772190a051ab0eaa9c8542fcff1892471638f2b&v=4 + url: https://github.com/cikay - login: AdrianDeAnda count: 33 avatarUrl: https://avatars.githubusercontent.com/u/1024932?u=bb7f8a0d6c9de4e9d0320a9f271210206e202250&v=4 @@ -332,10 +328,6 @@ top_reviewers: count: 31 avatarUrl: https://avatars.githubusercontent.com/u/31127044?u=81a84af39c89b898b0fbc5a04e8834f60f23e55a&v=4 url: https://github.com/ArcLightSlavik -- login: cikay - count: 24 - avatarUrl: https://avatars.githubusercontent.com/u/24587499?u=e772190a051ab0eaa9c8542fcff1892471638f2b&v=4 - url: https://github.com/cikay - login: dmontagu count: 23 avatarUrl: https://avatars.githubusercontent.com/u/35119617?u=58ed2a45798a4339700e2f62b2e12e6e54bf0396&v=4 @@ -356,6 +348,18 @@ top_reviewers: count: 19 avatarUrl: https://avatars.githubusercontent.com/u/63915557?u=47debaa860fd52c9b98c97ef357ddcec3b3fb399&v=4 url: https://github.com/0417taehyun +- login: BilalAlpaslan + count: 18 + avatarUrl: https://avatars.githubusercontent.com/u/47563997?u=63ed66e304fe8d765762c70587d61d9196e5c82d&v=4 + url: https://github.com/BilalAlpaslan +- login: zy7y + count: 17 + avatarUrl: https://avatars.githubusercontent.com/u/67154681?u=5d634834cc514028ea3f9115f7030b99a1f4d5a4&v=4 + url: https://github.com/zy7y +- login: yezz123 + count: 16 + avatarUrl: https://avatars.githubusercontent.com/u/52716203?u=636b4f79645176df4527dd45c12d5dbb5a4193cf&v=4 + url: https://github.com/yezz123 - login: yanever count: 16 avatarUrl: https://avatars.githubusercontent.com/u/21978760?v=4 @@ -392,10 +396,6 @@ top_reviewers: count: 12 avatarUrl: https://avatars.githubusercontent.com/u/31848542?u=706e1ee3f248245f2d68b976d149d06fd5a2010d&v=4 url: https://github.com/RunningIkkyu -- login: yezz123 - count: 12 - avatarUrl: https://avatars.githubusercontent.com/u/52716203?u=636b4f79645176df4527dd45c12d5dbb5a4193cf&v=4 - url: https://github.com/yezz123 - login: sh0nk count: 12 avatarUrl: https://avatars.githubusercontent.com/u/6478810?u=af15d724875cec682ed8088a86d36b2798f981c0&v=4 @@ -412,6 +412,10 @@ top_reviewers: count: 10 avatarUrl: https://avatars.githubusercontent.com/u/7887703?v=4 url: https://github.com/maoyibo +- login: solomein-sv + count: 10 + avatarUrl: https://avatars.githubusercontent.com/u/46193920?u=46acfb4aeefb1d7b9fdc5a8cbd9eb8744683c47a&v=4 + url: https://github.com/solomein-sv - login: graingert count: 9 avatarUrl: https://avatars.githubusercontent.com/u/413772?v=4 @@ -424,26 +428,26 @@ top_reviewers: count: 9 avatarUrl: https://avatars.githubusercontent.com/u/49435654?v=4 url: https://github.com/kty4119 -- login: zy7y - count: 9 - avatarUrl: https://avatars.githubusercontent.com/u/67154681?u=5d634834cc514028ea3f9115f7030b99a1f4d5a4&v=4 - url: https://github.com/zy7y - login: bezaca count: 9 avatarUrl: https://avatars.githubusercontent.com/u/69092910?u=4ac58eab99bd37d663f3d23551df96d4fbdbf760&v=4 url: https://github.com/bezaca -- login: solomein-sv - count: 9 - avatarUrl: https://avatars.githubusercontent.com/u/46193920?u=46acfb4aeefb1d7b9fdc5a8cbd9eb8744683c47a&v=4 - url: https://github.com/solomein-sv - login: blt232018 count: 8 avatarUrl: https://avatars.githubusercontent.com/u/43393471?u=172b0e0391db1aa6c1706498d6dfcb003c8a4857&v=4 url: https://github.com/blt232018 +- login: rogerbrinkmann + count: 8 + avatarUrl: https://avatars.githubusercontent.com/u/5690226?v=4 + url: https://github.com/rogerbrinkmann - login: ComicShrimp count: 8 avatarUrl: https://avatars.githubusercontent.com/u/43503750?u=b3e4d9a14d9a65d429ce62c566aef73178b7111d&v=4 url: https://github.com/ComicShrimp +- login: dimaqq + count: 8 + avatarUrl: https://avatars.githubusercontent.com/u/662249?v=4 + url: https://github.com/dimaqq - login: Serrones count: 7 avatarUrl: https://avatars.githubusercontent.com/u/22691749?u=4795b880e13ca33a73e52fc0ef7dc9c60c8fce47&v=4 @@ -456,10 +460,6 @@ top_reviewers: count: 7 avatarUrl: https://avatars.githubusercontent.com/u/10202690?u=e6f86f5c0c3026a15d6b51792fa3e532b12f1371&v=4 url: https://github.com/raphaelauv -- login: BilalAlpaslan - count: 7 - avatarUrl: https://avatars.githubusercontent.com/u/47563997?u=63ed66e304fe8d765762c70587d61d9196e5c82d&v=4 - url: https://github.com/BilalAlpaslan - login: NastasiaSaby count: 7 avatarUrl: https://avatars.githubusercontent.com/u/8245071?u=b3afd005f9e4bf080c219ef61a592b3a8004b764&v=4 @@ -472,31 +472,23 @@ top_reviewers: count: 7 avatarUrl: https://avatars.githubusercontent.com/u/34248814?v=4 url: https://github.com/krocdort -- login: dimaqq +- login: NinaHwang count: 7 - avatarUrl: https://avatars.githubusercontent.com/u/662249?v=4 - url: https://github.com/dimaqq + avatarUrl: https://avatars.githubusercontent.com/u/79563565?u=1741703bd6c8f491503354b363a86e879b4c1cab&v=4 + url: https://github.com/NinaHwang - login: jovicon count: 6 avatarUrl: https://avatars.githubusercontent.com/u/21287303?u=b049eac3e51a4c0473c2efe66b4d28a7d8f2b572&v=4 url: https://github.com/jovicon -- login: NinaHwang +- login: LorhanSohaky count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/79563565?u=1741703bd6c8f491503354b363a86e879b4c1cab&v=4 - url: https://github.com/NinaHwang + avatarUrl: https://avatars.githubusercontent.com/u/16273730?u=095b66f243a2cd6a0aadba9a095009f8aaf18393&v=4 + url: https://github.com/LorhanSohaky +- login: peidrao + count: 6 + avatarUrl: https://avatars.githubusercontent.com/u/32584628?u=88c2cb42a99e0f50cdeae3606992568184783ee5&v=4 + url: https://github.com/peidrao - login: diogoduartec count: 5 avatarUrl: https://avatars.githubusercontent.com/u/31852339?u=b50fc11c531e9b77922e19edfc9e7233d4d7b92e&v=4 url: https://github.com/diogoduartec -- login: n25a - count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/49960770?u=eb3c95338741c78fff7d9d5d7ace9617e53eee4a&v=4 - url: https://github.com/n25a -- login: izaguerreiro - count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/2241504?v=4 - url: https://github.com/izaguerreiro -- login: israteneda - count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/20668624?u=d7b2961d330aca65fbce5bdb26a0800a3d23ed2d&v=4 - url: https://github.com/israteneda From d5d6eebd407f689d3bb52121fd05f750fbcb0633 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 17 Mar 2022 20:20:21 +0000 Subject: [PATCH 19/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index bbe6ce221..2a8955a4a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 👥 Update FastAPI People. PR [#4699](https://github.com/tiangolo/fastapi/pull/4699) by [@github-actions[bot]](https://github.com/apps/github-actions). * 🐛 Fix FastAPI People generation to include missing file in commit. PR [#4695](https://github.com/tiangolo/fastapi/pull/4695) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update Classiq sponsor links. PR [#4688](https://github.com/tiangolo/fastapi/pull/4688) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add Classiq sponsor. PR [#4671](https://github.com/tiangolo/fastapi/pull/4671) by [@tiangolo](https://github.com/tiangolo). From aec2d26baca77857777dd25c6ad5121e1685ac31 Mon Sep 17 00:00:00 2001 From: Sarmast Bilawal Khuhro Date: Thu, 17 Mar 2022 21:24:34 +0100 Subject: [PATCH 20/59] =?UTF-8?q?=E2=9C=8F=20Reword=20sentence=20about=20h?= =?UTF-8?q?andling=20errors=20(#1993)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sebastián Ramírez --- docs/en/docs/tutorial/handling-errors.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/en/docs/tutorial/handling-errors.md b/docs/en/docs/tutorial/handling-errors.md index 89f96176d..82e166266 100644 --- a/docs/en/docs/tutorial/handling-errors.md +++ b/docs/en/docs/tutorial/handling-errors.md @@ -252,9 +252,7 @@ from starlette.exceptions import HTTPException as StarletteHTTPException ### Re-use **FastAPI**'s exception handlers -You could also just want to use the exception somehow, but then use the same default exception handlers from **FastAPI**. - -You can import and re-use the default exception handlers from `fastapi.exception_handlers`: +If you want to use the exception along with the same default exception handlers from **FastAPI**, You can import and re-use the default exception handlers from `fastapi.exception_handlers`: ```Python hl_lines="2-5 15 21" {!../../../docs_src/handling_errors/tutorial006.py!} From bab5c201dae5ffcdd9e7452d2cab4cc51acc556e Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 17 Mar 2022 20:25:09 +0000 Subject: [PATCH 21/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 2a8955a4a..c71685fe4 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* ✏ Reword sentence about handling errors. PR [#1993](https://github.com/tiangolo/fastapi/pull/1993) by [@khuhroproeza](https://github.com/khuhroproeza). * 👥 Update FastAPI People. PR [#4699](https://github.com/tiangolo/fastapi/pull/4699) by [@github-actions[bot]](https://github.com/apps/github-actions). * 🐛 Fix FastAPI People generation to include missing file in commit. PR [#4695](https://github.com/tiangolo/fastapi/pull/4695) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update Classiq sponsor links. PR [#4688](https://github.com/tiangolo/fastapi/pull/4688) by [@tiangolo](https://github.com/tiangolo). From 2b6f1585ec8a2084195363d76a0dfeda2d77657e Mon Sep 17 00:00:00 2001 From: Amin Alaee Date: Fri, 18 Mar 2022 17:24:19 +0100 Subject: [PATCH 22/59] =?UTF-8?q?=F0=9F=8C=90=20Start=20Persian/Farsi=20tr?= =?UTF-8?q?anslations=20(#4243)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sebastián Ramírez --- docs/az/mkdocs.yml | 3 + docs/de/mkdocs.yml | 3 + docs/en/mkdocs.yml | 3 + docs/es/mkdocs.yml | 3 + docs/fa/docs/index.md | 468 +++++++++++++++++++++++++++++++++++ docs/fa/mkdocs.yml | 132 ++++++++++ docs/fa/overrides/.gitignore | 0 docs/fr/mkdocs.yml | 3 + docs/id/mkdocs.yml | 3 + docs/it/mkdocs.yml | 3 + docs/ja/mkdocs.yml | 3 + docs/ko/mkdocs.yml | 3 + docs/pl/mkdocs.yml | 3 + docs/pt/mkdocs.yml | 3 + docs/ru/mkdocs.yml | 3 + docs/sq/mkdocs.yml | 3 + docs/tr/mkdocs.yml | 3 + docs/uk/mkdocs.yml | 3 + docs/zh/mkdocs.yml | 3 + 19 files changed, 648 insertions(+) create mode 100644 docs/fa/docs/index.md create mode 100644 docs/fa/mkdocs.yml create mode 100644 docs/fa/overrides/.gitignore diff --git a/docs/az/mkdocs.yml b/docs/az/mkdocs.yml index 66220f63e..06aad80c4 100644 --- a/docs/az/mkdocs.yml +++ b/docs/az/mkdocs.yml @@ -40,6 +40,7 @@ nav: - az: /az/ - de: /de/ - es: /es/ + - fa: /fa/ - fr: /fr/ - id: /id/ - it: /it/ @@ -97,6 +98,8 @@ extra: name: de - link: /es/ name: es - español + - link: /fa/ + name: fa - link: /fr/ name: fr - français - link: /id/ diff --git a/docs/de/mkdocs.yml b/docs/de/mkdocs.yml index 360fa8c4a..80b360028 100644 --- a/docs/de/mkdocs.yml +++ b/docs/de/mkdocs.yml @@ -40,6 +40,7 @@ nav: - az: /az/ - de: /de/ - es: /es/ + - fa: /fa/ - fr: /fr/ - id: /id/ - it: /it/ @@ -98,6 +99,8 @@ extra: name: de - link: /es/ name: es - español + - link: /fa/ + name: fa - link: /fr/ name: fr - français - link: /id/ diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml index e2a779872..12ced5f92 100644 --- a/docs/en/mkdocs.yml +++ b/docs/en/mkdocs.yml @@ -40,6 +40,7 @@ nav: - az: /az/ - de: /de/ - es: /es/ + - fa: /fa/ - fr: /fr/ - id: /id/ - it: /it/ @@ -204,6 +205,8 @@ extra: name: de - link: /es/ name: es - español + - link: /fa/ + name: fa - link: /fr/ name: fr - français - link: /id/ diff --git a/docs/es/mkdocs.yml b/docs/es/mkdocs.yml index a4bc41154..c3b26dcc2 100644 --- a/docs/es/mkdocs.yml +++ b/docs/es/mkdocs.yml @@ -40,6 +40,7 @@ nav: - az: /az/ - de: /de/ - es: /es/ + - fa: /fa/ - fr: /fr/ - id: /id/ - it: /it/ @@ -107,6 +108,8 @@ extra: name: de - link: /es/ name: es - español + - link: /fa/ + name: fa - link: /fr/ name: fr - français - link: /id/ diff --git a/docs/fa/docs/index.md b/docs/fa/docs/index.md new file mode 100644 index 000000000..0070de179 --- /dev/null +++ b/docs/fa/docs/index.md @@ -0,0 +1,468 @@ + +{!../../../docs/missing-translation.md!} + + +

+ FastAPI +

+

+ FastAPI framework, high performance, easy to learn, fast to code, ready for production +

+

+ + Test + + + Coverage + + + Package version + + + Supported Python versions + +

+ +--- + +**Documentation**: https://fastapi.tiangolo.com + +**Source Code**: https://github.com/tiangolo/fastapi + +--- + +FastAPI is a modern, fast (high-performance), web framework for building APIs with Python 3.6+ based on standard Python type hints. + +The key features are: + +* **Fast**: Very high performance, on par with **NodeJS** and **Go** (thanks to Starlette and Pydantic). [One of the fastest Python frameworks available](#performance). + +* **Fast to code**: Increase the speed to develop features by about 200% to 300%. * +* **Fewer bugs**: Reduce about 40% of human (developer) induced errors. * +* **Intuitive**: Great editor support. Completion everywhere. Less time debugging. +* **Easy**: Designed to be easy to use and learn. Less time reading docs. +* **Short**: Minimize code duplication. Multiple features from each parameter declaration. Fewer bugs. +* **Robust**: Get production-ready code. With automatic interactive documentation. +* **Standards-based**: Based on (and fully compatible with) the open standards for APIs: OpenAPI (previously known as Swagger) and JSON Schema. + +* estimation based on tests on an internal development team, building production applications. + +## Sponsors + + + +{% if sponsors %} +{% for sponsor in sponsors.gold -%} + +{% endfor -%} +{%- for sponsor in sponsors.silver -%} + +{% endfor %} +{% endif %} + + + +Other sponsors + +## Opinions + +"_[...] I'm using **FastAPI** a ton these days. [...] I'm actually planning to use it for all of my team's **ML services at Microsoft**. Some of them are getting integrated into the core **Windows** product and some **Office** products._" + +
Kabir Khan - Microsoft (ref)
+ +--- + +"_We adopted the **FastAPI** library to spawn a **REST** server that can be queried to obtain **predictions**. [for Ludwig]_" + +
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
+ +--- + +"_**Netflix** is pleased to announce the open-source release of our **crisis management** orchestration framework: **Dispatch**! [built with **FastAPI**]_" + +
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
+ +--- + +"_I’m over the moon excited about **FastAPI**. It’s so fun!_" + +
Brian Okken - Python Bytes podcast host (ref)
+ +--- + +"_Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted **Hug** to be - it's really inspiring to see someone build that._" + +
Timothy Crosley - Hug creator (ref)
+ +--- + +"_If you're looking to learn one **modern framework** for building REST APIs, check out **FastAPI** [...] It's fast, easy to use and easy to learn [...]_" + +"_We've switched over to **FastAPI** for our **APIs** [...] I think you'll like it [...]_" + +
Ines Montani - Matthew Honnibal - Explosion AI founders - spaCy creators (ref) - (ref)
+ +--- + +## **Typer**, the FastAPI of CLIs + + + +If you are building a CLI app to be used in the terminal instead of a web API, check out **Typer**. + +**Typer** is FastAPI's little sibling. And it's intended to be the **FastAPI of CLIs**. ⌨️ 🚀 + +## Requirements + +Python 3.6+ + +FastAPI stands on the shoulders of giants: + +* Starlette for the web parts. +* Pydantic for the data parts. + +## Installation + +
+ +```console +$ pip install fastapi + +---> 100% +``` + +
+ +You will also need an ASGI server, for production such as Uvicorn or Hypercorn. + +
+ +```console +$ pip install "uvicorn[standard]" + +---> 100% +``` + +
+ +## Example + +### Create it + +* Create a file `main.py` with: + +```Python +from typing import Optional + +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: Optional[str] = None): + return {"item_id": item_id, "q": q} +``` + +
+Or use async def... + +If your code uses `async` / `await`, use `async def`: + +```Python hl_lines="9 14" +from typing import Optional + +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +async def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +async def read_item(item_id: int, q: Optional[str] = None): + return {"item_id": item_id, "q": q} +``` + +**Note**: + +If you don't know, check the _"In a hurry?"_ section about `async` and `await` in the docs. + +
+ +### Run it + +Run the server with: + +
+ +```console +$ uvicorn main:app --reload + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +INFO: Started reloader process [28720] +INFO: Started server process [28722] +INFO: Waiting for application startup. +INFO: Application startup complete. +``` + +
+ +
+About the command uvicorn main:app --reload... + +The command `uvicorn main:app` refers to: + +* `main`: the file `main.py` (the Python "module"). +* `app`: the object created inside of `main.py` with the line `app = FastAPI()`. +* `--reload`: make the server restart after code changes. Only do this for development. + +
+ +### Check it + +Open your browser at http://127.0.0.1:8000/items/5?q=somequery. + +You will see the JSON response as: + +```JSON +{"item_id": 5, "q": "somequery"} +``` + +You already created an API that: + +* Receives HTTP requests in the _paths_ `/` and `/items/{item_id}`. +* Both _paths_ take `GET` operations (also known as HTTP _methods_). +* The _path_ `/items/{item_id}` has a _path parameter_ `item_id` that should be an `int`. +* The _path_ `/items/{item_id}` has an optional `str` _query parameter_ `q`. + +### Interactive API docs + +Now go to http://127.0.0.1:8000/docs. + +You will see the automatic interactive API documentation (provided by Swagger UI): + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) + +### Alternative API docs + +And now, go to http://127.0.0.1:8000/redoc. + +You will see the alternative automatic documentation (provided by ReDoc): + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) + +## Example upgrade + +Now modify the file `main.py` to receive a body from a `PUT` request. + +Declare the body using standard Python types, thanks to Pydantic. + +```Python hl_lines="4 9-12 25-27" +from typing import Optional + +from fastapi import FastAPI +from pydantic import BaseModel + +app = FastAPI() + + +class Item(BaseModel): + name: str + price: float + is_offer: Optional[bool] = None + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: Optional[str] = None): + return {"item_id": item_id, "q": q} + + +@app.put("/items/{item_id}") +def update_item(item_id: int, item: Item): + return {"item_name": item.name, "item_id": item_id} +``` + +The server should reload automatically (because you added `--reload` to the `uvicorn` command above). + +### Interactive API docs upgrade + +Now go to http://127.0.0.1:8000/docs. + +* The interactive API documentation will be automatically updated, including the new body: + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) + +* Click on the button "Try it out", it allows you to fill the parameters and directly interact with the API: + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) + +* Then click on the "Execute" button, the user interface will communicate with your API, send the parameters, get the results and show them on the screen: + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) + +### Alternative API docs upgrade + +And now, go to http://127.0.0.1:8000/redoc. + +* The alternative documentation will also reflect the new query parameter and body: + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) + +### Recap + +In summary, you declare **once** the types of parameters, body, etc. as function parameters. + +You do that with standard modern Python types. + +You don't have to learn a new syntax, the methods or classes of a specific library, etc. + +Just standard **Python 3.6+**. + +For example, for an `int`: + +```Python +item_id: int +``` + +or for a more complex `Item` model: + +```Python +item: Item +``` + +...and with that single declaration you get: + +* Editor support, including: + * Completion. + * Type checks. +* Validation of data: + * Automatic and clear errors when the data is invalid. + * Validation even for deeply nested JSON objects. +* Conversion of input data: coming from the network to Python data and types. Reading from: + * JSON. + * Path parameters. + * Query parameters. + * Cookies. + * Headers. + * Forms. + * Files. +* Conversion of output data: converting from Python data and types to network data (as JSON): + * Convert Python types (`str`, `int`, `float`, `bool`, `list`, etc). + * `datetime` objects. + * `UUID` objects. + * Database models. + * ...and many more. +* Automatic interactive API documentation, including 2 alternative user interfaces: + * Swagger UI. + * ReDoc. + +--- + +Coming back to the previous code example, **FastAPI** will: + +* Validate that there is an `item_id` in the path for `GET` and `PUT` requests. +* Validate that the `item_id` is of type `int` for `GET` and `PUT` requests. + * If it is not, the client will see a useful, clear error. +* Check if there is an optional query parameter named `q` (as in `http://127.0.0.1:8000/items/foo?q=somequery`) for `GET` requests. + * As the `q` parameter is declared with `= None`, it is optional. + * Without the `None` it would be required (as is the body in the case with `PUT`). +* For `PUT` requests to `/items/{item_id}`, Read the body as JSON: + * Check that it has a required attribute `name` that should be a `str`. + * Check that it has a required attribute `price` that has to be a `float`. + * Check that it has an optional attribute `is_offer`, that should be a `bool`, if present. + * All this would also work for deeply nested JSON objects. +* Convert from and to JSON automatically. +* Document everything with OpenAPI, that can be used by: + * Interactive documentation systems. + * Automatic client code generation systems, for many languages. +* Provide 2 interactive documentation web interfaces directly. + +--- + +We just scratched the surface, but you already get the idea of how it all works. + +Try changing the line with: + +```Python + return {"item_name": item.name, "item_id": item_id} +``` + +...from: + +```Python + ... "item_name": item.name ... +``` + +...to: + +```Python + ... "item_price": item.price ... +``` + +...and see how your editor will auto-complete the attributes and know their types: + +![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) + +For a more complete example including more features, see the Tutorial - User Guide. + +**Spoiler alert**: the tutorial - user guide includes: + +* Declaration of **parameters** from other different places as: **headers**, **cookies**, **form fields** and **files**. +* How to set **validation constraints** as `maximum_length` or `regex`. +* A very powerful and easy to use **Dependency Injection** system. +* Security and authentication, including support for **OAuth2** with **JWT tokens** and **HTTP Basic** auth. +* More advanced (but equally easy) techniques for declaring **deeply nested JSON models** (thanks to Pydantic). +* **GraphQL** integration with Strawberry and other libraries. +* Many extra features (thanks to Starlette) as: + * **WebSockets** + * extremely easy tests based on `requests` and `pytest` + * **CORS** + * **Cookie Sessions** + * ...and more. + +## Performance + +Independent TechEmpower benchmarks show **FastAPI** applications running under Uvicorn as one of the fastest Python frameworks available, only below Starlette and Uvicorn themselves (used internally by FastAPI). (*) + +To understand more about it, see the section Benchmarks. + +## Optional Dependencies + +Used by Pydantic: + +* ujson - for faster JSON "parsing". +* email_validator - for email validation. + +Used by Starlette: + +* requests - Required if you want to use the `TestClient`. +* jinja2 - Required if you want to use the default template configuration. +* python-multipart - Required if you want to support form "parsing", with `request.form()`. +* itsdangerous - Required for `SessionMiddleware` support. +* pyyaml - Required for Starlette's `SchemaGenerator` support (you probably don't need it with FastAPI). +* ujson - Required if you want to use `UJSONResponse`. + +Used by FastAPI / Starlette: + +* uvicorn - for the server that loads and serves your application. +* orjson - Required if you want to use `ORJSONResponse`. + +You can install all of these with `pip install "fastapi[all]"`. + +## License + +This project is licensed under the terms of the MIT license. diff --git a/docs/fa/mkdocs.yml b/docs/fa/mkdocs.yml new file mode 100644 index 000000000..83cf81e22 --- /dev/null +++ b/docs/fa/mkdocs.yml @@ -0,0 +1,132 @@ +site_name: FastAPI +site_description: FastAPI framework, high performance, easy to learn, fast to code, ready for production +site_url: https://fastapi.tiangolo.com/fa/ +theme: + name: material + custom_dir: overrides + palette: + - scheme: default + primary: teal + accent: amber + toggle: + icon: material/lightbulb + name: Switch to light mode + - scheme: slate + primary: teal + accent: amber + toggle: + icon: material/lightbulb-outline + name: Switch to dark mode + features: + - search.suggest + - search.highlight + - content.tabs.link + icon: + repo: fontawesome/brands/github-alt + logo: https://fastapi.tiangolo.com/img/icon-white.svg + favicon: https://fastapi.tiangolo.com/img/favicon.png + language: fa +repo_name: tiangolo/fastapi +repo_url: https://github.com/tiangolo/fastapi +edit_uri: '' +google_analytics: +- UA-133183413-1 +- auto +plugins: +- search +- markdownextradata: + data: data +nav: +- FastAPI: index.md +- Languages: + - en: / + - az: /az/ + - de: /de/ + - es: /es/ + - fa: /fa/ + - fr: /fr/ + - id: /id/ + - it: /it/ + - ja: /ja/ + - ko: /ko/ + - pl: /pl/ + - pt: /pt/ + - ru: /ru/ + - sq: /sq/ + - tr: /tr/ + - uk: /uk/ + - zh: /zh/ +markdown_extensions: +- toc: + permalink: true +- markdown.extensions.codehilite: + guess_lang: false +- mdx_include: + base_path: docs +- admonition +- codehilite +- extra +- pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format '' +- pymdownx.tabbed +extra: + social: + - icon: fontawesome/brands/github-alt + link: https://github.com/tiangolo/fastapi + - icon: fontawesome/brands/discord + link: https://discord.gg/VQjSZaeJmf + - icon: fontawesome/brands/twitter + link: https://twitter.com/fastapi + - icon: fontawesome/brands/linkedin + link: https://www.linkedin.com/in/tiangolo + - icon: fontawesome/brands/dev + link: https://dev.to/tiangolo + - icon: fontawesome/brands/medium + link: https://medium.com/@tiangolo + - icon: fontawesome/solid/globe + link: https://tiangolo.com + alternate: + - link: / + name: en - English + - link: /az/ + name: az + - link: /de/ + name: de + - link: /es/ + name: es - español + - link: /fa/ + name: fa + - link: /fr/ + name: fr - français + - link: /id/ + name: id + - link: /it/ + name: it - italiano + - link: /ja/ + name: ja - 日本語 + - link: /ko/ + name: ko - 한국어 + - link: /pl/ + name: pl + - link: /pt/ + name: pt - português + - link: /ru/ + name: ru - русский язык + - link: /sq/ + name: sq - shqip + - link: /tr/ + name: tr - Türkçe + - link: /uk/ + name: uk - українська мова + - link: /zh/ + name: zh - 汉语 +extra_css: +- https://fastapi.tiangolo.com/css/termynal.css +- https://fastapi.tiangolo.com/css/custom.css +- https://fastapi.tiangolo.com/css/rtl.css +extra_javascript: +- https://fastapi.tiangolo.com/js/termynal.js +- https://fastapi.tiangolo.com/js/custom.js diff --git a/docs/fa/overrides/.gitignore b/docs/fa/overrides/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/docs/fr/mkdocs.yml b/docs/fr/mkdocs.yml index ff16e1d78..b14764c66 100644 --- a/docs/fr/mkdocs.yml +++ b/docs/fr/mkdocs.yml @@ -40,6 +40,7 @@ nav: - az: /az/ - de: /de/ - es: /es/ + - fa: /fa/ - fr: /fr/ - id: /id/ - it: /it/ @@ -112,6 +113,8 @@ extra: name: de - link: /es/ name: es - español + - link: /fa/ + name: fa - link: /fr/ name: fr - français - link: /id/ diff --git a/docs/id/mkdocs.yml b/docs/id/mkdocs.yml index d70d2b3c3..e40218422 100644 --- a/docs/id/mkdocs.yml +++ b/docs/id/mkdocs.yml @@ -40,6 +40,7 @@ nav: - az: /az/ - de: /de/ - es: /es/ + - fa: /fa/ - fr: /fr/ - id: /id/ - it: /it/ @@ -97,6 +98,8 @@ extra: name: de - link: /es/ name: es - español + - link: /fa/ + name: fa - link: /fr/ name: fr - français - link: /id/ diff --git a/docs/it/mkdocs.yml b/docs/it/mkdocs.yml index e6d01fbde..da1ac00b7 100644 --- a/docs/it/mkdocs.yml +++ b/docs/it/mkdocs.yml @@ -40,6 +40,7 @@ nav: - az: /az/ - de: /de/ - es: /es/ + - fa: /fa/ - fr: /fr/ - id: /id/ - it: /it/ @@ -97,6 +98,8 @@ extra: name: de - link: /es/ name: es - español + - link: /fa/ + name: fa - link: /fr/ name: fr - français - link: /id/ diff --git a/docs/ja/mkdocs.yml b/docs/ja/mkdocs.yml index 39fd8a211..832078186 100644 --- a/docs/ja/mkdocs.yml +++ b/docs/ja/mkdocs.yml @@ -40,6 +40,7 @@ nav: - az: /az/ - de: /de/ - es: /es/ + - fa: /fa/ - fr: /fr/ - id: /id/ - it: /it/ @@ -137,6 +138,8 @@ extra: name: de - link: /es/ name: es - español + - link: /fa/ + name: fa - link: /fr/ name: fr - français - link: /id/ diff --git a/docs/ko/mkdocs.yml b/docs/ko/mkdocs.yml index 1d4d30913..8b7cb9c06 100644 --- a/docs/ko/mkdocs.yml +++ b/docs/ko/mkdocs.yml @@ -40,6 +40,7 @@ nav: - az: /az/ - de: /de/ - es: /es/ + - fa: /fa/ - fr: /fr/ - id: /id/ - it: /it/ @@ -107,6 +108,8 @@ extra: name: de - link: /es/ name: es - español + - link: /fa/ + name: fa - link: /fr/ name: fr - français - link: /id/ diff --git a/docs/pl/mkdocs.yml b/docs/pl/mkdocs.yml index 3c1351a12..da68165c7 100644 --- a/docs/pl/mkdocs.yml +++ b/docs/pl/mkdocs.yml @@ -40,6 +40,7 @@ nav: - az: /az/ - de: /de/ - es: /es/ + - fa: /fa/ - fr: /fr/ - id: /id/ - it: /it/ @@ -97,6 +98,8 @@ extra: name: de - link: /es/ name: es - español + - link: /fa/ + name: fa - link: /fr/ name: fr - français - link: /id/ diff --git a/docs/pt/mkdocs.yml b/docs/pt/mkdocs.yml index f202f306d..522b3c86a 100644 --- a/docs/pt/mkdocs.yml +++ b/docs/pt/mkdocs.yml @@ -40,6 +40,7 @@ nav: - az: /az/ - de: /de/ - es: /es/ + - fa: /fa/ - fr: /fr/ - id: /id/ - it: /it/ @@ -117,6 +118,8 @@ extra: name: de - link: /es/ name: es - español + - link: /fa/ + name: fa - link: /fr/ name: fr - français - link: /id/ diff --git a/docs/ru/mkdocs.yml b/docs/ru/mkdocs.yml index 6e17c287e..643f0aa70 100644 --- a/docs/ru/mkdocs.yml +++ b/docs/ru/mkdocs.yml @@ -40,6 +40,7 @@ nav: - az: /az/ - de: /de/ - es: /es/ + - fa: /fa/ - fr: /fr/ - id: /id/ - it: /it/ @@ -97,6 +98,8 @@ extra: name: de - link: /es/ name: es - español + - link: /fa/ + name: fa - link: /fr/ name: fr - français - link: /id/ diff --git a/docs/sq/mkdocs.yml b/docs/sq/mkdocs.yml index d9c3dad4c..e4a1724c3 100644 --- a/docs/sq/mkdocs.yml +++ b/docs/sq/mkdocs.yml @@ -40,6 +40,7 @@ nav: - az: /az/ - de: /de/ - es: /es/ + - fa: /fa/ - fr: /fr/ - id: /id/ - it: /it/ @@ -97,6 +98,8 @@ extra: name: de - link: /es/ name: es - español + - link: /fa/ + name: fa - link: /fr/ name: fr - français - link: /id/ diff --git a/docs/tr/mkdocs.yml b/docs/tr/mkdocs.yml index f6ed7f5b9..041c11b97 100644 --- a/docs/tr/mkdocs.yml +++ b/docs/tr/mkdocs.yml @@ -40,6 +40,7 @@ nav: - az: /az/ - de: /de/ - es: /es/ + - fa: /fa/ - fr: /fr/ - id: /id/ - it: /it/ @@ -100,6 +101,8 @@ extra: name: de - link: /es/ name: es - español + - link: /fa/ + name: fa - link: /fr/ name: fr - français - link: /id/ diff --git a/docs/uk/mkdocs.yml b/docs/uk/mkdocs.yml index d0de8cc0e..2d704b989 100644 --- a/docs/uk/mkdocs.yml +++ b/docs/uk/mkdocs.yml @@ -40,6 +40,7 @@ nav: - az: /az/ - de: /de/ - es: /es/ + - fa: /fa/ - fr: /fr/ - id: /id/ - it: /it/ @@ -97,6 +98,8 @@ extra: name: de - link: /es/ name: es - español + - link: /fa/ + name: fa - link: /fr/ name: fr - français - link: /id/ diff --git a/docs/zh/mkdocs.yml b/docs/zh/mkdocs.yml index 1d050fddd..f424b117b 100644 --- a/docs/zh/mkdocs.yml +++ b/docs/zh/mkdocs.yml @@ -40,6 +40,7 @@ nav: - az: /az/ - de: /de/ - es: /es/ + - fa: /fa/ - fr: /fr/ - id: /id/ - it: /it/ @@ -148,6 +149,8 @@ extra: name: de - link: /es/ name: es - español + - link: /fa/ + name: fa - link: /fr/ name: fr - français - link: /id/ From bd94d313c910e505b00a2338505272992de1769a Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 18 Mar 2022 16:24:54 +0000 Subject: [PATCH 23/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index c71685fe4..d71a1d094 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 🌐 Start Persian/Farsi translations. PR [#4243](https://github.com/tiangolo/fastapi/pull/4243) by [@aminalaee](https://github.com/aminalaee). * ✏ Reword sentence about handling errors. PR [#1993](https://github.com/tiangolo/fastapi/pull/1993) by [@khuhroproeza](https://github.com/khuhroproeza). * 👥 Update FastAPI People. PR [#4699](https://github.com/tiangolo/fastapi/pull/4699) by [@github-actions[bot]](https://github.com/apps/github-actions). * 🐛 Fix FastAPI People generation to include missing file in commit. PR [#4695](https://github.com/tiangolo/fastapi/pull/4695) by [@tiangolo](https://github.com/tiangolo). From d820267cde66b3f4e42f509a03e8ffb464d443bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Fri, 18 Mar 2022 11:37:14 -0500 Subject: [PATCH 24/59] =?UTF-8?q?=F0=9F=94=A7=20Add=20configuration=20to?= =?UTF-8?q?=20notify=20Dutch=20translations=20(#4702)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/actions/notify-translations/app/translations.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/actions/notify-translations/app/translations.yml b/.github/actions/notify-translations/app/translations.yml index decd63498..f0bccd470 100644 --- a/.github/actions/notify-translations/app/translations.yml +++ b/.github/actions/notify-translations/app/translations.yml @@ -13,3 +13,4 @@ pl: 3169 de: 3716 id: 3717 az: 3994 +nl: 4701 From fc96370ce30b7646fbb0637e7bae57f5caff6900 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 18 Mar 2022 16:37:49 +0000 Subject: [PATCH 25/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index d71a1d094..da1cd5c32 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 🔧 Add configuration to notify Dutch translations. PR [#4702](https://github.com/tiangolo/fastapi/pull/4702) by [@tiangolo](https://github.com/tiangolo). * 🌐 Start Persian/Farsi translations. PR [#4243](https://github.com/tiangolo/fastapi/pull/4243) by [@aminalaee](https://github.com/aminalaee). * ✏ Reword sentence about handling errors. PR [#1993](https://github.com/tiangolo/fastapi/pull/1993) by [@khuhroproeza](https://github.com/khuhroproeza). * 👥 Update FastAPI People. PR [#4699](https://github.com/tiangolo/fastapi/pull/4699) by [@github-actions[bot]](https://github.com/apps/github-actions). From 5c842586c239e565d44a5f0e0a0e48fb88303925 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Fri, 18 Mar 2022 11:47:54 -0500 Subject: [PATCH 26/59] =?UTF-8?q?=F0=9F=8C=90=20Start=20Dutch=20translatio?= =?UTF-8?q?ns=20(#4703)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/az/mkdocs.yml | 3 + docs/de/mkdocs.yml | 3 + docs/en/mkdocs.yml | 3 + docs/es/mkdocs.yml | 3 + docs/fa/mkdocs.yml | 13 +- docs/fr/mkdocs.yml | 3 + docs/id/mkdocs.yml | 3 + docs/it/mkdocs.yml | 3 + docs/ja/mkdocs.yml | 3 + docs/ko/mkdocs.yml | 3 + docs/nl/docs/index.md | 468 +++++++++++++++++++++++++++++++++++ docs/nl/mkdocs.yml | 135 ++++++++++ docs/nl/overrides/.gitignore | 0 docs/pl/mkdocs.yml | 3 + docs/pt/mkdocs.yml | 3 + docs/ru/mkdocs.yml | 3 + docs/sq/mkdocs.yml | 3 + docs/tr/mkdocs.yml | 3 + docs/uk/mkdocs.yml | 3 + docs/zh/mkdocs.yml | 3 + 20 files changed, 659 insertions(+), 5 deletions(-) create mode 100644 docs/nl/docs/index.md create mode 100644 docs/nl/mkdocs.yml create mode 100644 docs/nl/overrides/.gitignore diff --git a/docs/az/mkdocs.yml b/docs/az/mkdocs.yml index 06aad80c4..58bbb0758 100644 --- a/docs/az/mkdocs.yml +++ b/docs/az/mkdocs.yml @@ -46,6 +46,7 @@ nav: - it: /it/ - ja: /ja/ - ko: /ko/ + - nl: /nl/ - pl: /pl/ - pt: /pt/ - ru: /ru/ @@ -110,6 +111,8 @@ extra: name: ja - 日本語 - link: /ko/ name: ko - 한국어 + - link: /nl/ + name: nl - link: /pl/ name: pl - link: /pt/ diff --git a/docs/de/mkdocs.yml b/docs/de/mkdocs.yml index 80b360028..1242af504 100644 --- a/docs/de/mkdocs.yml +++ b/docs/de/mkdocs.yml @@ -46,6 +46,7 @@ nav: - it: /it/ - ja: /ja/ - ko: /ko/ + - nl: /nl/ - pl: /pl/ - pt: /pt/ - ru: /ru/ @@ -111,6 +112,8 @@ extra: name: ja - 日本語 - link: /ko/ name: ko - 한국어 + - link: /nl/ + name: nl - link: /pl/ name: pl - link: /pt/ diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml index 12ced5f92..e7aa40def 100644 --- a/docs/en/mkdocs.yml +++ b/docs/en/mkdocs.yml @@ -46,6 +46,7 @@ nav: - it: /it/ - ja: /ja/ - ko: /ko/ + - nl: /nl/ - pl: /pl/ - pt: /pt/ - ru: /ru/ @@ -217,6 +218,8 @@ extra: name: ja - 日本語 - link: /ko/ name: ko - 한국어 + - link: /nl/ + name: nl - link: /pl/ name: pl - link: /pt/ diff --git a/docs/es/mkdocs.yml b/docs/es/mkdocs.yml index c3b26dcc2..eb7538cf4 100644 --- a/docs/es/mkdocs.yml +++ b/docs/es/mkdocs.yml @@ -46,6 +46,7 @@ nav: - it: /it/ - ja: /ja/ - ko: /ko/ + - nl: /nl/ - pl: /pl/ - pt: /pt/ - ru: /ru/ @@ -120,6 +121,8 @@ extra: name: ja - 日本語 - link: /ko/ name: ko - 한국어 + - link: /nl/ + name: nl - link: /pl/ name: pl - link: /pt/ diff --git a/docs/fa/mkdocs.yml b/docs/fa/mkdocs.yml index 83cf81e22..6fb3891b7 100644 --- a/docs/fa/mkdocs.yml +++ b/docs/fa/mkdocs.yml @@ -29,9 +29,6 @@ theme: repo_name: tiangolo/fastapi repo_url: https://github.com/tiangolo/fastapi edit_uri: '' -google_analytics: -- UA-133183413-1 -- auto plugins: - search - markdownextradata: @@ -49,6 +46,7 @@ nav: - it: /it/ - ja: /ja/ - ko: /ko/ + - nl: /nl/ - pl: /pl/ - pt: /pt/ - ru: /ru/ @@ -71,8 +69,12 @@ markdown_extensions: - name: mermaid class: mermaid format: !!python/name:pymdownx.superfences.fence_code_format '' -- pymdownx.tabbed +- pymdownx.tabbed: + alternate_style: true extra: + analytics: + provider: google + property: UA-133183413-1 social: - icon: fontawesome/brands/github-alt link: https://github.com/tiangolo/fastapi @@ -109,6 +111,8 @@ extra: name: ja - 日本語 - link: /ko/ name: ko - 한국어 + - link: /nl/ + name: nl - link: /pl/ name: pl - link: /pt/ @@ -126,7 +130,6 @@ extra: extra_css: - https://fastapi.tiangolo.com/css/termynal.css - https://fastapi.tiangolo.com/css/custom.css -- https://fastapi.tiangolo.com/css/rtl.css extra_javascript: - https://fastapi.tiangolo.com/js/termynal.js - https://fastapi.tiangolo.com/js/custom.js diff --git a/docs/fr/mkdocs.yml b/docs/fr/mkdocs.yml index b14764c66..d2681f8d5 100644 --- a/docs/fr/mkdocs.yml +++ b/docs/fr/mkdocs.yml @@ -46,6 +46,7 @@ nav: - it: /it/ - ja: /ja/ - ko: /ko/ + - nl: /nl/ - pl: /pl/ - pt: /pt/ - ru: /ru/ @@ -125,6 +126,8 @@ extra: name: ja - 日本語 - link: /ko/ name: ko - 한국어 + - link: /nl/ + name: nl - link: /pl/ name: pl - link: /pt/ diff --git a/docs/id/mkdocs.yml b/docs/id/mkdocs.yml index e40218422..0c60fecd9 100644 --- a/docs/id/mkdocs.yml +++ b/docs/id/mkdocs.yml @@ -46,6 +46,7 @@ nav: - it: /it/ - ja: /ja/ - ko: /ko/ + - nl: /nl/ - pl: /pl/ - pt: /pt/ - ru: /ru/ @@ -110,6 +111,8 @@ extra: name: ja - 日本語 - link: /ko/ name: ko - 한국어 + - link: /nl/ + name: nl - link: /pl/ name: pl - link: /pt/ diff --git a/docs/it/mkdocs.yml b/docs/it/mkdocs.yml index da1ac00b7..3bf3d7396 100644 --- a/docs/it/mkdocs.yml +++ b/docs/it/mkdocs.yml @@ -46,6 +46,7 @@ nav: - it: /it/ - ja: /ja/ - ko: /ko/ + - nl: /nl/ - pl: /pl/ - pt: /pt/ - ru: /ru/ @@ -110,6 +111,8 @@ extra: name: ja - 日本語 - link: /ko/ name: ko - 한국어 + - link: /nl/ + name: nl - link: /pl/ name: pl - link: /pt/ diff --git a/docs/ja/mkdocs.yml b/docs/ja/mkdocs.yml index 832078186..f972eb0ff 100644 --- a/docs/ja/mkdocs.yml +++ b/docs/ja/mkdocs.yml @@ -46,6 +46,7 @@ nav: - it: /it/ - ja: /ja/ - ko: /ko/ + - nl: /nl/ - pl: /pl/ - pt: /pt/ - ru: /ru/ @@ -150,6 +151,8 @@ extra: name: ja - 日本語 - link: /ko/ name: ko - 한국어 + - link: /nl/ + name: nl - link: /pl/ name: pl - link: /pt/ diff --git a/docs/ko/mkdocs.yml b/docs/ko/mkdocs.yml index 8b7cb9c06..1e7d60dbd 100644 --- a/docs/ko/mkdocs.yml +++ b/docs/ko/mkdocs.yml @@ -46,6 +46,7 @@ nav: - it: /it/ - ja: /ja/ - ko: /ko/ + - nl: /nl/ - pl: /pl/ - pt: /pt/ - ru: /ru/ @@ -120,6 +121,8 @@ extra: name: ja - 日本語 - link: /ko/ name: ko - 한국어 + - link: /nl/ + name: nl - link: /pl/ name: pl - link: /pt/ diff --git a/docs/nl/docs/index.md b/docs/nl/docs/index.md new file mode 100644 index 000000000..0070de179 --- /dev/null +++ b/docs/nl/docs/index.md @@ -0,0 +1,468 @@ + +{!../../../docs/missing-translation.md!} + + +

+ FastAPI +

+

+ FastAPI framework, high performance, easy to learn, fast to code, ready for production +

+

+ + Test + + + Coverage + + + Package version + + + Supported Python versions + +

+ +--- + +**Documentation**: https://fastapi.tiangolo.com + +**Source Code**: https://github.com/tiangolo/fastapi + +--- + +FastAPI is a modern, fast (high-performance), web framework for building APIs with Python 3.6+ based on standard Python type hints. + +The key features are: + +* **Fast**: Very high performance, on par with **NodeJS** and **Go** (thanks to Starlette and Pydantic). [One of the fastest Python frameworks available](#performance). + +* **Fast to code**: Increase the speed to develop features by about 200% to 300%. * +* **Fewer bugs**: Reduce about 40% of human (developer) induced errors. * +* **Intuitive**: Great editor support. Completion everywhere. Less time debugging. +* **Easy**: Designed to be easy to use and learn. Less time reading docs. +* **Short**: Minimize code duplication. Multiple features from each parameter declaration. Fewer bugs. +* **Robust**: Get production-ready code. With automatic interactive documentation. +* **Standards-based**: Based on (and fully compatible with) the open standards for APIs: OpenAPI (previously known as Swagger) and JSON Schema. + +* estimation based on tests on an internal development team, building production applications. + +## Sponsors + + + +{% if sponsors %} +{% for sponsor in sponsors.gold -%} + +{% endfor -%} +{%- for sponsor in sponsors.silver -%} + +{% endfor %} +{% endif %} + + + +Other sponsors + +## Opinions + +"_[...] I'm using **FastAPI** a ton these days. [...] I'm actually planning to use it for all of my team's **ML services at Microsoft**. Some of them are getting integrated into the core **Windows** product and some **Office** products._" + +
Kabir Khan - Microsoft (ref)
+ +--- + +"_We adopted the **FastAPI** library to spawn a **REST** server that can be queried to obtain **predictions**. [for Ludwig]_" + +
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
+ +--- + +"_**Netflix** is pleased to announce the open-source release of our **crisis management** orchestration framework: **Dispatch**! [built with **FastAPI**]_" + +
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
+ +--- + +"_I’m over the moon excited about **FastAPI**. It’s so fun!_" + +
Brian Okken - Python Bytes podcast host (ref)
+ +--- + +"_Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted **Hug** to be - it's really inspiring to see someone build that._" + +
Timothy Crosley - Hug creator (ref)
+ +--- + +"_If you're looking to learn one **modern framework** for building REST APIs, check out **FastAPI** [...] It's fast, easy to use and easy to learn [...]_" + +"_We've switched over to **FastAPI** for our **APIs** [...] I think you'll like it [...]_" + +
Ines Montani - Matthew Honnibal - Explosion AI founders - spaCy creators (ref) - (ref)
+ +--- + +## **Typer**, the FastAPI of CLIs + + + +If you are building a CLI app to be used in the terminal instead of a web API, check out **Typer**. + +**Typer** is FastAPI's little sibling. And it's intended to be the **FastAPI of CLIs**. ⌨️ 🚀 + +## Requirements + +Python 3.6+ + +FastAPI stands on the shoulders of giants: + +* Starlette for the web parts. +* Pydantic for the data parts. + +## Installation + +
+ +```console +$ pip install fastapi + +---> 100% +``` + +
+ +You will also need an ASGI server, for production such as Uvicorn or Hypercorn. + +
+ +```console +$ pip install "uvicorn[standard]" + +---> 100% +``` + +
+ +## Example + +### Create it + +* Create a file `main.py` with: + +```Python +from typing import Optional + +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: Optional[str] = None): + return {"item_id": item_id, "q": q} +``` + +
+Or use async def... + +If your code uses `async` / `await`, use `async def`: + +```Python hl_lines="9 14" +from typing import Optional + +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +async def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +async def read_item(item_id: int, q: Optional[str] = None): + return {"item_id": item_id, "q": q} +``` + +**Note**: + +If you don't know, check the _"In a hurry?"_ section about `async` and `await` in the docs. + +
+ +### Run it + +Run the server with: + +
+ +```console +$ uvicorn main:app --reload + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +INFO: Started reloader process [28720] +INFO: Started server process [28722] +INFO: Waiting for application startup. +INFO: Application startup complete. +``` + +
+ +
+About the command uvicorn main:app --reload... + +The command `uvicorn main:app` refers to: + +* `main`: the file `main.py` (the Python "module"). +* `app`: the object created inside of `main.py` with the line `app = FastAPI()`. +* `--reload`: make the server restart after code changes. Only do this for development. + +
+ +### Check it + +Open your browser at http://127.0.0.1:8000/items/5?q=somequery. + +You will see the JSON response as: + +```JSON +{"item_id": 5, "q": "somequery"} +``` + +You already created an API that: + +* Receives HTTP requests in the _paths_ `/` and `/items/{item_id}`. +* Both _paths_ take `GET` operations (also known as HTTP _methods_). +* The _path_ `/items/{item_id}` has a _path parameter_ `item_id` that should be an `int`. +* The _path_ `/items/{item_id}` has an optional `str` _query parameter_ `q`. + +### Interactive API docs + +Now go to http://127.0.0.1:8000/docs. + +You will see the automatic interactive API documentation (provided by Swagger UI): + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) + +### Alternative API docs + +And now, go to http://127.0.0.1:8000/redoc. + +You will see the alternative automatic documentation (provided by ReDoc): + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) + +## Example upgrade + +Now modify the file `main.py` to receive a body from a `PUT` request. + +Declare the body using standard Python types, thanks to Pydantic. + +```Python hl_lines="4 9-12 25-27" +from typing import Optional + +from fastapi import FastAPI +from pydantic import BaseModel + +app = FastAPI() + + +class Item(BaseModel): + name: str + price: float + is_offer: Optional[bool] = None + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: Optional[str] = None): + return {"item_id": item_id, "q": q} + + +@app.put("/items/{item_id}") +def update_item(item_id: int, item: Item): + return {"item_name": item.name, "item_id": item_id} +``` + +The server should reload automatically (because you added `--reload` to the `uvicorn` command above). + +### Interactive API docs upgrade + +Now go to http://127.0.0.1:8000/docs. + +* The interactive API documentation will be automatically updated, including the new body: + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) + +* Click on the button "Try it out", it allows you to fill the parameters and directly interact with the API: + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) + +* Then click on the "Execute" button, the user interface will communicate with your API, send the parameters, get the results and show them on the screen: + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) + +### Alternative API docs upgrade + +And now, go to http://127.0.0.1:8000/redoc. + +* The alternative documentation will also reflect the new query parameter and body: + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) + +### Recap + +In summary, you declare **once** the types of parameters, body, etc. as function parameters. + +You do that with standard modern Python types. + +You don't have to learn a new syntax, the methods or classes of a specific library, etc. + +Just standard **Python 3.6+**. + +For example, for an `int`: + +```Python +item_id: int +``` + +or for a more complex `Item` model: + +```Python +item: Item +``` + +...and with that single declaration you get: + +* Editor support, including: + * Completion. + * Type checks. +* Validation of data: + * Automatic and clear errors when the data is invalid. + * Validation even for deeply nested JSON objects. +* Conversion of input data: coming from the network to Python data and types. Reading from: + * JSON. + * Path parameters. + * Query parameters. + * Cookies. + * Headers. + * Forms. + * Files. +* Conversion of output data: converting from Python data and types to network data (as JSON): + * Convert Python types (`str`, `int`, `float`, `bool`, `list`, etc). + * `datetime` objects. + * `UUID` objects. + * Database models. + * ...and many more. +* Automatic interactive API documentation, including 2 alternative user interfaces: + * Swagger UI. + * ReDoc. + +--- + +Coming back to the previous code example, **FastAPI** will: + +* Validate that there is an `item_id` in the path for `GET` and `PUT` requests. +* Validate that the `item_id` is of type `int` for `GET` and `PUT` requests. + * If it is not, the client will see a useful, clear error. +* Check if there is an optional query parameter named `q` (as in `http://127.0.0.1:8000/items/foo?q=somequery`) for `GET` requests. + * As the `q` parameter is declared with `= None`, it is optional. + * Without the `None` it would be required (as is the body in the case with `PUT`). +* For `PUT` requests to `/items/{item_id}`, Read the body as JSON: + * Check that it has a required attribute `name` that should be a `str`. + * Check that it has a required attribute `price` that has to be a `float`. + * Check that it has an optional attribute `is_offer`, that should be a `bool`, if present. + * All this would also work for deeply nested JSON objects. +* Convert from and to JSON automatically. +* Document everything with OpenAPI, that can be used by: + * Interactive documentation systems. + * Automatic client code generation systems, for many languages. +* Provide 2 interactive documentation web interfaces directly. + +--- + +We just scratched the surface, but you already get the idea of how it all works. + +Try changing the line with: + +```Python + return {"item_name": item.name, "item_id": item_id} +``` + +...from: + +```Python + ... "item_name": item.name ... +``` + +...to: + +```Python + ... "item_price": item.price ... +``` + +...and see how your editor will auto-complete the attributes and know their types: + +![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) + +For a more complete example including more features, see the Tutorial - User Guide. + +**Spoiler alert**: the tutorial - user guide includes: + +* Declaration of **parameters** from other different places as: **headers**, **cookies**, **form fields** and **files**. +* How to set **validation constraints** as `maximum_length` or `regex`. +* A very powerful and easy to use **Dependency Injection** system. +* Security and authentication, including support for **OAuth2** with **JWT tokens** and **HTTP Basic** auth. +* More advanced (but equally easy) techniques for declaring **deeply nested JSON models** (thanks to Pydantic). +* **GraphQL** integration with Strawberry and other libraries. +* Many extra features (thanks to Starlette) as: + * **WebSockets** + * extremely easy tests based on `requests` and `pytest` + * **CORS** + * **Cookie Sessions** + * ...and more. + +## Performance + +Independent TechEmpower benchmarks show **FastAPI** applications running under Uvicorn as one of the fastest Python frameworks available, only below Starlette and Uvicorn themselves (used internally by FastAPI). (*) + +To understand more about it, see the section Benchmarks. + +## Optional Dependencies + +Used by Pydantic: + +* ujson - for faster JSON "parsing". +* email_validator - for email validation. + +Used by Starlette: + +* requests - Required if you want to use the `TestClient`. +* jinja2 - Required if you want to use the default template configuration. +* python-multipart - Required if you want to support form "parsing", with `request.form()`. +* itsdangerous - Required for `SessionMiddleware` support. +* pyyaml - Required for Starlette's `SchemaGenerator` support (you probably don't need it with FastAPI). +* ujson - Required if you want to use `UJSONResponse`. + +Used by FastAPI / Starlette: + +* uvicorn - for the server that loads and serves your application. +* orjson - Required if you want to use `ORJSONResponse`. + +You can install all of these with `pip install "fastapi[all]"`. + +## License + +This project is licensed under the terms of the MIT license. diff --git a/docs/nl/mkdocs.yml b/docs/nl/mkdocs.yml new file mode 100644 index 000000000..c853216f5 --- /dev/null +++ b/docs/nl/mkdocs.yml @@ -0,0 +1,135 @@ +site_name: FastAPI +site_description: FastAPI framework, high performance, easy to learn, fast to code, ready for production +site_url: https://fastapi.tiangolo.com/nl/ +theme: + name: material + custom_dir: overrides + palette: + - scheme: default + primary: teal + accent: amber + toggle: + icon: material/lightbulb + name: Switch to light mode + - scheme: slate + primary: teal + accent: amber + toggle: + icon: material/lightbulb-outline + name: Switch to dark mode + features: + - search.suggest + - search.highlight + - content.tabs.link + icon: + repo: fontawesome/brands/github-alt + logo: https://fastapi.tiangolo.com/img/icon-white.svg + favicon: https://fastapi.tiangolo.com/img/favicon.png + language: nl +repo_name: tiangolo/fastapi +repo_url: https://github.com/tiangolo/fastapi +edit_uri: '' +plugins: +- search +- markdownextradata: + data: data +nav: +- FastAPI: index.md +- Languages: + - en: / + - az: /az/ + - de: /de/ + - es: /es/ + - fa: /fa/ + - fr: /fr/ + - id: /id/ + - it: /it/ + - ja: /ja/ + - ko: /ko/ + - nl: /nl/ + - pl: /pl/ + - pt: /pt/ + - ru: /ru/ + - sq: /sq/ + - tr: /tr/ + - uk: /uk/ + - zh: /zh/ +markdown_extensions: +- toc: + permalink: true +- markdown.extensions.codehilite: + guess_lang: false +- mdx_include: + base_path: docs +- admonition +- codehilite +- extra +- pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format '' +- pymdownx.tabbed: + alternate_style: true +extra: + analytics: + provider: google + property: UA-133183413-1 + social: + - icon: fontawesome/brands/github-alt + link: https://github.com/tiangolo/fastapi + - icon: fontawesome/brands/discord + link: https://discord.gg/VQjSZaeJmf + - icon: fontawesome/brands/twitter + link: https://twitter.com/fastapi + - icon: fontawesome/brands/linkedin + link: https://www.linkedin.com/in/tiangolo + - icon: fontawesome/brands/dev + link: https://dev.to/tiangolo + - icon: fontawesome/brands/medium + link: https://medium.com/@tiangolo + - icon: fontawesome/solid/globe + link: https://tiangolo.com + alternate: + - link: / + name: en - English + - link: /az/ + name: az + - link: /de/ + name: de + - link: /es/ + name: es - español + - link: /fa/ + name: fa + - link: /fr/ + name: fr - français + - link: /id/ + name: id + - link: /it/ + name: it - italiano + - link: /ja/ + name: ja - 日本語 + - link: /ko/ + name: ko - 한국어 + - link: /nl/ + name: nl + - link: /pl/ + name: pl + - link: /pt/ + name: pt - português + - link: /ru/ + name: ru - русский язык + - link: /sq/ + name: sq - shqip + - link: /tr/ + name: tr - Türkçe + - link: /uk/ + name: uk - українська мова + - link: /zh/ + name: zh - 汉语 +extra_css: +- https://fastapi.tiangolo.com/css/termynal.css +- https://fastapi.tiangolo.com/css/custom.css +extra_javascript: +- https://fastapi.tiangolo.com/js/termynal.js +- https://fastapi.tiangolo.com/js/custom.js diff --git a/docs/nl/overrides/.gitignore b/docs/nl/overrides/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/docs/pl/mkdocs.yml b/docs/pl/mkdocs.yml index da68165c7..67b41fe53 100644 --- a/docs/pl/mkdocs.yml +++ b/docs/pl/mkdocs.yml @@ -46,6 +46,7 @@ nav: - it: /it/ - ja: /ja/ - ko: /ko/ + - nl: /nl/ - pl: /pl/ - pt: /pt/ - ru: /ru/ @@ -110,6 +111,8 @@ extra: name: ja - 日本語 - link: /ko/ name: ko - 한국어 + - link: /nl/ + name: nl - link: /pl/ name: pl - link: /pt/ diff --git a/docs/pt/mkdocs.yml b/docs/pt/mkdocs.yml index 522b3c86a..4861602e4 100644 --- a/docs/pt/mkdocs.yml +++ b/docs/pt/mkdocs.yml @@ -46,6 +46,7 @@ nav: - it: /it/ - ja: /ja/ - ko: /ko/ + - nl: /nl/ - pl: /pl/ - pt: /pt/ - ru: /ru/ @@ -130,6 +131,8 @@ extra: name: ja - 日本語 - link: /ko/ name: ko - 한국어 + - link: /nl/ + name: nl - link: /pl/ name: pl - link: /pt/ diff --git a/docs/ru/mkdocs.yml b/docs/ru/mkdocs.yml index 643f0aa70..213f941d7 100644 --- a/docs/ru/mkdocs.yml +++ b/docs/ru/mkdocs.yml @@ -46,6 +46,7 @@ nav: - it: /it/ - ja: /ja/ - ko: /ko/ + - nl: /nl/ - pl: /pl/ - pt: /pt/ - ru: /ru/ @@ -110,6 +111,8 @@ extra: name: ja - 日本語 - link: /ko/ name: ko - 한국어 + - link: /nl/ + name: nl - link: /pl/ name: pl - link: /pt/ diff --git a/docs/sq/mkdocs.yml b/docs/sq/mkdocs.yml index e4a1724c3..a61f49bc9 100644 --- a/docs/sq/mkdocs.yml +++ b/docs/sq/mkdocs.yml @@ -46,6 +46,7 @@ nav: - it: /it/ - ja: /ja/ - ko: /ko/ + - nl: /nl/ - pl: /pl/ - pt: /pt/ - ru: /ru/ @@ -110,6 +111,8 @@ extra: name: ja - 日本語 - link: /ko/ name: ko - 한국어 + - link: /nl/ + name: nl - link: /pl/ name: pl - link: /pt/ diff --git a/docs/tr/mkdocs.yml b/docs/tr/mkdocs.yml index 041c11b97..dd52d7fcc 100644 --- a/docs/tr/mkdocs.yml +++ b/docs/tr/mkdocs.yml @@ -46,6 +46,7 @@ nav: - it: /it/ - ja: /ja/ - ko: /ko/ + - nl: /nl/ - pl: /pl/ - pt: /pt/ - ru: /ru/ @@ -113,6 +114,8 @@ extra: name: ja - 日本語 - link: /ko/ name: ko - 한국어 + - link: /nl/ + name: nl - link: /pl/ name: pl - link: /pt/ diff --git a/docs/uk/mkdocs.yml b/docs/uk/mkdocs.yml index 2d704b989..971a182db 100644 --- a/docs/uk/mkdocs.yml +++ b/docs/uk/mkdocs.yml @@ -46,6 +46,7 @@ nav: - it: /it/ - ja: /ja/ - ko: /ko/ + - nl: /nl/ - pl: /pl/ - pt: /pt/ - ru: /ru/ @@ -110,6 +111,8 @@ extra: name: ja - 日本語 - link: /ko/ name: ko - 한국어 + - link: /nl/ + name: nl - link: /pl/ name: pl - link: /pt/ diff --git a/docs/zh/mkdocs.yml b/docs/zh/mkdocs.yml index f424b117b..408166489 100644 --- a/docs/zh/mkdocs.yml +++ b/docs/zh/mkdocs.yml @@ -46,6 +46,7 @@ nav: - it: /it/ - ja: /ja/ - ko: /ko/ + - nl: /nl/ - pl: /pl/ - pt: /pt/ - ru: /ru/ @@ -161,6 +162,8 @@ extra: name: ja - 日本語 - link: /ko/ name: ko - 한국어 + - link: /nl/ + name: nl - link: /pl/ name: pl - link: /pt/ From eddbae948f04e13fe412dc45a569d10e34b698a4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 18 Mar 2022 16:48:49 +0000 Subject: [PATCH 27/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index da1cd5c32..b0445a4ef 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 🌐 Start Dutch translations. PR [#4703](https://github.com/tiangolo/fastapi/pull/4703) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add configuration to notify Dutch translations. PR [#4702](https://github.com/tiangolo/fastapi/pull/4702) by [@tiangolo](https://github.com/tiangolo). * 🌐 Start Persian/Farsi translations. PR [#4243](https://github.com/tiangolo/fastapi/pull/4243) by [@aminalaee](https://github.com/aminalaee). * ✏ Reword sentence about handling errors. PR [#1993](https://github.com/tiangolo/fastapi/pull/1993) by [@khuhroproeza](https://github.com/khuhroproeza). From e1d0e3874b86bc2d12c0fb720fd35719b985abae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Fri, 1 Apr 2022 18:01:51 -0500 Subject: [PATCH 28/59] =?UTF-8?q?=E2=9E=96=20Temporarily=20remove=20typer-?= =?UTF-8?q?cli=20from=20dependencies=20and=20upgrade=20Black=20(#4754)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 6 ++++-- tests/test_tutorial/test_request_files/test_tutorial001.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 77c01322f..46a655a48 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,7 +50,7 @@ test = [ "pytest-cov >=2.12.0,<4.0.0", "mypy ==0.910", "flake8 >=3.8.3,<4.0.0", - "black ==21.9b0", + "black == 22.3.0", "isort >=5.0.6,<6.0.0", "requests >=2.24.0,<3.0.0", "httpx >=0.14.0,<0.19.0", @@ -74,7 +74,9 @@ doc = [ "mkdocs-material >=8.1.4,<9.0.0", "mdx-include >=1.4.1,<2.0.0", "mkdocs-markdownextradata-plugin >=0.1.7,<0.3.0", - "typer-cli >=0.0.12,<0.0.13", + # TODO: upgrade and enable typer-cli once it supports Click 8.x.x + # "typer-cli >=0.0.12,<0.0.13", + "typer >=0.4.1,<0.5.0", "pyyaml >=5.3.1,<6.0.0" ] dev = [ diff --git a/tests/test_tutorial/test_request_files/test_tutorial001.py b/tests/test_tutorial/test_request_files/test_tutorial001.py index c1537f445..841116e30 100644 --- a/tests/test_tutorial/test_request_files/test_tutorial001.py +++ b/tests/test_tutorial/test_request_files/test_tutorial001.py @@ -162,7 +162,7 @@ def test_post_file(tmp_path): def test_post_large_file(tmp_path): - default_pydantic_max_size = 2 ** 16 + default_pydantic_max_size = 2**16 path = tmp_path / "test.txt" path.write_bytes(b"x" * (default_pydantic_max_size + 1)) From 233214795a93178518292c87f5dd90baa7fcb76b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 1 Apr 2022 18:02:17 -0500 Subject: [PATCH 29/59] =?UTF-8?q?=F0=9F=91=A5=20Update=20FastAPI=20People?= =?UTF-8?q?=20(#4752)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions --- docs/en/data/github_sponsors.yml | 42 ++++-------------- docs/en/data/people.yml | 74 ++++++++++++++++++-------------- 2 files changed, 50 insertions(+), 66 deletions(-) diff --git a/docs/en/data/github_sponsors.yml b/docs/en/data/github_sponsors.yml index 1d8dc9984..42339d262 100644 --- a/docs/en/data/github_sponsors.yml +++ b/docs/en/data/github_sponsors.yml @@ -38,21 +38,18 @@ sponsors: - login: BoostryJP avatarUrl: https://avatars.githubusercontent.com/u/57932412?v=4 url: https://github.com/BoostryJP -- - login: bolau - avatarUrl: https://avatars.githubusercontent.com/u/488733?u=902c9f9b85db0e21aca11bf30d904ee8e87fffef&v=4 - url: https://github.com/bolau - - login: johnadjei +- - login: johnadjei avatarUrl: https://avatars.githubusercontent.com/u/767860?v=4 url: https://github.com/johnadjei - login: HiredScore avatarUrl: https://avatars.githubusercontent.com/u/3908850?v=4 url: https://github.com/HiredScore + - login: spackle0 + avatarUrl: https://avatars.githubusercontent.com/u/6148423?u=750e21b7366c0de69c305a8bcda1365d921ae477&v=4 + url: https://github.com/spackle0 - login: wdwinslow avatarUrl: https://avatars.githubusercontent.com/u/11562137?u=dc01daafb354135603a263729e3d26d939c0c452&v=4 url: https://github.com/wdwinslow -- - login: orvad - avatarUrl: https://avatars.githubusercontent.com/u/7700522?v=4 - url: https://github.com/orvad - - login: moellenbeck avatarUrl: https://avatars.githubusercontent.com/u/169372?v=4 url: https://github.com/moellenbeck @@ -65,9 +62,6 @@ sponsors: - login: tizz98 avatarUrl: https://avatars.githubusercontent.com/u/5739698?u=f095a3659e3a8e7c69ccd822696990b521ea25f9&v=4 url: https://github.com/tizz98 - - login: mntolia - avatarUrl: https://avatars.githubusercontent.com/u/10390224?v=4 - url: https://github.com/mntolia - login: jmaralc avatarUrl: https://avatars.githubusercontent.com/u/21101214?u=b15a9f07b7cbf6c9dcdbcb6550bbd2c52f55aa50&v=4 url: https://github.com/jmaralc @@ -83,6 +77,9 @@ sponsors: - login: A-Edge avatarUrl: https://avatars.githubusercontent.com/u/59514131?v=4 url: https://github.com/A-Edge +- - login: hcristea + avatarUrl: https://avatars.githubusercontent.com/u/7814406?u=61d7a4fcf846983a4606788eac25e1c6c1209ba8&v=4 + url: https://github.com/hcristea - - login: samuelcolvin avatarUrl: https://avatars.githubusercontent.com/u/4039449?u=807390ba9cfe23906c3bf8a0d56aaca3cf2bfa0d&v=4 url: https://github.com/samuelcolvin @@ -278,9 +275,6 @@ sponsors: - login: dudikbender avatarUrl: https://avatars.githubusercontent.com/u/53487583?u=494f85229115076121b3639a3806bbac1c6ae7f6&v=4 url: https://github.com/dudikbender - - login: jorge4larcon - avatarUrl: https://avatars.githubusercontent.com/u/54189123?v=4 - url: https://github.com/jorge4larcon - login: daisuke8000 avatarUrl: https://avatars.githubusercontent.com/u/55035595?u=5025e379cd3655ae1a96039efc85223a873d2e38&v=4 url: https://github.com/daisuke8000 @@ -314,9 +308,6 @@ sponsors: - - login: '837477' avatarUrl: https://avatars.githubusercontent.com/u/37999795?u=543b0bd0e8f283db0fc50754e5d13f6afba8cbea&v=4 url: https://github.com/837477 - - login: naheedroomy - avatarUrl: https://avatars.githubusercontent.com/u/46345736?v=4 - url: https://github.com/naheedroomy - - login: linux-china avatarUrl: https://avatars.githubusercontent.com/u/46711?v=4 url: https://github.com/linux-china @@ -333,7 +324,7 @@ sponsors: avatarUrl: https://avatars.githubusercontent.com/u/144028?u=defda4f90e93429221cc667500944abde60ebe4a&v=4 url: https://github.com/bryanculbertson - login: yourkin - avatarUrl: https://avatars.githubusercontent.com/u/178984?u=163b8c6d9b2d240164ade467cbc9efb16d2432e4&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/178984?u=fa7c3503b47bf16405b96d21554bc59f07a65523&v=4 url: https://github.com/yourkin - login: slafs avatarUrl: https://avatars.githubusercontent.com/u/210173?v=4 @@ -404,9 +395,6 @@ sponsors: - login: unredundant avatarUrl: https://avatars.githubusercontent.com/u/5607577?u=57dd0023365bec03f4fc566df6b81bc0a264a47d&v=4 url: https://github.com/unredundant - - login: Baghdady92 - avatarUrl: https://avatars.githubusercontent.com/u/5708590?v=4 - url: https://github.com/Baghdady92 - login: holec avatarUrl: https://avatars.githubusercontent.com/u/6438041?u=f5af71ec85b3a9d7b8139cb5af0512b02fa9ab1e&v=4 url: https://github.com/holec @@ -423,7 +411,7 @@ sponsors: avatarUrl: https://avatars.githubusercontent.com/u/9358572?u=4a38ef72dd39e8b262bd5ab819992128b55c52b4&v=4 url: https://github.com/VivianSolide - login: xncbf - avatarUrl: https://avatars.githubusercontent.com/u/9462045?u=ded074228b35b46a76b980d2dda522e45277f96d&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/9462045?u=866a1311e4bd3ec5ae84185c4fcc99f397c883d7&v=4 url: https://github.com/xncbf - login: DMantis avatarUrl: https://avatars.githubusercontent.com/u/9536869?v=4 @@ -473,21 +461,12 @@ sponsors: - login: askurihin avatarUrl: https://avatars.githubusercontent.com/u/37978981?v=4 url: https://github.com/askurihin - - login: JitPackJoyride - avatarUrl: https://avatars.githubusercontent.com/u/40203625?u=cfad4285914e018af72a3f3c16d8ac11321201e3&v=4 - url: https://github.com/JitPackJoyride - - login: es3n1n - avatarUrl: https://avatars.githubusercontent.com/u/40367813?u=cfaaedfb5da6c2c00330f8ebb041cd39c6a6273d&v=4 - url: https://github.com/es3n1n - login: ilias-ant avatarUrl: https://avatars.githubusercontent.com/u/42189572?u=a2d6121bac4d125d92ec207460fa3f1842d37e66&v=4 url: https://github.com/ilias-ant - login: arrrrrmin avatarUrl: https://avatars.githubusercontent.com/u/43553423?u=fee5739394fea074cb0b66929d070114a5067aae&v=4 url: https://github.com/arrrrrmin - - login: 4heck - avatarUrl: https://avatars.githubusercontent.com/u/45015299?u=7dfb2aca55bff66849396588828a90e090212f81&v=4 - url: https://github.com/4heck - login: igorezersky avatarUrl: https://avatars.githubusercontent.com/u/46680020?u=a20a595c881dbe5658c906fecc7eff125efb4fd4&v=4 url: https://github.com/igorezersky @@ -527,6 +506,3 @@ sponsors: - login: danburonline avatarUrl: https://avatars.githubusercontent.com/u/34251194?u=2cad4388c1544e539ecb732d656e42fb07b4ff2d&v=4 url: https://github.com/danburonline - - login: foryourselfand - avatarUrl: https://avatars.githubusercontent.com/u/43334967?u=8abd999f94bc0852d035b765155d5138a88288ce&v=4 - url: https://github.com/foryourselfand diff --git a/docs/en/data/people.yml b/docs/en/data/people.yml index 591800a35..2f05b3e6b 100644 --- a/docs/en/data/people.yml +++ b/docs/en/data/people.yml @@ -1,7 +1,7 @@ maintainers: - login: tiangolo answers: 1240 - prs: 289 + prs: 291 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=5cad72c846b7aba2e960546af490edc7375dafc4&v=4 url: https://github.com/tiangolo experts: @@ -54,7 +54,7 @@ experts: avatarUrl: https://avatars.githubusercontent.com/u/27180793?u=5cf2877f50b3eb2bc55086089a78a36f07042889&v=4 url: https://github.com/Dustyposa - login: includeamin - count: 38 + count: 39 avatarUrl: https://avatars.githubusercontent.com/u/11836741?u=8bd5ef7e62fe6a82055e33c4c0e0a7879ff8cfb6&v=4 url: https://github.com/includeamin - login: STeveShary @@ -81,14 +81,14 @@ experts: count: 29 avatarUrl: https://avatars.githubusercontent.com/u/365303?u=07ca03c5ee811eb0920e633cc3c3db73dbec1aa5&v=4 url: https://github.com/wshayes +- login: chbndrhnns + count: 26 + avatarUrl: https://avatars.githubusercontent.com/u/7534547?v=4 + url: https://github.com/chbndrhnns - login: panla count: 26 avatarUrl: https://avatars.githubusercontent.com/u/41326348?u=ba2fda6b30110411ecbf406d187907e2b420ac19&v=4 url: https://github.com/panla -- login: chbndrhnns - count: 25 - avatarUrl: https://avatars.githubusercontent.com/u/7534547?v=4 - url: https://github.com/chbndrhnns - login: ghandic count: 25 avatarUrl: https://avatars.githubusercontent.com/u/23500353?u=e2e1d736f924d9be81e8bfc565b6d8836ba99773&v=4 @@ -101,6 +101,10 @@ experts: count: 24 avatarUrl: https://avatars.githubusercontent.com/u/9435877?u=719327b7d2c4c62212456d771bfa7c6b8dbb9eac&v=4 url: https://github.com/SirTelemak +- login: jgould22 + count: 23 + avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 + url: https://github.com/jgould22 - login: acnebs count: 22 avatarUrl: https://avatars.githubusercontent.com/u/9054108?u=c27e50269f1ef8ea950cc6f0268c8ec5cebbe9c9&v=4 @@ -113,14 +117,14 @@ experts: count: 21 avatarUrl: https://avatars.githubusercontent.com/u/565544?v=4 url: https://github.com/chris-allnutt -- login: jgould22 - count: 20 - avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 - url: https://github.com/jgould22 - login: retnikt count: 19 avatarUrl: https://avatars.githubusercontent.com/u/24581770?v=4 url: https://github.com/retnikt +- login: acidjunk + count: 18 + avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 + url: https://github.com/acidjunk - login: Hultner count: 18 avatarUrl: https://avatars.githubusercontent.com/u/2669034?u=115e53df959309898ad8dc9443fbb35fee71df07&v=4 @@ -133,10 +137,10 @@ experts: count: 17 avatarUrl: https://avatars.githubusercontent.com/u/28262306?u=66ee21316275ef356081c2efc4ed7a4572e690dc&v=4 url: https://github.com/nkhitrov -- login: acidjunk - count: 16 - avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 - url: https://github.com/acidjunk +- login: harunyasar + count: 17 + avatarUrl: https://avatars.githubusercontent.com/u/1765494?u=5b1ab7c582db4b4016fa31affe977d10af108ad4&v=4 + url: https://github.com/harunyasar - login: waynerv count: 16 avatarUrl: https://avatars.githubusercontent.com/u/39515546?u=ec35139777597cdbbbddda29bf8b9d4396b429a9&v=4 @@ -145,10 +149,6 @@ experts: count: 16 avatarUrl: https://avatars.githubusercontent.com/u/41964673?u=9f2174f9d61c15c6e3a4c9e3aeee66f711ce311f&v=4 url: https://github.com/dstlny -- login: harunyasar - count: 16 - avatarUrl: https://avatars.githubusercontent.com/u/1765494?u=5b1ab7c582db4b4016fa31affe977d10af108ad4&v=4 - url: https://github.com/harunyasar - login: rafsaf count: 15 avatarUrl: https://avatars.githubusercontent.com/u/51059348?u=be9f06b8ced2d2b677297decc781fa8ce4f7ddbd&v=4 @@ -199,25 +199,33 @@ experts: url: https://github.com/n8sty last_month_active: - login: yinziyan1206 - count: 7 + count: 5 avatarUrl: https://avatars.githubusercontent.com/u/37829370?v=4 url: https://github.com/yinziyan1206 - login: Kludex - count: 6 + count: 5 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex +- login: jd-0001 + count: 4 + avatarUrl: https://avatars.githubusercontent.com/u/47495003?u=322eedc0931b62827cf5f239654f77bfaff76b46&v=4 + url: https://github.com/jd-0001 +- login: harunyasar + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/1765494?u=5b1ab7c582db4b4016fa31affe977d10af108ad4&v=4 + url: https://github.com/harunyasar +- login: wmcgee3 + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/61711986?u=c51ebfaf8a995019fda8288690f4a009ecf070f0&v=4 + url: https://github.com/wmcgee3 +- login: tasercake + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/13855549?v=4 + url: https://github.com/tasercake - login: jgould22 count: 3 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 -- login: rafsaf - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/51059348?u=be9f06b8ced2d2b677297decc781fa8ce4f7ddbd&v=4 - url: https://github.com/rafsaf -- login: gmanny - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/1166296?v=4 - url: https://github.com/gmanny top_contributors: - login: waynerv count: 25 @@ -317,7 +325,7 @@ top_reviewers: avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=826f228edf0bab0d19ad1d5c4ba4df1047ccffef&v=4 url: https://github.com/ycd - login: cikay - count: 40 + count: 41 avatarUrl: https://avatars.githubusercontent.com/u/24587499?u=e772190a051ab0eaa9c8542fcff1892471638f2b&v=4 url: https://github.com/cikay - login: AdrianDeAnda @@ -328,6 +336,10 @@ top_reviewers: count: 31 avatarUrl: https://avatars.githubusercontent.com/u/31127044?u=81a84af39c89b898b0fbc5a04e8834f60f23e55a&v=4 url: https://github.com/ArcLightSlavik +- login: BilalAlpaslan + count: 28 + avatarUrl: https://avatars.githubusercontent.com/u/47563997?u=63ed66e304fe8d765762c70587d61d9196e5c82d&v=4 + url: https://github.com/BilalAlpaslan - login: dmontagu count: 23 avatarUrl: https://avatars.githubusercontent.com/u/35119617?u=58ed2a45798a4339700e2f62b2e12e6e54bf0396&v=4 @@ -348,10 +360,6 @@ top_reviewers: count: 19 avatarUrl: https://avatars.githubusercontent.com/u/63915557?u=47debaa860fd52c9b98c97ef357ddcec3b3fb399&v=4 url: https://github.com/0417taehyun -- login: BilalAlpaslan - count: 18 - avatarUrl: https://avatars.githubusercontent.com/u/47563997?u=63ed66e304fe8d765762c70587d61d9196e5c82d&v=4 - url: https://github.com/BilalAlpaslan - login: zy7y count: 17 avatarUrl: https://avatars.githubusercontent.com/u/67154681?u=5d634834cc514028ea3f9115f7030b99a1f4d5a4&v=4 From 2c31667407fde305ea52046882879b6547a51b43 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 1 Apr 2022 23:02:28 +0000 Subject: [PATCH 30/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index b0445a4ef..4383a4bd5 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* ➖ Temporarily remove typer-cli from dependencies and upgrade Black. PR [#4754](https://github.com/tiangolo/fastapi/pull/4754) by [@tiangolo](https://github.com/tiangolo). * 🌐 Start Dutch translations. PR [#4703](https://github.com/tiangolo/fastapi/pull/4703) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add configuration to notify Dutch translations. PR [#4702](https://github.com/tiangolo/fastapi/pull/4702) by [@tiangolo](https://github.com/tiangolo). * 🌐 Start Persian/Farsi translations. PR [#4243](https://github.com/tiangolo/fastapi/pull/4243) by [@aminalaee](https://github.com/aminalaee). From 3fefc83d421a775bca4c0caf1b33ed17fb190978 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 1 Apr 2022 23:02:53 +0000 Subject: [PATCH 31/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 4383a4bd5..12bf7f006 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 👥 Update FastAPI People. PR [#4752](https://github.com/tiangolo/fastapi/pull/4752) by [@github-actions[bot]](https://github.com/apps/github-actions). * ➖ Temporarily remove typer-cli from dependencies and upgrade Black. PR [#4754](https://github.com/tiangolo/fastapi/pull/4754) by [@tiangolo](https://github.com/tiangolo). * 🌐 Start Dutch translations. PR [#4703](https://github.com/tiangolo/fastapi/pull/4703) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add configuration to notify Dutch translations. PR [#4702](https://github.com/tiangolo/fastapi/pull/4702) by [@tiangolo](https://github.com/tiangolo). From 9e018c322cd05f0fc5e52804efe577e847c8731d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Fri, 1 Apr 2022 18:05:06 -0500 Subject: [PATCH 32/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 12bf7f006..d75a220cb 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,12 +2,17 @@ ## Latest Changes -* 👥 Update FastAPI People. PR [#4752](https://github.com/tiangolo/fastapi/pull/4752) by [@github-actions[bot]](https://github.com/apps/github-actions). -* ➖ Temporarily remove typer-cli from dependencies and upgrade Black. PR [#4754](https://github.com/tiangolo/fastapi/pull/4754) by [@tiangolo](https://github.com/tiangolo). +### Translations + * 🌐 Start Dutch translations. PR [#4703](https://github.com/tiangolo/fastapi/pull/4703) by [@tiangolo](https://github.com/tiangolo). -* 🔧 Add configuration to notify Dutch translations. PR [#4702](https://github.com/tiangolo/fastapi/pull/4702) by [@tiangolo](https://github.com/tiangolo). * 🌐 Start Persian/Farsi translations. PR [#4243](https://github.com/tiangolo/fastapi/pull/4243) by [@aminalaee](https://github.com/aminalaee). * ✏ Reword sentence about handling errors. PR [#1993](https://github.com/tiangolo/fastapi/pull/1993) by [@khuhroproeza](https://github.com/khuhroproeza). + +### Internal + +* 👥 Update FastAPI People. PR [#4752](https://github.com/tiangolo/fastapi/pull/4752) by [@github-actions[bot]](https://github.com/apps/github-actions). +* ➖ Temporarily remove typer-cli from dependencies and upgrade Black to unblock Pydantic CI. PR [#4754](https://github.com/tiangolo/fastapi/pull/4754) by [@tiangolo](https://github.com/tiangolo). +* 🔧 Add configuration to notify Dutch translations. PR [#4702](https://github.com/tiangolo/fastapi/pull/4702) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People. PR [#4699](https://github.com/tiangolo/fastapi/pull/4699) by [@github-actions[bot]](https://github.com/apps/github-actions). * 🐛 Fix FastAPI People generation to include missing file in commit. PR [#4695](https://github.com/tiangolo/fastapi/pull/4695) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update Classiq sponsor links. PR [#4688](https://github.com/tiangolo/fastapi/pull/4688) by [@tiangolo](https://github.com/tiangolo). From 26f725d259c5dbe3654f221e608b14412c6b40da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Fri, 1 Apr 2022 18:05:52 -0500 Subject: [PATCH 33/59] =?UTF-8?q?=F0=9F=94=96=20Release=20version=200.75.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 3 +++ fastapi/__init__.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index d75a220cb..4b0ba6c04 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,9 @@ ## Latest Changes + +## 0.75.1 + ### Translations * 🌐 Start Dutch translations. PR [#4703](https://github.com/tiangolo/fastapi/pull/4703) by [@tiangolo](https://github.com/tiangolo). diff --git a/fastapi/__init__.py b/fastapi/__init__.py index 4bce5f017..0ce2ef720 100644 --- a/fastapi/__init__.py +++ b/fastapi/__init__.py @@ -1,6 +1,6 @@ """FastAPI framework, high performance, easy to learn, fast to code, ready for production""" -__version__ = "0.75.0" +__version__ = "0.75.1" from starlette import status as status From cc57bfcf6053aa419e80e12296ed8a053c65128b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 16 Apr 2022 10:18:08 +0200 Subject: [PATCH 34/59] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Upgrade=20Codecov=20?= =?UTF-8?q?GitHub=20Action=20(#4801)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 21ea7c1a8..aee3a994d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -38,4 +38,4 @@ jobs: - name: Test run: bash scripts/test.sh - name: Upload coverage - uses: codecov/codecov-action@v1 + uses: codecov/codecov-action@v2 From c4f361c0c47cdb3b0de036ddffe21fce9d031180 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 16 Apr 2022 08:18:43 +0000 Subject: [PATCH 35/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 4b0ba6c04..fc23da85d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* ⬆️ Upgrade Codecov GitHub Action. PR [#4801](https://github.com/tiangolo/fastapi/pull/4801) by [@tiangolo](https://github.com/tiangolo). ## 0.75.1 From acf8a91c258003f3ff487bed0974c479f7136333 Mon Sep 17 00:00:00 2001 From: Alan Wright <31636206+RAlanWright@users.noreply.github.com> Date: Sun, 17 Apr 2022 09:47:14 -0500 Subject: [PATCH 36/59] =?UTF-8?q?=E2=AC=86=20Upgrade=20Swagger=20UI=20-=20?= =?UTF-8?q?swagger-ui-dist@4=20(#4347)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sebastián Ramírez --- fastapi/openapi/docs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fastapi/openapi/docs.py b/fastapi/openapi/docs.py index 1be90d188..d6af17a85 100644 --- a/fastapi/openapi/docs.py +++ b/fastapi/openapi/docs.py @@ -17,8 +17,8 @@ def get_swagger_ui_html( *, openapi_url: str, title: str, - swagger_js_url: str = "https://cdn.jsdelivr.net/npm/swagger-ui-dist@3/swagger-ui-bundle.js", - swagger_css_url: str = "https://cdn.jsdelivr.net/npm/swagger-ui-dist@3/swagger-ui.css", + swagger_js_url: str = "https://cdn.jsdelivr.net/npm/swagger-ui-dist@4/swagger-ui-bundle.js", + swagger_css_url: str = "https://cdn.jsdelivr.net/npm/swagger-ui-dist@4/swagger-ui.css", swagger_favicon_url: str = "https://fastapi.tiangolo.com/img/favicon.png", oauth2_redirect_url: Optional[str] = None, init_oauth: Optional[Dict[str, Any]] = None, From e1135eddb5d6dbd8a16d699b90e353b04c2700d3 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 17 Apr 2022 14:47:55 +0000 Subject: [PATCH 37/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index fc23da85d..a449e10a1 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* ⬆ Upgrade Swagger UI - swagger-ui-dist@4. PR [#4347](https://github.com/tiangolo/fastapi/pull/4347) by [@RAlanWright](https://github.com/RAlanWright). * ⬆️ Upgrade Codecov GitHub Action. PR [#4801](https://github.com/tiangolo/fastapi/pull/4801) by [@tiangolo](https://github.com/tiangolo). ## 0.75.1 From 75af47202907da4ca5969c48b08c94dcfe0036ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 17 Apr 2022 16:55:37 +0200 Subject: [PATCH 38/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index a449e10a1..9d9c2a802 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,7 +2,7 @@ ## Latest Changes -* ⬆ Upgrade Swagger UI - swagger-ui-dist@4. PR [#4347](https://github.com/tiangolo/fastapi/pull/4347) by [@RAlanWright](https://github.com/RAlanWright). +* ⬆ Upgrade Swagger UI - swagger-ui-dist@4. This handles a security issue in Swagger UI itself where it could be possible to inject HTML into Swagger UI. Please upgrade as soon as you can, in particular if you expose your Swagger UI (`/docs`) publicly to non-expert users. PR [#4347](https://github.com/tiangolo/fastapi/pull/4347) by [@RAlanWright](https://github.com/RAlanWright). * ⬆️ Upgrade Codecov GitHub Action. PR [#4801](https://github.com/tiangolo/fastapi/pull/4801) by [@tiangolo](https://github.com/tiangolo). ## 0.75.1 From 02fae6a38ea492dcd789e835c17c26a93b0697a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 17 Apr 2022 17:51:42 +0200 Subject: [PATCH 39/59] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Upgrade=20dependenci?= =?UTF-8?q?es=20upper=20range=20for=20extras=20"all"=20(#4803)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/test.yml | 2 +- pyproject.toml | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index aee3a994d..f0a82344e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,7 +25,7 @@ jobs: id: cache with: path: ${{ env.pythonLocation }} - key: ${{ runner.os }}-python-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml') }}-test + key: ${{ runner.os }}-python-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml') }}-test-v02 - name: Install Flit if: steps.cache.outputs.cache-hit != 'true' run: pip install flit diff --git a/pyproject.toml b/pyproject.toml index 46a655a48..9e928beff 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,15 +59,15 @@ test = [ "peewee >=3.13.3,<4.0.0", "databases[sqlite] >=0.3.2,<0.6.0", "orjson >=3.2.1,<4.0.0", - "ujson >=4.0.1,<5.0.0", + "ujson >=4.0.1,<6.0.0", "python-multipart >=0.0.5,<0.0.6", "flask >=1.1.2,<3.0.0", "anyio[trio] >=3.2.1,<4.0.0", # types - "types-ujson ==0.1.1", - "types-orjson ==3.6.0", - "types-dataclasses ==0.1.7; python_version<'3.7'", + "types-ujson ==4.2.1", + "types-orjson ==3.6.2", + "types-dataclasses ==0.6.5; python_version<'3.7'", ] doc = [ "mkdocs >=1.1.2,<2.0.0", @@ -77,25 +77,25 @@ doc = [ # TODO: upgrade and enable typer-cli once it supports Click 8.x.x # "typer-cli >=0.0.12,<0.0.13", "typer >=0.4.1,<0.5.0", - "pyyaml >=5.3.1,<6.0.0" + "pyyaml >=5.3.1,<7.0.0", ] dev = [ "python-jose[cryptography] >=3.3.0,<4.0.0", "passlib[bcrypt] >=1.7.2,<2.0.0", "autoflake >=1.4.0,<2.0.0", "flake8 >=3.8.3,<4.0.0", - "uvicorn[standard] >=0.12.0,<0.16.0", + "uvicorn[standard] >=0.12.0,<0.18.0", ] all = [ "requests >=2.24.0,<3.0.0", "jinja2 >=2.11.2,<4.0.0", "python-multipart >=0.0.5,<0.0.6", "itsdangerous >=1.1.0,<3.0.0", - "pyyaml >=5.3.1,<6.0.0", - "ujson >=4.0.1,<5.0.0", + "pyyaml >=5.3.1,<7.0.0", + "ujson >=4.0.1,<6.0.0", "orjson >=3.2.1,<4.0.0", "email_validator >=1.1.1,<2.0.0", - "uvicorn[standard] >=0.12.0,<0.16.0", + "uvicorn[standard] >=0.12.0,<0.18.0", ] [tool.isort] From 0def8382b8386bebc7d04f9e57b638d777228c87 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 17 Apr 2022 15:52:12 +0000 Subject: [PATCH 40/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 9d9c2a802..c78b7719a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* ⬆️ Upgrade dependencies upper range for extras "all". PR [#4803](https://github.com/tiangolo/fastapi/pull/4803) by [@tiangolo](https://github.com/tiangolo). * ⬆ Upgrade Swagger UI - swagger-ui-dist@4. This handles a security issue in Swagger UI itself where it could be possible to inject HTML into Swagger UI. Please upgrade as soon as you can, in particular if you expose your Swagger UI (`/docs`) publicly to non-expert users. PR [#4347](https://github.com/tiangolo/fastapi/pull/4347) by [@RAlanWright](https://github.com/RAlanWright). * ⬆️ Upgrade Codecov GitHub Action. PR [#4801](https://github.com/tiangolo/fastapi/pull/4801) by [@tiangolo](https://github.com/tiangolo). From 3cbfae16cf4f247a8d1940556a43168a04a23fac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 17 Apr 2022 18:17:59 +0200 Subject: [PATCH 41/59] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20ujson=20ran?= =?UTF-8?q?ges=20for=20CVE-2021-45958=20(#4804)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9e928beff..7856085fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,7 +59,7 @@ test = [ "peewee >=3.13.3,<4.0.0", "databases[sqlite] >=0.3.2,<0.6.0", "orjson >=3.2.1,<4.0.0", - "ujson >=4.0.1,<6.0.0", + "ujson >=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0", "python-multipart >=0.0.5,<0.0.6", "flask >=1.1.2,<3.0.0", "anyio[trio] >=3.2.1,<4.0.0", @@ -92,7 +92,7 @@ all = [ "python-multipart >=0.0.5,<0.0.6", "itsdangerous >=1.1.0,<3.0.0", "pyyaml >=5.3.1,<7.0.0", - "ujson >=4.0.1,<6.0.0", + "ujson >=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0", "orjson >=3.2.1,<4.0.0", "email_validator >=1.1.1,<2.0.0", "uvicorn[standard] >=0.12.0,<0.18.0", From cb4da936437d7e9fbc544f7f8c3237e01a6e2312 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 17 Apr 2022 16:18:35 +0000 Subject: [PATCH 42/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index c78b7719a..e4830181f 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* ⬆️ Update ujson ranges for CVE-2021-45958. PR [#4804](https://github.com/tiangolo/fastapi/pull/4804) by [@tiangolo](https://github.com/tiangolo). * ⬆️ Upgrade dependencies upper range for extras "all". PR [#4803](https://github.com/tiangolo/fastapi/pull/4803) by [@tiangolo](https://github.com/tiangolo). * ⬆ Upgrade Swagger UI - swagger-ui-dist@4. This handles a security issue in Swagger UI itself where it could be possible to inject HTML into Swagger UI. Please upgrade as soon as you can, in particular if you expose your Swagger UI (`/docs`) publicly to non-expert users. PR [#4347](https://github.com/tiangolo/fastapi/pull/4347) by [@RAlanWright](https://github.com/RAlanWright). * ⬆️ Upgrade Codecov GitHub Action. PR [#4801](https://github.com/tiangolo/fastapi/pull/4801) by [@tiangolo](https://github.com/tiangolo). From d81c9081324758e4dd830b15e7abbb1817322b76 Mon Sep 17 00:00:00 2001 From: Marcelo Trylesinski Date: Sun, 17 Apr 2022 19:21:53 +0200 Subject: [PATCH 43/59] =?UTF-8?q?=F0=9F=90=9B=20Fix=20support=20for=20pref?= =?UTF-8?q?ix=20on=20APIRouter=20WebSockets=20(#2640)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sebastián Ramírez --- fastapi/routing.py | 2 +- tests/test_ws_router.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/fastapi/routing.py b/fastapi/routing.py index 0f416ac42..7a15f3965 100644 --- a/fastapi/routing.py +++ b/fastapi/routing.py @@ -649,7 +649,7 @@ class APIRouter(routing.Router): self, path: str, endpoint: Callable[..., Any], name: Optional[str] = None ) -> None: route = APIWebSocketRoute( - path, + self.prefix + path, endpoint=endpoint, name=name, dependency_overrides_provider=self.dependency_overrides_provider, diff --git a/tests/test_ws_router.py b/tests/test_ws_router.py index bd7c3c53d..fbca104a2 100644 --- a/tests/test_ws_router.py +++ b/tests/test_ws_router.py @@ -3,6 +3,7 @@ from fastapi.testclient import TestClient router = APIRouter() prefix_router = APIRouter() +native_prefix_route = APIRouter(prefix="/native") app = FastAPI() @@ -47,8 +48,16 @@ async def router_ws_decorator_depends( await websocket.close() +@native_prefix_route.websocket("/") +async def router_native_prefix_ws(websocket: WebSocket): + await websocket.accept() + await websocket.send_text("Hello, router with native prefix!") + await websocket.close() + + app.include_router(router) app.include_router(prefix_router, prefix="/prefix") +app.include_router(native_prefix_route) def test_app(): @@ -72,6 +81,13 @@ def test_prefix_router(): assert data == "Hello, router with prefix!" +def test_native_prefix_router(): + client = TestClient(app) + with client.websocket_connect("/native/") as websocket: + data = websocket.receive_text() + assert data == "Hello, router with native prefix!" + + def test_router2(): client = TestClient(app) with client.websocket_connect("/router2") as websocket: From 1d8d81a6d5ba28f809ed9143a92f71fa31af3969 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 17 Apr 2022 17:22:26 +0000 Subject: [PATCH 44/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index e4830181f..772d6a0d8 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 🐛 Fix support for prefix on APIRouter WebSockets. PR [#2640](https://github.com/tiangolo/fastapi/pull/2640) by [@Kludex](https://github.com/Kludex). * ⬆️ Update ujson ranges for CVE-2021-45958. PR [#4804](https://github.com/tiangolo/fastapi/pull/4804) by [@tiangolo](https://github.com/tiangolo). * ⬆️ Upgrade dependencies upper range for extras "all". PR [#4803](https://github.com/tiangolo/fastapi/pull/4803) by [@tiangolo](https://github.com/tiangolo). * ⬆ Upgrade Swagger UI - swagger-ui-dist@4. This handles a security issue in Swagger UI itself where it could be possible to inject HTML into Swagger UI. Please upgrade as soon as you can, in particular if you expose your Swagger UI (`/docs`) publicly to non-expert users. PR [#4347](https://github.com/tiangolo/fastapi/pull/4347) by [@RAlanWright](https://github.com/RAlanWright). From c449ae5c74d7908b837a7ecf601f30cbfa246f72 Mon Sep 17 00:00:00 2001 From: dconathan Date: Sun, 17 Apr 2022 12:41:46 -0500 Subject: [PATCH 45/59] =?UTF-8?q?=F0=9F=90=9B=20Fix=20JSON=20Schema=20for?= =?UTF-8?q?=20`ValidationError`=20at=20field=20`loc`=20(#3810)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Devin Conathan --- fastapi/openapi/utils.py | 6 +++++- tests/test_additional_properties.py | 2 +- tests/test_additional_responses_custom_model_in_callback.py | 2 +- tests/test_additional_responses_default_validationerror.py | 2 +- tests/test_application.py | 2 +- tests/test_dependency_duplicates.py | 2 +- tests/test_extra_routes.py | 2 +- tests/test_filter_pydantic_sub_model.py | 2 +- tests/test_get_request_body.py | 2 +- tests/test_include_router_defaults_overrides.py | 2 +- tests/test_modules_same_name_body/test_main.py | 2 +- tests/test_multi_body_errors.py | 2 +- tests/test_multi_query_errors.py | 2 +- tests/test_param_in_path_and_dependency.py | 2 +- tests/test_put_no_body.py | 2 +- tests/test_repeated_dependency_schema.py | 2 +- tests/test_schema_extra_examples.py | 2 +- tests/test_security_oauth2.py | 2 +- tests/test_security_oauth2_optional.py | 2 +- tests/test_security_oauth2_optional_description.py | 2 +- tests/test_starlette_exception.py | 2 +- tests/test_sub_callbacks.py | 2 +- .../test_additional_responses/test_tutorial001.py | 2 +- .../test_additional_responses/test_tutorial002.py | 2 +- .../test_additional_responses/test_tutorial003.py | 2 +- .../test_additional_responses/test_tutorial004.py | 2 +- .../test_async_sql_databases/test_tutorial001.py | 2 +- tests/test_tutorial/test_bigger_applications/test_main.py | 2 +- tests/test_tutorial/test_body/test_tutorial001.py | 2 +- tests/test_tutorial/test_body_fields/test_tutorial001.py | 2 +- .../test_body_multiple_params/test_tutorial001.py | 2 +- .../test_body_multiple_params/test_tutorial003.py | 2 +- .../test_body_nested_models/test_tutorial009.py | 2 +- tests/test_tutorial/test_body_updates/test_tutorial001.py | 2 +- tests/test_tutorial/test_cookie_params/test_tutorial001.py | 2 +- tests/test_tutorial/test_dataclasses/test_tutorial001.py | 2 +- tests/test_tutorial/test_dataclasses/test_tutorial003.py | 2 +- tests/test_tutorial/test_dependencies/test_tutorial001.py | 2 +- tests/test_tutorial/test_dependencies/test_tutorial004.py | 2 +- tests/test_tutorial/test_dependencies/test_tutorial006.py | 2 +- tests/test_tutorial/test_dependencies/test_tutorial012.py | 2 +- tests/test_tutorial/test_events/test_tutorial001.py | 2 +- .../test_tutorial/test_extra_data_types/test_tutorial001.py | 2 +- tests/test_tutorial/test_extra_models/test_tutorial003.py | 2 +- .../test_tutorial/test_handling_errors/test_tutorial001.py | 2 +- .../test_tutorial/test_handling_errors/test_tutorial002.py | 2 +- .../test_tutorial/test_handling_errors/test_tutorial003.py | 2 +- .../test_tutorial/test_handling_errors/test_tutorial004.py | 2 +- .../test_tutorial/test_handling_errors/test_tutorial005.py | 2 +- .../test_tutorial/test_handling_errors/test_tutorial006.py | 2 +- tests/test_tutorial/test_header_params/test_tutorial001.py | 2 +- .../test_openapi_callbacks/test_tutorial001.py | 2 +- .../test_tutorial004.py | 2 +- .../test_path_operation_configurations/test_tutorial005.py | 2 +- tests/test_tutorial/test_path_params/test_tutorial004.py | 2 +- tests/test_tutorial/test_path_params/test_tutorial005.py | 4 ++-- tests/test_tutorial/test_query_params/test_tutorial005.py | 2 +- tests/test_tutorial/test_query_params/test_tutorial006.py | 2 +- .../test_query_params_str_validations/test_tutorial001.py | 2 +- .../test_query_params_str_validations/test_tutorial011.py | 2 +- .../test_query_params_str_validations/test_tutorial012.py | 2 +- .../test_query_params_str_validations/test_tutorial013.py | 2 +- tests/test_tutorial/test_request_files/test_tutorial001.py | 2 +- tests/test_tutorial/test_request_files/test_tutorial002.py | 2 +- tests/test_tutorial/test_request_forms/test_tutorial001.py | 2 +- .../test_request_forms_and_files/test_tutorial001.py | 2 +- tests/test_tutorial/test_response_model/test_tutorial003.py | 2 +- tests/test_tutorial/test_response_model/test_tutorial004.py | 2 +- tests/test_tutorial/test_response_model/test_tutorial005.py | 2 +- tests/test_tutorial/test_response_model/test_tutorial006.py | 2 +- .../test_schema_extra_example/test_tutorial004.py | 2 +- tests/test_tutorial/test_security/test_tutorial003.py | 2 +- tests/test_tutorial/test_security/test_tutorial005.py | 2 +- .../test_tutorial/test_sql_databases/test_sql_databases.py | 2 +- .../test_sql_databases/test_sql_databases_middleware.py | 2 +- .../test_sql_databases_peewee/test_sql_databases_peewee.py | 2 +- tests/test_union_body.py | 2 +- tests/test_union_inherited_body.py | 2 +- 78 files changed, 83 insertions(+), 79 deletions(-) diff --git a/fastapi/openapi/utils.py b/fastapi/openapi/utils.py index 58a748d04..4eb727bd4 100644 --- a/fastapi/openapi/utils.py +++ b/fastapi/openapi/utils.py @@ -38,7 +38,11 @@ validation_error_definition = { "title": "ValidationError", "type": "object", "properties": { - "loc": {"title": "Location", "type": "array", "items": {"type": "string"}}, + "loc": { + "title": "Location", + "type": "array", + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, + }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, }, diff --git a/tests/test_additional_properties.py b/tests/test_additional_properties.py index 9e15e6ed0..016c1f734 100644 --- a/tests/test_additional_properties.py +++ b/tests/test_additional_properties.py @@ -76,7 +76,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_additional_responses_custom_model_in_callback.py b/tests/test_additional_responses_custom_model_in_callback.py index 36dd0d6db..a1072cc56 100644 --- a/tests/test_additional_responses_custom_model_in_callback.py +++ b/tests/test_additional_responses_custom_model_in_callback.py @@ -119,7 +119,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_additional_responses_default_validationerror.py b/tests/test_additional_responses_default_validationerror.py index 6ea372ce8..cabb536d7 100644 --- a/tests/test_additional_responses_default_validationerror.py +++ b/tests/test_additional_responses_default_validationerror.py @@ -54,7 +54,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_application.py b/tests/test_application.py index 5ba737307..d9194c15c 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -1101,7 +1101,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_dependency_duplicates.py b/tests/test_dependency_duplicates.py index 5e15812b6..33899134e 100644 --- a/tests/test_dependency_duplicates.py +++ b/tests/test_dependency_duplicates.py @@ -177,7 +177,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_extra_routes.py b/tests/test_extra_routes.py index 6aba3e8dd..8f95b7bc9 100644 --- a/tests/test_extra_routes.py +++ b/tests/test_extra_routes.py @@ -292,7 +292,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_filter_pydantic_sub_model.py b/tests/test_filter_pydantic_sub_model.py index 90a372976..8814356a1 100644 --- a/tests/test_filter_pydantic_sub_model.py +++ b/tests/test_filter_pydantic_sub_model.py @@ -116,7 +116,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_get_request_body.py b/tests/test_get_request_body.py index b12f499eb..88b9d839f 100644 --- a/tests/test_get_request_body.py +++ b/tests/test_get_request_body.py @@ -85,7 +85,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_include_router_defaults_overrides.py b/tests/test_include_router_defaults_overrides.py index 5dd7e7098..ccb6c7229 100644 --- a/tests/test_include_router_defaults_overrides.py +++ b/tests/test_include_router_defaults_overrides.py @@ -6612,7 +6612,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_modules_same_name_body/test_main.py b/tests/test_modules_same_name_body/test_main.py index b0d3330c7..8b1aea031 100644 --- a/tests/test_modules_same_name_body/test_main.py +++ b/tests/test_modules_same_name_body/test_main.py @@ -101,7 +101,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_multi_body_errors.py b/tests/test_multi_body_errors.py index c1be82806..31308ea85 100644 --- a/tests/test_multi_body_errors.py +++ b/tests/test_multi_body_errors.py @@ -79,7 +79,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_multi_query_errors.py b/tests/test_multi_query_errors.py index 69ea87a9b..0a15833fa 100644 --- a/tests/test_multi_query_errors.py +++ b/tests/test_multi_query_errors.py @@ -63,7 +63,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_param_in_path_and_dependency.py b/tests/test_param_in_path_and_dependency.py index 0a94c2151..4d85afbce 100644 --- a/tests/test_param_in_path_and_dependency.py +++ b/tests/test_param_in_path_and_dependency.py @@ -71,7 +71,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_put_no_body.py b/tests/test_put_no_body.py index 1c2cfac89..3da294ccf 100644 --- a/tests/test_put_no_body.py +++ b/tests/test_put_no_body.py @@ -57,7 +57,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_repeated_dependency_schema.py b/tests/test_repeated_dependency_schema.py index fd616e12a..00441694e 100644 --- a/tests/test_repeated_dependency_schema.py +++ b/tests/test_repeated_dependency_schema.py @@ -36,7 +36,7 @@ schema = { "ValidationError": { "properties": { "loc": { - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, "title": "Location", "type": "array", }, diff --git a/tests/test_schema_extra_examples.py b/tests/test_schema_extra_examples.py index 3e0d846cd..444e350a8 100644 --- a/tests/test_schema_extra_examples.py +++ b/tests/test_schema_extra_examples.py @@ -830,7 +830,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_security_oauth2.py b/tests/test_security_oauth2.py index b7ada7caf..b9ac488ee 100644 --- a/tests/test_security_oauth2.py +++ b/tests/test_security_oauth2.py @@ -117,7 +117,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_security_oauth2_optional.py b/tests/test_security_oauth2_optional.py index ecc766511..a5fd49b8c 100644 --- a/tests/test_security_oauth2_optional.py +++ b/tests/test_security_oauth2_optional.py @@ -121,7 +121,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_security_oauth2_optional_description.py b/tests/test_security_oauth2_optional_description.py index 011db65ec..171f96b76 100644 --- a/tests/test_security_oauth2_optional_description.py +++ b/tests/test_security_oauth2_optional_description.py @@ -122,7 +122,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_starlette_exception.py b/tests/test_starlette_exception.py index 5759a93f4..859169d3c 100644 --- a/tests/test_starlette_exception.py +++ b/tests/test_starlette_exception.py @@ -102,7 +102,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_sub_callbacks.py b/tests/test_sub_callbacks.py index 16644b556..7574d6fbc 100644 --- a/tests/test_sub_callbacks.py +++ b/tests/test_sub_callbacks.py @@ -256,7 +256,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_additional_responses/test_tutorial001.py b/tests/test_tutorial/test_additional_responses/test_tutorial001.py index 8342dd787..1a8acb523 100644 --- a/tests/test_tutorial/test_additional_responses/test_tutorial001.py +++ b/tests/test_tutorial/test_additional_responses/test_tutorial001.py @@ -76,7 +76,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_additional_responses/test_tutorial002.py b/tests/test_tutorial/test_additional_responses/test_tutorial002.py index 57f877978..2adcf15d0 100644 --- a/tests/test_tutorial/test_additional_responses/test_tutorial002.py +++ b/tests/test_tutorial/test_additional_responses/test_tutorial002.py @@ -72,7 +72,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_additional_responses/test_tutorial003.py b/tests/test_tutorial/test_additional_responses/test_tutorial003.py index 37190b36a..8b2167de0 100644 --- a/tests/test_tutorial/test_additional_responses/test_tutorial003.py +++ b/tests/test_tutorial/test_additional_responses/test_tutorial003.py @@ -77,7 +77,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_additional_responses/test_tutorial004.py b/tests/test_tutorial/test_additional_responses/test_tutorial004.py index c44a18f68..990d5235a 100644 --- a/tests/test_tutorial/test_additional_responses/test_tutorial004.py +++ b/tests/test_tutorial/test_additional_responses/test_tutorial004.py @@ -75,7 +75,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_async_sql_databases/test_tutorial001.py b/tests/test_tutorial/test_async_sql_databases/test_tutorial001.py index 90feb0172..1ad625db6 100644 --- a/tests/test_tutorial/test_async_sql_databases/test_tutorial001.py +++ b/tests/test_tutorial/test_async_sql_databases/test_tutorial001.py @@ -88,7 +88,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_bigger_applications/test_main.py b/tests/test_tutorial/test_bigger_applications/test_main.py index 7eb675179..cd6d7b5c8 100644 --- a/tests/test_tutorial/test_bigger_applications/test_main.py +++ b/tests/test_tutorial/test_bigger_applications/test_main.py @@ -323,7 +323,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_body/test_tutorial001.py b/tests/test_tutorial/test_body/test_tutorial001.py index 7bf62c907..8dbaf15db 100644 --- a/tests/test_tutorial/test_body/test_tutorial001.py +++ b/tests/test_tutorial/test_body/test_tutorial001.py @@ -63,7 +63,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_body_fields/test_tutorial001.py b/tests/test_tutorial/test_body_fields/test_tutorial001.py index 9de4907c2..fe5a270f3 100644 --- a/tests/test_tutorial/test_body_fields/test_tutorial001.py +++ b/tests/test_tutorial/test_body_fields/test_tutorial001.py @@ -87,7 +87,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_body_multiple_params/test_tutorial001.py b/tests/test_tutorial/test_body_multiple_params/test_tutorial001.py index b11ecddab..8dc710d75 100644 --- a/tests/test_tutorial/test_body_multiple_params/test_tutorial001.py +++ b/tests/test_tutorial/test_body_multiple_params/test_tutorial001.py @@ -79,7 +79,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_body_multiple_params/test_tutorial003.py b/tests/test_tutorial/test_body_multiple_params/test_tutorial003.py index d98e3e419..64aa9c43b 100644 --- a/tests/test_tutorial/test_body_multiple_params/test_tutorial003.py +++ b/tests/test_tutorial/test_body_multiple_params/test_tutorial003.py @@ -90,7 +90,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_body_nested_models/test_tutorial009.py b/tests/test_tutorial/test_body_nested_models/test_tutorial009.py index 8eb0ad130..c56d41b5b 100644 --- a/tests/test_tutorial/test_body_nested_models/test_tutorial009.py +++ b/tests/test_tutorial/test_body_nested_models/test_tutorial009.py @@ -53,7 +53,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_body_updates/test_tutorial001.py b/tests/test_tutorial/test_body_updates/test_tutorial001.py index 5e92ef7ea..efd0e4676 100644 --- a/tests/test_tutorial/test_body_updates/test_tutorial001.py +++ b/tests/test_tutorial/test_body_updates/test_tutorial001.py @@ -109,7 +109,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_cookie_params/test_tutorial001.py b/tests/test_tutorial/test_cookie_params/test_tutorial001.py index 3451dc19e..edccffec1 100644 --- a/tests/test_tutorial/test_cookie_params/test_tutorial001.py +++ b/tests/test_tutorial/test_cookie_params/test_tutorial001.py @@ -50,7 +50,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_dataclasses/test_tutorial001.py b/tests/test_tutorial/test_dataclasses/test_tutorial001.py index 3e3fc9acf..bf1564194 100644 --- a/tests/test_tutorial/test_dataclasses/test_tutorial001.py +++ b/tests/test_tutorial/test_dataclasses/test_tutorial001.py @@ -71,7 +71,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_dataclasses/test_tutorial003.py b/tests/test_tutorial/test_dataclasses/test_tutorial003.py index dd0f1f2c0..2d86f7b9a 100644 --- a/tests/test_tutorial/test_dataclasses/test_tutorial003.py +++ b/tests/test_tutorial/test_dataclasses/test_tutorial003.py @@ -118,7 +118,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_dependencies/test_tutorial001.py b/tests/test_tutorial/test_dependencies/test_tutorial001.py index 8b53157cd..c3bca5d5b 100644 --- a/tests/test_tutorial/test_dependencies/test_tutorial001.py +++ b/tests/test_tutorial/test_dependencies/test_tutorial001.py @@ -104,7 +104,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_dependencies/test_tutorial004.py b/tests/test_tutorial/test_dependencies/test_tutorial004.py index eb21f6524..f2b1878d5 100644 --- a/tests/test_tutorial/test_dependencies/test_tutorial004.py +++ b/tests/test_tutorial/test_dependencies/test_tutorial004.py @@ -62,7 +62,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_dependencies/test_tutorial006.py b/tests/test_tutorial/test_dependencies/test_tutorial006.py index c08992ec8..2916577a2 100644 --- a/tests/test_tutorial/test_dependencies/test_tutorial006.py +++ b/tests/test_tutorial/test_dependencies/test_tutorial006.py @@ -55,7 +55,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_dependencies/test_tutorial012.py b/tests/test_tutorial/test_dependencies/test_tutorial012.py index ada83c626..e4e07395d 100644 --- a/tests/test_tutorial/test_dependencies/test_tutorial012.py +++ b/tests/test_tutorial/test_dependencies/test_tutorial012.py @@ -102,7 +102,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_events/test_tutorial001.py b/tests/test_tutorial/test_events/test_tutorial001.py index e3587a0e8..d52dd1a04 100644 --- a/tests/test_tutorial/test_events/test_tutorial001.py +++ b/tests/test_tutorial/test_events/test_tutorial001.py @@ -47,7 +47,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_extra_data_types/test_tutorial001.py b/tests/test_tutorial/test_extra_data_types/test_tutorial001.py index 68b7d61dc..8522d7b9d 100644 --- a/tests/test_tutorial/test_extra_data_types/test_tutorial001.py +++ b/tests/test_tutorial/test_extra_data_types/test_tutorial001.py @@ -89,7 +89,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_extra_models/test_tutorial003.py b/tests/test_tutorial/test_extra_models/test_tutorial003.py index a2a325c77..f1433470c 100644 --- a/tests/test_tutorial/test_extra_models/test_tutorial003.py +++ b/tests/test_tutorial/test_extra_models/test_tutorial003.py @@ -78,7 +78,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_handling_errors/test_tutorial001.py b/tests/test_tutorial/test_handling_errors/test_tutorial001.py index 6b62293d8..ffd79ccff 100644 --- a/tests/test_tutorial/test_handling_errors/test_tutorial001.py +++ b/tests/test_tutorial/test_handling_errors/test_tutorial001.py @@ -49,7 +49,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_handling_errors/test_tutorial002.py b/tests/test_tutorial/test_handling_errors/test_tutorial002.py index d2ce0bf9d..e678499c6 100644 --- a/tests/test_tutorial/test_handling_errors/test_tutorial002.py +++ b/tests/test_tutorial/test_handling_errors/test_tutorial002.py @@ -49,7 +49,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_handling_errors/test_tutorial003.py b/tests/test_tutorial/test_handling_errors/test_tutorial003.py index ca9d94e3c..a01726dc2 100644 --- a/tests/test_tutorial/test_handling_errors/test_tutorial003.py +++ b/tests/test_tutorial/test_handling_errors/test_tutorial003.py @@ -49,7 +49,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_handling_errors/test_tutorial004.py b/tests/test_tutorial/test_handling_errors/test_tutorial004.py index d95debf37..0b5f74798 100644 --- a/tests/test_tutorial/test_handling_errors/test_tutorial004.py +++ b/tests/test_tutorial/test_handling_errors/test_tutorial004.py @@ -49,7 +49,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_handling_errors/test_tutorial005.py b/tests/test_tutorial/test_handling_errors/test_tutorial005.py index cedcaae70..253f3d006 100644 --- a/tests/test_tutorial/test_handling_errors/test_tutorial005.py +++ b/tests/test_tutorial/test_handling_errors/test_tutorial005.py @@ -69,7 +69,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_handling_errors/test_tutorial006.py b/tests/test_tutorial/test_handling_errors/test_tutorial006.py index 8b6c1e7ed..21233d7bb 100644 --- a/tests/test_tutorial/test_handling_errors/test_tutorial006.py +++ b/tests/test_tutorial/test_handling_errors/test_tutorial006.py @@ -49,7 +49,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_header_params/test_tutorial001.py b/tests/test_tutorial/test_header_params/test_tutorial001.py index 0f05b9e8c..273cf3249 100644 --- a/tests/test_tutorial/test_header_params/test_tutorial001.py +++ b/tests/test_tutorial/test_header_params/test_tutorial001.py @@ -51,7 +51,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_openapi_callbacks/test_tutorial001.py b/tests/test_tutorial/test_openapi_callbacks/test_tutorial001.py index b30427d08..e773e7f8f 100644 --- a/tests/test_tutorial/test_openapi_callbacks/test_tutorial001.py +++ b/tests/test_tutorial/test_openapi_callbacks/test_tutorial001.py @@ -143,7 +143,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_path_operation_advanced_configurations/test_tutorial004.py b/tests/test_tutorial/test_path_operation_advanced_configurations/test_tutorial004.py index f2ec2c7e5..456e509d5 100644 --- a/tests/test_tutorial/test_path_operation_advanced_configurations/test_tutorial004.py +++ b/tests/test_tutorial/test_path_operation_advanced_configurations/test_tutorial004.py @@ -72,7 +72,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_path_operation_configurations/test_tutorial005.py b/tests/test_tutorial/test_path_operation_configurations/test_tutorial005.py index d21640946..e587519a0 100644 --- a/tests/test_tutorial/test_path_operation_configurations/test_tutorial005.py +++ b/tests/test_tutorial/test_path_operation_configurations/test_tutorial005.py @@ -72,7 +72,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_path_params/test_tutorial004.py b/tests/test_tutorial/test_path_params/test_tutorial004.py index 131bf773b..7f0227ecf 100644 --- a/tests/test_tutorial/test_path_params/test_tutorial004.py +++ b/tests/test_tutorial/test_path_params/test_tutorial004.py @@ -49,7 +49,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_path_params/test_tutorial005.py b/tests/test_tutorial/test_path_params/test_tutorial005.py index ed9d2032b..eae3637be 100644 --- a/tests/test_tutorial/test_path_params/test_tutorial005.py +++ b/tests/test_tutorial/test_path_params/test_tutorial005.py @@ -54,7 +54,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, @@ -138,7 +138,7 @@ openapi_schema2 = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_query_params/test_tutorial005.py b/tests/test_tutorial/test_query_params/test_tutorial005.py index aabc0af4f..07178f8a6 100644 --- a/tests/test_tutorial/test_query_params/test_tutorial005.py +++ b/tests/test_tutorial/test_query_params/test_tutorial005.py @@ -56,7 +56,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_query_params/test_tutorial006.py b/tests/test_tutorial/test_query_params/test_tutorial006.py index 042a0e1f8..73c5302e7 100644 --- a/tests/test_tutorial/test_query_params/test_tutorial006.py +++ b/tests/test_tutorial/test_query_params/test_tutorial006.py @@ -68,7 +68,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial001.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial001.py index 709bf6956..f8d7f85c8 100644 --- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial001.py +++ b/tests/test_tutorial/test_query_params_str_validations/test_tutorial001.py @@ -59,7 +59,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial011.py index 6ae10296f..ad3645f31 100644 --- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011.py +++ b/tests/test_tutorial/test_query_params_str_validations/test_tutorial011.py @@ -53,7 +53,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial012.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial012.py index 724c975f8..d69139dda 100644 --- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial012.py +++ b/tests/test_tutorial/test_query_params_str_validations/test_tutorial012.py @@ -54,7 +54,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial013.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial013.py index ad5597913..1b2e36354 100644 --- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial013.py +++ b/tests/test_tutorial/test_query_params_str_validations/test_tutorial013.py @@ -54,7 +54,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_request_files/test_tutorial001.py b/tests/test_tutorial/test_request_files/test_tutorial001.py index 841116e30..166014c71 100644 --- a/tests/test_tutorial/test_request_files/test_tutorial001.py +++ b/tests/test_tutorial/test_request_files/test_tutorial001.py @@ -99,7 +99,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_request_files/test_tutorial002.py b/tests/test_tutorial/test_request_files/test_tutorial002.py index 4e33ef464..73d1179a1 100644 --- a/tests/test_tutorial/test_request_files/test_tutorial002.py +++ b/tests/test_tutorial/test_request_files/test_tutorial002.py @@ -119,7 +119,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_request_forms/test_tutorial001.py b/tests/test_tutorial/test_request_forms/test_tutorial001.py index 3d271b531..215260ffa 100644 --- a/tests/test_tutorial/test_request_forms/test_tutorial001.py +++ b/tests/test_tutorial/test_request_forms/test_tutorial001.py @@ -61,7 +61,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_request_forms_and_files/test_tutorial001.py b/tests/test_tutorial/test_request_forms_and_files/test_tutorial001.py index 10cce5e61..09e232b8e 100644 --- a/tests/test_tutorial/test_request_forms_and_files/test_tutorial001.py +++ b/tests/test_tutorial/test_request_forms_and_files/test_tutorial001.py @@ -61,7 +61,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_response_model/test_tutorial003.py b/tests/test_tutorial/test_response_model/test_tutorial003.py index 44f2fb7ca..e1bde5d13 100644 --- a/tests/test_tutorial/test_response_model/test_tutorial003.py +++ b/tests/test_tutorial/test_response_model/test_tutorial003.py @@ -74,7 +74,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_response_model/test_tutorial004.py b/tests/test_tutorial/test_response_model/test_tutorial004.py index 19303982b..8c98c6de3 100644 --- a/tests/test_tutorial/test_response_model/test_tutorial004.py +++ b/tests/test_tutorial/test_response_model/test_tutorial004.py @@ -71,7 +71,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_response_model/test_tutorial005.py b/tests/test_tutorial/test_response_model/test_tutorial005.py index 9ca5463e6..476b172d3 100644 --- a/tests/test_tutorial/test_response_model/test_tutorial005.py +++ b/tests/test_tutorial/test_response_model/test_tutorial005.py @@ -98,7 +98,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_response_model/test_tutorial006.py b/tests/test_tutorial/test_response_model/test_tutorial006.py index 25eb6e333..38eb31e54 100644 --- a/tests/test_tutorial/test_response_model/test_tutorial006.py +++ b/tests/test_tutorial/test_response_model/test_tutorial006.py @@ -98,7 +98,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_schema_extra_example/test_tutorial004.py b/tests/test_tutorial/test_schema_extra_example/test_tutorial004.py index 89f5b66fd..badf66b3d 100644 --- a/tests/test_tutorial/test_schema_extra_example/test_tutorial004.py +++ b/tests/test_tutorial/test_schema_extra_example/test_tutorial004.py @@ -103,7 +103,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_security/test_tutorial003.py b/tests/test_tutorial/test_security/test_tutorial003.py index 3fc7f5f40..595107834 100644 --- a/tests/test_tutorial/test_security/test_tutorial003.py +++ b/tests/test_tutorial/test_security/test_tutorial003.py @@ -81,7 +81,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_security/test_tutorial005.py b/tests/test_tutorial/test_security/test_tutorial005.py index a37f2d60a..e8697339f 100644 --- a/tests/test_tutorial/test_security/test_tutorial005.py +++ b/tests/test_tutorial/test_security/test_tutorial005.py @@ -141,7 +141,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_sql_databases/test_sql_databases.py b/tests/test_tutorial/test_sql_databases/test_sql_databases.py index c88fd0bcd..09304ff87 100644 --- a/tests/test_tutorial/test_sql_databases/test_sql_databases.py +++ b/tests/test_tutorial/test_sql_databases/test_sql_databases.py @@ -261,7 +261,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_sql_databases/test_sql_databases_middleware.py b/tests/test_tutorial/test_sql_databases/test_sql_databases_middleware.py index b02e1c89e..fbaa8938a 100644 --- a/tests/test_tutorial/test_sql_databases/test_sql_databases_middleware.py +++ b/tests/test_tutorial/test_sql_databases/test_sql_databases_middleware.py @@ -260,7 +260,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_sql_databases_peewee/test_sql_databases_peewee.py b/tests/test_tutorial/test_sql_databases_peewee/test_sql_databases_peewee.py index 2ebc31b95..d28ea5e76 100644 --- a/tests/test_tutorial/test_sql_databases_peewee/test_sql_databases_peewee.py +++ b/tests/test_tutorial/test_sql_databases_peewee/test_sql_databases_peewee.py @@ -318,7 +318,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_union_body.py b/tests/test_union_body.py index d1dfd5efb..3e424de07 100644 --- a/tests/test_union_body.py +++ b/tests/test_union_body.py @@ -84,7 +84,7 @@ item_openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_union_inherited_body.py b/tests/test_union_inherited_body.py index e3d0acc99..60b327ebc 100644 --- a/tests/test_union_inherited_body.py +++ b/tests/test_union_inherited_body.py @@ -96,7 +96,7 @@ inherited_item_openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, From d9e7a541fde953ec08da2b626a9555a80910be11 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 17 Apr 2022 17:42:18 +0000 Subject: [PATCH 46/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 772d6a0d8..33794daea 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 🐛 Fix JSON Schema for `ValidationError` at field `loc`. PR [#3810](https://github.com/tiangolo/fastapi/pull/3810) by [@dconathan](https://github.com/dconathan). * 🐛 Fix support for prefix on APIRouter WebSockets. PR [#2640](https://github.com/tiangolo/fastapi/pull/2640) by [@Kludex](https://github.com/Kludex). * ⬆️ Update ujson ranges for CVE-2021-45958. PR [#4804](https://github.com/tiangolo/fastapi/pull/4804) by [@tiangolo](https://github.com/tiangolo). * ⬆️ Upgrade dependencies upper range for extras "all". PR [#4803](https://github.com/tiangolo/fastapi/pull/4803) by [@tiangolo](https://github.com/tiangolo). From 197c1d6dd77bedbc90282db9c8d1b93a7a998856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 17 Apr 2022 21:02:49 +0200 Subject: [PATCH 47/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 33794daea..7adad85cf 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,11 +2,21 @@ ## Latest Changes +This release includes upgrades to third-party packages that handle security issues. Although there's a chance these issues don't affect you in particular, please upgrade as soon as possible. + +### Fixes + * 🐛 Fix JSON Schema for `ValidationError` at field `loc`. PR [#3810](https://github.com/tiangolo/fastapi/pull/3810) by [@dconathan](https://github.com/dconathan). * 🐛 Fix support for prefix on APIRouter WebSockets. PR [#2640](https://github.com/tiangolo/fastapi/pull/2640) by [@Kludex](https://github.com/Kludex). + +### Upgrades + * ⬆️ Update ujson ranges for CVE-2021-45958. PR [#4804](https://github.com/tiangolo/fastapi/pull/4804) by [@tiangolo](https://github.com/tiangolo). * ⬆️ Upgrade dependencies upper range for extras "all". PR [#4803](https://github.com/tiangolo/fastapi/pull/4803) by [@tiangolo](https://github.com/tiangolo). * ⬆ Upgrade Swagger UI - swagger-ui-dist@4. This handles a security issue in Swagger UI itself where it could be possible to inject HTML into Swagger UI. Please upgrade as soon as you can, in particular if you expose your Swagger UI (`/docs`) publicly to non-expert users. PR [#4347](https://github.com/tiangolo/fastapi/pull/4347) by [@RAlanWright](https://github.com/RAlanWright). + +### Internal + * ⬆️ Upgrade Codecov GitHub Action. PR [#4801](https://github.com/tiangolo/fastapi/pull/4801) by [@tiangolo](https://github.com/tiangolo). ## 0.75.1 From ddd9da3db47e28406bdb5f7ad23cb7b33336e762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 17 Apr 2022 22:55:36 +0200 Subject: [PATCH 48/59] =?UTF-8?q?=E2=9C=85=20Fix=20new/recent=20tests=20wi?= =?UTF-8?q?th=20new=20fixed=20`ValidationError`=20JSON=20Schema=20(#4806)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_generate_unique_id_function.py | 28 ++++++++++++++----- tests/test_param_include_in_schema.py | 2 +- tests/test_tuples.py | 2 +- .../test_body/test_tutorial001_py310.py | 2 +- .../test_tutorial001_py310.py | 2 +- .../test_tutorial001_py310.py | 2 +- .../test_tutorial003_py310.py | 2 +- .../test_tutorial009_py39.py | 2 +- .../test_tutorial001_py310.py | 2 +- .../test_tutorial001_py39.py | 2 +- .../test_tutorial001_py310.py | 2 +- .../test_tutorial001_py310.py | 2 +- .../test_tutorial004_py310.py | 2 +- .../test_tutorial001_py310.py | 2 +- .../test_tutorial003_py310.py | 2 +- .../test_generate_clients/test_tutorial003.py | 2 +- .../test_tutorial001_py310.py | 2 +- .../test_tutorial005_py310.py | 2 +- .../test_tutorial005_py39.py | 2 +- .../test_tutorial006_py310.py | 2 +- .../test_tutorial001_py310.py | 2 +- .../test_tutorial011_py310.py | 2 +- .../test_tutorial011_py39.py | 2 +- .../test_tutorial012_py39.py | 2 +- .../test_tutorial014.py | 2 +- .../test_tutorial014_py310.py | 2 +- .../test_request_files/test_tutorial001_02.py | 2 +- .../test_tutorial001_02_py310.py | 2 +- .../test_request_files/test_tutorial001_03.py | 2 +- .../test_tutorial002_py39.py | 2 +- .../test_request_files/test_tutorial003.py | 2 +- .../test_tutorial003_py39.py | 2 +- .../test_tutorial003_py310.py | 2 +- .../test_tutorial004_py310.py | 2 +- .../test_tutorial004_py39.py | 2 +- .../test_tutorial005_py310.py | 2 +- .../test_tutorial006_py310.py | 2 +- .../test_tutorial004_py310.py | 2 +- .../test_security/test_tutorial003_py310.py | 2 +- .../test_security/test_tutorial005_py310.py | 2 +- .../test_security/test_tutorial005_py39.py | 2 +- .../test_sql_databases_middleware_py310.py | 2 +- .../test_sql_databases_middleware_py39.py | 2 +- .../test_sql_databases_py310.py | 2 +- .../test_sql_databases_py39.py | 2 +- 45 files changed, 65 insertions(+), 51 deletions(-) diff --git a/tests/test_generate_unique_id_function.py b/tests/test_generate_unique_id_function.py index ffc0e3844..0b519f859 100644 --- a/tests/test_generate_unique_id_function.py +++ b/tests/test_generate_unique_id_function.py @@ -217,7 +217,9 @@ def test_top_level_generate_unique_id(): "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": { + "anyOf": [{"type": "string"}, {"type": "integer"}] + }, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, @@ -416,7 +418,9 @@ def test_router_overrides_generate_unique_id(): "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": { + "anyOf": [{"type": "string"}, {"type": "integer"}] + }, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, @@ -615,7 +619,9 @@ def test_router_include_overrides_generate_unique_id(): "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": { + "anyOf": [{"type": "string"}, {"type": "integer"}] + }, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, @@ -887,7 +893,9 @@ def test_subrouter_top_level_include_overrides_generate_unique_id(): "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": { + "anyOf": [{"type": "string"}, {"type": "integer"}] + }, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, @@ -1089,7 +1097,9 @@ def test_router_path_operation_overrides_generate_unique_id(): "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": { + "anyOf": [{"type": "string"}, {"type": "integer"}] + }, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, @@ -1295,7 +1305,9 @@ def test_app_path_operation_overrides_generate_unique_id(): "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": { + "anyOf": [{"type": "string"}, {"type": "integer"}] + }, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, @@ -1579,7 +1591,9 @@ def test_callback_override_generate_unique_id(): "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": { + "anyOf": [{"type": "string"}, {"type": "integer"}] + }, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_param_include_in_schema.py b/tests/test_param_include_in_schema.py index 4eaac72d8..26aa63897 100644 --- a/tests/test_param_include_in_schema.py +++ b/tests/test_param_include_in_schema.py @@ -149,7 +149,7 @@ openapi_shema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tuples.py b/tests/test_tuples.py index 4cd5ee3af..2085dc367 100644 --- a/tests/test_tuples.py +++ b/tests/test_tuples.py @@ -200,7 +200,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_body/test_tutorial001_py310.py b/tests/test_tutorial/test_body/test_tutorial001_py310.py index e292b5346..dd9d9911e 100644 --- a/tests/test_tutorial/test_body/test_tutorial001_py310.py +++ b/tests/test_tutorial/test_body/test_tutorial001_py310.py @@ -61,7 +61,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_body_fields/test_tutorial001_py310.py b/tests/test_tutorial/test_body_fields/test_tutorial001_py310.py index d7a525ea7..993e2a91d 100644 --- a/tests/test_tutorial/test_body_fields/test_tutorial001_py310.py +++ b/tests/test_tutorial/test_body_fields/test_tutorial001_py310.py @@ -84,7 +84,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_body_multiple_params/test_tutorial001_py310.py b/tests/test_tutorial/test_body_multiple_params/test_tutorial001_py310.py index 85ba41ce6..5114ccea2 100644 --- a/tests/test_tutorial/test_body_multiple_params/test_tutorial001_py310.py +++ b/tests/test_tutorial/test_body_multiple_params/test_tutorial001_py310.py @@ -77,7 +77,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_body_multiple_params/test_tutorial003_py310.py b/tests/test_tutorial/test_body_multiple_params/test_tutorial003_py310.py index f896f7bf5..fc019d8bb 100644 --- a/tests/test_tutorial/test_body_multiple_params/test_tutorial003_py310.py +++ b/tests/test_tutorial/test_body_multiple_params/test_tutorial003_py310.py @@ -88,7 +88,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_body_nested_models/test_tutorial009_py39.py b/tests/test_tutorial/test_body_nested_models/test_tutorial009_py39.py index 17ca29ce5..5b8d82861 100644 --- a/tests/test_tutorial/test_body_nested_models/test_tutorial009_py39.py +++ b/tests/test_tutorial/test_body_nested_models/test_tutorial009_py39.py @@ -52,7 +52,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_body_updates/test_tutorial001_py310.py b/tests/test_tutorial/test_body_updates/test_tutorial001_py310.py index ca1d8c585..49279b320 100644 --- a/tests/test_tutorial/test_body_updates/test_tutorial001_py310.py +++ b/tests/test_tutorial/test_body_updates/test_tutorial001_py310.py @@ -108,7 +108,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_body_updates/test_tutorial001_py39.py b/tests/test_tutorial/test_body_updates/test_tutorial001_py39.py index f2b184c4f..872530bcf 100644 --- a/tests/test_tutorial/test_body_updates/test_tutorial001_py39.py +++ b/tests/test_tutorial/test_body_updates/test_tutorial001_py39.py @@ -108,7 +108,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_cookie_params/test_tutorial001_py310.py b/tests/test_tutorial/test_cookie_params/test_tutorial001_py310.py index 587a328da..5caa5c440 100644 --- a/tests/test_tutorial/test_cookie_params/test_tutorial001_py310.py +++ b/tests/test_tutorial/test_cookie_params/test_tutorial001_py310.py @@ -48,7 +48,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_dependencies/test_tutorial001_py310.py b/tests/test_tutorial/test_dependencies/test_tutorial001_py310.py index a7991170e..32a61c821 100644 --- a/tests/test_tutorial/test_dependencies/test_tutorial001_py310.py +++ b/tests/test_tutorial/test_dependencies/test_tutorial001_py310.py @@ -102,7 +102,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_dependencies/test_tutorial004_py310.py b/tests/test_tutorial/test_dependencies/test_tutorial004_py310.py index f66a36a99..e3ae0c741 100644 --- a/tests/test_tutorial/test_dependencies/test_tutorial004_py310.py +++ b/tests/test_tutorial/test_dependencies/test_tutorial004_py310.py @@ -60,7 +60,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_extra_data_types/test_tutorial001_py310.py b/tests/test_tutorial/test_extra_data_types/test_tutorial001_py310.py index 3d4c1d07d..4efdecc53 100644 --- a/tests/test_tutorial/test_extra_data_types/test_tutorial001_py310.py +++ b/tests/test_tutorial/test_extra_data_types/test_tutorial001_py310.py @@ -87,7 +87,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_extra_models/test_tutorial003_py310.py b/tests/test_tutorial/test_extra_models/test_tutorial003_py310.py index 185bc3a37..56fd83ad3 100644 --- a/tests/test_tutorial/test_extra_models/test_tutorial003_py310.py +++ b/tests/test_tutorial/test_extra_models/test_tutorial003_py310.py @@ -77,7 +77,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_generate_clients/test_tutorial003.py b/tests/test_tutorial/test_generate_clients/test_tutorial003.py index d79123163..128fcea30 100644 --- a/tests/test_tutorial/test_generate_clients/test_tutorial003.py +++ b/tests/test_tutorial/test_generate_clients/test_tutorial003.py @@ -147,7 +147,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_header_params/test_tutorial001_py310.py b/tests/test_tutorial/test_header_params/test_tutorial001_py310.py index f5ee17428..77a60eb9d 100644 --- a/tests/test_tutorial/test_header_params/test_tutorial001_py310.py +++ b/tests/test_tutorial/test_header_params/test_tutorial001_py310.py @@ -48,7 +48,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_path_operation_configurations/test_tutorial005_py310.py b/tests/test_tutorial/test_path_operation_configurations/test_tutorial005_py310.py index 1f617da70..43a7a610d 100644 --- a/tests/test_tutorial/test_path_operation_configurations/test_tutorial005_py310.py +++ b/tests/test_tutorial/test_path_operation_configurations/test_tutorial005_py310.py @@ -71,7 +71,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_path_operation_configurations/test_tutorial005_py39.py b/tests/test_tutorial/test_path_operation_configurations/test_tutorial005_py39.py index ffdf05081..62aa73ac5 100644 --- a/tests/test_tutorial/test_path_operation_configurations/test_tutorial005_py39.py +++ b/tests/test_tutorial/test_path_operation_configurations/test_tutorial005_py39.py @@ -71,7 +71,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_query_params/test_tutorial006_py310.py b/tests/test_tutorial/test_query_params/test_tutorial006_py310.py index 1986d27d0..141525f15 100644 --- a/tests/test_tutorial/test_query_params/test_tutorial006_py310.py +++ b/tests/test_tutorial/test_query_params/test_tutorial006_py310.py @@ -66,7 +66,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial001_py310.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial001_py310.py index 66b24017e..298b5d616 100644 --- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial001_py310.py +++ b/tests/test_tutorial/test_query_params_str_validations/test_tutorial001_py310.py @@ -57,7 +57,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_py310.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_py310.py index 8894ee1b5..9330037ed 100644 --- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_py310.py +++ b/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_py310.py @@ -52,7 +52,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_py39.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_py39.py index b10e70af7..11f23be27 100644 --- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_py39.py +++ b/tests/test_tutorial/test_query_params_str_validations/test_tutorial011_py39.py @@ -52,7 +52,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial012_py39.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial012_py39.py index a9cbce02a..b25bb2847 100644 --- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial012_py39.py +++ b/tests/test_tutorial/test_query_params_str_validations/test_tutorial012_py39.py @@ -53,7 +53,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial014.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial014.py index 98ae5a684..57b8b9d94 100644 --- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial014.py +++ b/tests/test_tutorial/test_query_params_str_validations/test_tutorial014.py @@ -53,7 +53,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_query_params_str_validations/test_tutorial014_py310.py b/tests/test_tutorial/test_query_params_str_validations/test_tutorial014_py310.py index 33f3d5f77..fe54fc080 100644 --- a/tests/test_tutorial/test_query_params_str_validations/test_tutorial014_py310.py +++ b/tests/test_tutorial/test_query_params_str_validations/test_tutorial014_py310.py @@ -51,7 +51,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_request_files/test_tutorial001_02.py b/tests/test_tutorial/test_request_files/test_tutorial001_02.py index e852a1b31..a254bf3e8 100644 --- a/tests/test_tutorial/test_request_files/test_tutorial001_02.py +++ b/tests/test_tutorial/test_request_files/test_tutorial001_02.py @@ -106,7 +106,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_request_files/test_tutorial001_02_py310.py b/tests/test_tutorial/test_request_files/test_tutorial001_02_py310.py index 62e9f98d0..15b6a8d53 100644 --- a/tests/test_tutorial/test_request_files/test_tutorial001_02_py310.py +++ b/tests/test_tutorial/test_request_files/test_tutorial001_02_py310.py @@ -107,7 +107,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_request_files/test_tutorial001_03.py b/tests/test_tutorial/test_request_files/test_tutorial001_03.py index ec7509ea2..c34165f18 100644 --- a/tests/test_tutorial/test_request_files/test_tutorial001_03.py +++ b/tests/test_tutorial/test_request_files/test_tutorial001_03.py @@ -120,7 +120,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_request_files/test_tutorial002_py39.py b/tests/test_tutorial/test_request_files/test_tutorial002_py39.py index bbdf25cd9..de4127057 100644 --- a/tests/test_tutorial/test_request_files/test_tutorial002_py39.py +++ b/tests/test_tutorial/test_request_files/test_tutorial002_py39.py @@ -119,7 +119,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_request_files/test_tutorial003.py b/tests/test_tutorial/test_request_files/test_tutorial003.py index 943b235ab..83aea66cd 100644 --- a/tests/test_tutorial/test_request_files/test_tutorial003.py +++ b/tests/test_tutorial/test_request_files/test_tutorial003.py @@ -132,7 +132,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_request_files/test_tutorial003_py39.py b/tests/test_tutorial/test_request_files/test_tutorial003_py39.py index d5fbd7889..56aeb54cd 100644 --- a/tests/test_tutorial/test_request_files/test_tutorial003_py39.py +++ b/tests/test_tutorial/test_request_files/test_tutorial003_py39.py @@ -132,7 +132,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_response_model/test_tutorial003_py310.py b/tests/test_tutorial/test_response_model/test_tutorial003_py310.py index ffba11662..9827dab8a 100644 --- a/tests/test_tutorial/test_response_model/test_tutorial003_py310.py +++ b/tests/test_tutorial/test_response_model/test_tutorial003_py310.py @@ -73,7 +73,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_response_model/test_tutorial004_py310.py b/tests/test_tutorial/test_response_model/test_tutorial004_py310.py index f1508a05d..7fc86fafa 100644 --- a/tests/test_tutorial/test_response_model/test_tutorial004_py310.py +++ b/tests/test_tutorial/test_response_model/test_tutorial004_py310.py @@ -69,7 +69,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_response_model/test_tutorial004_py39.py b/tests/test_tutorial/test_response_model/test_tutorial004_py39.py index e5d9c8b5f..405fe79f5 100644 --- a/tests/test_tutorial/test_response_model/test_tutorial004_py39.py +++ b/tests/test_tutorial/test_response_model/test_tutorial004_py39.py @@ -69,7 +69,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_response_model/test_tutorial005_py310.py b/tests/test_tutorial/test_response_model/test_tutorial005_py310.py index 6d7366f12..389a302e0 100644 --- a/tests/test_tutorial/test_response_model/test_tutorial005_py310.py +++ b/tests/test_tutorial/test_response_model/test_tutorial005_py310.py @@ -97,7 +97,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_response_model/test_tutorial006_py310.py b/tests/test_tutorial/test_response_model/test_tutorial006_py310.py index a3d8d204e..f870f3926 100644 --- a/tests/test_tutorial/test_response_model/test_tutorial006_py310.py +++ b/tests/test_tutorial/test_response_model/test_tutorial006_py310.py @@ -97,7 +97,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_schema_extra_example/test_tutorial004_py310.py b/tests/test_tutorial/test_schema_extra_example/test_tutorial004_py310.py index 4f9a2ff57..d326a5a09 100644 --- a/tests/test_tutorial/test_schema_extra_example/test_tutorial004_py310.py +++ b/tests/test_tutorial/test_schema_extra_example/test_tutorial004_py310.py @@ -102,7 +102,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_security/test_tutorial003_py310.py b/tests/test_tutorial/test_security/test_tutorial003_py310.py index e621bcd45..26f5c097f 100644 --- a/tests/test_tutorial/test_security/test_tutorial003_py310.py +++ b/tests/test_tutorial/test_security/test_tutorial003_py310.py @@ -80,7 +80,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_security/test_tutorial005_py310.py b/tests/test_tutorial/test_security/test_tutorial005_py310.py index 0c9372e2a..3144a2365 100644 --- a/tests/test_tutorial/test_security/test_tutorial005_py310.py +++ b/tests/test_tutorial/test_security/test_tutorial005_py310.py @@ -134,7 +134,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_security/test_tutorial005_py39.py b/tests/test_tutorial/test_security/test_tutorial005_py39.py index 099ab2526..290136e17 100644 --- a/tests/test_tutorial/test_security/test_tutorial005_py39.py +++ b/tests/test_tutorial/test_security/test_tutorial005_py39.py @@ -134,7 +134,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_sql_databases/test_sql_databases_middleware_py310.py b/tests/test_tutorial/test_sql_databases/test_sql_databases_middleware_py310.py index 1d0442eb5..d131b4b6a 100644 --- a/tests/test_tutorial/test_sql_databases/test_sql_databases_middleware_py310.py +++ b/tests/test_tutorial/test_sql_databases/test_sql_databases_middleware_py310.py @@ -263,7 +263,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_sql_databases/test_sql_databases_middleware_py39.py b/tests/test_tutorial/test_sql_databases/test_sql_databases_middleware_py39.py index 8764d07a6..470fb52fd 100644 --- a/tests/test_tutorial/test_sql_databases/test_sql_databases_middleware_py39.py +++ b/tests/test_tutorial/test_sql_databases/test_sql_databases_middleware_py39.py @@ -263,7 +263,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_sql_databases/test_sql_databases_py310.py b/tests/test_tutorial/test_sql_databases/test_sql_databases_py310.py index f7e73dea4..dc6a1db15 100644 --- a/tests/test_tutorial/test_sql_databases/test_sql_databases_py310.py +++ b/tests/test_tutorial/test_sql_databases/test_sql_databases_py310.py @@ -263,7 +263,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, diff --git a/tests/test_tutorial/test_sql_databases/test_sql_databases_py39.py b/tests/test_tutorial/test_sql_databases/test_sql_databases_py39.py index c194c85aa..ebf55ed01 100644 --- a/tests/test_tutorial/test_sql_databases/test_sql_databases_py39.py +++ b/tests/test_tutorial/test_sql_databases/test_sql_databases_py39.py @@ -263,7 +263,7 @@ openapi_schema = { "loc": { "title": "Location", "type": "array", - "items": {"type": "string"}, + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, }, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}, From 41d75b6d1c1ed27a733300b11f67a81309aa89fd Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 17 Apr 2022 20:56:09 +0000 Subject: [PATCH 49/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7adad85cf..016bf3469 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* ✅ Fix new/recent tests with new fixed `ValidationError` JSON Schema. PR [#4806](https://github.com/tiangolo/fastapi/pull/4806) by [@tiangolo](https://github.com/tiangolo). This release includes upgrades to third-party packages that handle security issues. Although there's a chance these issues don't affect you in particular, please upgrade as soon as possible. ### Fixes From 77fc14eb69725f6fb3cdf3e8745a54a4e93d5e7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 17 Apr 2022 23:00:49 +0200 Subject: [PATCH 50/59] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors,=20add:?= =?UTF-8?q?=20ExoFlare,=20Ines=20Course;=20remove:=20Dropbase,=20Vim.so,?= =?UTF-8?q?=20Calmcode;=20update:=20Striveworks,=20TalkPython=20and=20Test?= =?UTF-8?q?Driven.io=20(#4805)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +--- docs/en/data/sponsors.yml | 21 ++++++++---------- docs/en/data/sponsors_badge.yml | 5 ++--- docs/en/docs/img/sponsors/exoflare.png | Bin 0 -> 5357 bytes .../sponsors/fastapi-course-bundle-banner.png | Bin 0 -> 16235 bytes docs/en/docs/img/sponsors/ines-course.jpg | Bin 0 -> 11727 bytes docs/en/overrides/main.html | 20 +---------------- 7 files changed, 13 insertions(+), 37 deletions(-) create mode 100644 docs/en/docs/img/sponsors/exoflare.png create mode 100644 docs/en/docs/img/sponsors/fastapi-course-bundle-banner.png create mode 100644 docs/en/docs/img/sponsors/ines-course.jpg diff --git a/README.md b/README.md index 0fb25cc7e..a03a98719 100644 --- a/README.md +++ b/README.md @@ -49,15 +49,13 @@ The key features are: - - - + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 65a114584..35eff9d87 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -5,12 +5,6 @@ gold: - url: https://cryptapi.io/ title: "CryptAPI: Your easy to use, secure and privacy oriented payment gateway." img: https://fastapi.tiangolo.com/img/sponsors/cryptapi.svg - - url: https://www.dropbase.io/careers - title: Dropbase - seamlessly collect, clean, and centralize data. - img: https://fastapi.tiangolo.com/img/sponsors/dropbase.svg - - url: https://striveworks.us/careers?utm_source=fastapi&utm_medium=sponsor_banner&utm_campaign=feb_march#openings - title: https://striveworks.us/careers - img: https://fastapi.tiangolo.com/img/sponsors/striveworks.png - url: https://classiq.link/n4s title: Join the team building a new SaaS platform that will change the computing world img: https://fastapi.tiangolo.com/img/sponsors/classiq.png @@ -21,9 +15,6 @@ silver: - url: https://www.investsuite.com/jobs title: Wealthtech jobs with FastAPI img: https://fastapi.tiangolo.com/img/sponsors/investsuite.svg - - url: https://www.vim.so/?utm_source=FastAPI - title: We help you master vim with interactive exercises - img: https://fastapi.tiangolo.com/img/sponsors/vimso.png - url: https://talkpython.fm/fastapi-sponsor title: FastAPI video courses on demand from people you trust img: https://fastapi.tiangolo.com/img/sponsors/talkpython.png @@ -33,7 +24,13 @@ silver: - url: https://github.com/deepset-ai/haystack/ title: Build powerful search from composable, open source building blocks img: https://fastapi.tiangolo.com/img/sponsors/haystack-fastapi.svg + - url: https://www.udemy.com/course/fastapi-rest/ + title: Learn FastAPI by building a complete project. Extend your knowledge on advanced web development-AWS, Payments, Emails. + img: https://fastapi.tiangolo.com/img/sponsors/ines-course.jpg bronze: - - url: https://calmcode.io - title: Code. Simply. Clearly. Calmly. - img: https://fastapi.tiangolo.com/img/sponsors/calmcode.jpg + - url: https://www.exoflare.com/open-source/?utm_source=FastAPI&utm_campaign=open_source + title: Biosecurity risk assessments made easy. + img: https://fastapi.tiangolo.com/img/sponsors/exoflare.png + - url: https://striveworks.us/careers?utm_source=fastapi&utm_medium=sponsor_banner&utm_campaign=feb_march#openings + title: https://striveworks.us/careers + img: https://fastapi.tiangolo.com/img/sponsors/striveworks.png diff --git a/docs/en/data/sponsors_badge.yml b/docs/en/data/sponsors_badge.yml index dbf69c1b3..67dd16a8b 100644 --- a/docs/en/data/sponsors_badge.yml +++ b/docs/en/data/sponsors_badge.yml @@ -2,10 +2,9 @@ logins: - jina-ai - deta - investsuite - - vimsoHQ - mikeckennedy - - koaning - deepset-ai - cryptapi - - DropbaseHQ - Striveworks + - xoflare + - InesIvanova diff --git a/docs/en/docs/img/sponsors/exoflare.png b/docs/en/docs/img/sponsors/exoflare.png new file mode 100644 index 0000000000000000000000000000000000000000..3eed3af18a00c01f5940940a85386542b449dfd2 GIT binary patch literal 5357 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 z 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 V=0{$9ew6?K002ovPDHLkV1mi>sMi1h literal 0 HcmV?d00001 diff --git a/docs/en/docs/img/sponsors/ines-course.jpg b/docs/en/docs/img/sponsors/ines-course.jpg new file mode 100644 index 0000000000000000000000000000000000000000..05158b3872caa803c000c3dee1aa3f858ad5534f GIT binary patch literal 11727 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 literal 0 HcmV?d00001 diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index 83c26e72a..562bf3079 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -22,16 +22,10 @@
-
@@ -46,18 +40,6 @@
- -
From 1d106bd959b8c43f57aed06c1fd180ec8043281d Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 17 Apr 2022 21:01:21 +0000 Subject: [PATCH 51/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 016bf3469..ba0a8008e 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 🔧 Update sponsors, add: ExoFlare, Ines Course; remove: Dropbase, Vim.so, Calmcode; update: Striveworks, TalkPython and TestDriven.io. PR [#4805](https://github.com/tiangolo/fastapi/pull/4805) by [@tiangolo](https://github.com/tiangolo). * ✅ Fix new/recent tests with new fixed `ValidationError` JSON Schema. PR [#4806](https://github.com/tiangolo/fastapi/pull/4806) by [@tiangolo](https://github.com/tiangolo). This release includes upgrades to third-party packages that handle security issues. Although there's a chance these issues don't affect you in particular, please upgrade as soon as possible. From acd2287b576b42e07401adc40b958beea6bafb8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 17 Apr 2022 23:07:27 +0200 Subject: [PATCH 52/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index ba0a8008e..951a57daf 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,12 +2,11 @@ ## Latest Changes -* 🔧 Update sponsors, add: ExoFlare, Ines Course; remove: Dropbase, Vim.so, Calmcode; update: Striveworks, TalkPython and TestDriven.io. PR [#4805](https://github.com/tiangolo/fastapi/pull/4805) by [@tiangolo](https://github.com/tiangolo). -* ✅ Fix new/recent tests with new fixed `ValidationError` JSON Schema. PR [#4806](https://github.com/tiangolo/fastapi/pull/4806) by [@tiangolo](https://github.com/tiangolo). This release includes upgrades to third-party packages that handle security issues. Although there's a chance these issues don't affect you in particular, please upgrade as soon as possible. ### Fixes +* ✅ Fix new/recent tests with new fixed `ValidationError` JSON Schema. PR [#4806](https://github.com/tiangolo/fastapi/pull/4806) by [@tiangolo](https://github.com/tiangolo). * 🐛 Fix JSON Schema for `ValidationError` at field `loc`. PR [#3810](https://github.com/tiangolo/fastapi/pull/3810) by [@dconathan](https://github.com/dconathan). * 🐛 Fix support for prefix on APIRouter WebSockets. PR [#2640](https://github.com/tiangolo/fastapi/pull/2640) by [@Kludex](https://github.com/Kludex). @@ -19,6 +18,7 @@ This release includes upgrades to third-party packages that handle security issu ### Internal +* 🔧 Update sponsors, add: ExoFlare, Ines Course; remove: Dropbase, Vim.so, Calmcode; update: Striveworks, TalkPython and TestDriven.io. PR [#4805](https://github.com/tiangolo/fastapi/pull/4805) by [@tiangolo](https://github.com/tiangolo). * ⬆️ Upgrade Codecov GitHub Action. PR [#4801](https://github.com/tiangolo/fastapi/pull/4801) by [@tiangolo](https://github.com/tiangolo). ## 0.75.1 From 2b54432a9c78730b0dd69fca8f15d932d5a31d6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 17 Apr 2022 23:08:37 +0200 Subject: [PATCH 53/59] =?UTF-8?q?=F0=9F=94=96=20Release=20version=200.75.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 3 +++ fastapi/__init__.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 951a57daf..df3a36805 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,9 @@ ## Latest Changes + +## 0.75.2 + This release includes upgrades to third-party packages that handle security issues. Although there's a chance these issues don't affect you in particular, please upgrade as soon as possible. ### Fixes diff --git a/fastapi/__init__.py b/fastapi/__init__.py index 0ce2ef720..22d8e51ec 100644 --- a/fastapi/__init__.py +++ b/fastapi/__init__.py @@ -1,6 +1,6 @@ """FastAPI framework, high performance, easy to learn, fast to code, ready for production""" -__version__ = "0.75.1" +__version__ = "0.75.2" from starlette import status as status From 7c8383c96b3157ff8e5ada36332714b03b97e9bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 24 Apr 2022 17:31:12 +0200 Subject: [PATCH 54/59] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors,=20enabl?= =?UTF-8?q?e=20Dropbase=20again,=20update=20TalkPython=20link=20(#4821)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- docs/en/data/sponsors.yml | 5 ++++- docs/en/data/sponsors_badge.yml | 1 + docs/en/overrides/main.html | 6 ++++++ 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a03a98719..3756053e8 100644 --- a/README.md +++ b/README.md @@ -50,9 +50,10 @@ The key features are: + - + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 35eff9d87..a216be04d 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -8,6 +8,9 @@ gold: - url: https://classiq.link/n4s title: Join the team building a new SaaS platform that will change the computing world img: https://fastapi.tiangolo.com/img/sponsors/classiq.png + - url: https://www.dropbase.io/careers + title: Dropbase - seamlessly collect, clean, and centralize data. + img: https://fastapi.tiangolo.com/img/sponsors/dropbase.svg silver: - url: https://www.deta.sh/?ref=fastapi title: The launchpad for all your (team's) ideas @@ -15,7 +18,7 @@ silver: - url: https://www.investsuite.com/jobs title: Wealthtech jobs with FastAPI img: https://fastapi.tiangolo.com/img/sponsors/investsuite.svg - - url: https://talkpython.fm/fastapi-sponsor + - url: https://training.talkpython.fm/fastapi-courses title: FastAPI video courses on demand from people you trust img: https://fastapi.tiangolo.com/img/sponsors/talkpython.png - url: https://testdriven.io/courses/tdd-fastapi/ diff --git a/docs/en/data/sponsors_badge.yml b/docs/en/data/sponsors_badge.yml index 67dd16a8b..e0288356a 100644 --- a/docs/en/data/sponsors_badge.yml +++ b/docs/en/data/sponsors_badge.yml @@ -8,3 +8,4 @@ logins: - Striveworks - xoflare - InesIvanova + - DropbaseHQ diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index 562bf3079..cac02ca7c 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -46,6 +46,12 @@
+
{% endblock %} From 0fd99ec3378f7330271981b28258208b948cc7f4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 24 Apr 2022 15:31:48 +0000 Subject: [PATCH 55/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index df3a36805..568796dd0 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 🔧 Update sponsors, enable Dropbase again, update TalkPython link. PR [#4821](https://github.com/tiangolo/fastapi/pull/4821) by [@tiangolo](https://github.com/tiangolo). ## 0.75.2 From 4642d5bb862627f5653ef666b178689b21f129c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 24 Apr 2022 17:52:31 +0200 Subject: [PATCH 56/59] =?UTF-8?q?=F0=9F=8D=B1=20Update=20sponsor,=20ExoFla?= =?UTF-8?q?re=20badge=20(#4822)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/img/sponsors/exoflare.png | Bin 5357 -> 10556 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/en/docs/img/sponsors/exoflare.png b/docs/en/docs/img/sponsors/exoflare.png index 3eed3af18a00c01f5940940a85386542b449dfd2..b5977d80bedb27d3a17eb16aa919947867750a75 100644 GIT binary patch literal 10556 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 QoP0#6C}<$7k5S8vN%{#z-7Z@%O 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 Date: Sun, 24 Apr 2022 15:53:04 +0000 Subject: [PATCH 57/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 568796dd0..6c995148a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 🍱 Update sponsor, ExoFlare badge. PR [#4822](https://github.com/tiangolo/fastapi/pull/4822) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, enable Dropbase again, update TalkPython link. PR [#4821](https://github.com/tiangolo/fastapi/pull/4821) by [@tiangolo](https://github.com/tiangolo). ## 0.75.2 From 1920c3dd16909f00631fde1e71890dac048bf1de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 25 Apr 2022 12:01:39 +0200 Subject: [PATCH 58/59] =?UTF-8?q?=F0=9F=94=A7=20Add=20Budget=20Insight=20s?= =?UTF-8?q?ponsor=20(#4824)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + docs/en/data/sponsors.yml | 3 +++ docs/en/data/sponsors_badge.yml | 1 + docs/en/docs/img/sponsors/budget-insight.svg | 22 ++++++++++++++++++++ 4 files changed, 27 insertions(+) create mode 100644 docs/en/docs/img/sponsors/budget-insight.svg diff --git a/README.md b/README.md index 3756053e8..9ad50f271 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ The key features are: + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index a216be04d..ac825193b 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -30,6 +30,9 @@ silver: - url: https://www.udemy.com/course/fastapi-rest/ title: Learn FastAPI by building a complete project. Extend your knowledge on advanced web development-AWS, Payments, Emails. img: https://fastapi.tiangolo.com/img/sponsors/ines-course.jpg + - url: https://careers.budget-insight.com/ + title: Budget Insight is hiring! + img: https://fastapi.tiangolo.com/img/sponsors/budget-insight.svg bronze: - url: https://www.exoflare.com/open-source/?utm_source=FastAPI&utm_campaign=open_source title: Biosecurity risk assessments made easy. diff --git a/docs/en/data/sponsors_badge.yml b/docs/en/data/sponsors_badge.yml index e0288356a..1c8b0cde7 100644 --- a/docs/en/data/sponsors_badge.yml +++ b/docs/en/data/sponsors_badge.yml @@ -9,3 +9,4 @@ logins: - xoflare - InesIvanova - DropbaseHQ + - VincentParedes diff --git a/docs/en/docs/img/sponsors/budget-insight.svg b/docs/en/docs/img/sponsors/budget-insight.svg new file mode 100644 index 000000000..d753727a1 --- /dev/null +++ b/docs/en/docs/img/sponsors/budget-insight.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + From 146f57b8f70c5757dc20edc716dba1b96936a8d6 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 25 Apr 2022 10:02:17 +0000 Subject: [PATCH 59/59] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 6c995148a..44c1b647e 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 🔧 Add Budget Insight sponsor. PR [#4824](https://github.com/tiangolo/fastapi/pull/4824) by [@tiangolo](https://github.com/tiangolo). * 🍱 Update sponsor, ExoFlare badge. PR [#4822](https://github.com/tiangolo/fastapi/pull/4822) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, enable Dropbase again, update TalkPython link. PR [#4821](https://github.com/tiangolo/fastapi/pull/4821) by [@tiangolo](https://github.com/tiangolo).