From 2e14c69c311d89dde86e8c033df87773a3a50121 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 25 Oct 2023 00:26:06 +0400 Subject: [PATCH 01/37] =?UTF-8?q?=F0=9F=91=B7=20Adopt=20Ruff=20format=20(#?= =?UTF-8?q?10517)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🔧 Update pre-commit, use ruff format * ⬆️ Upgrade dependencies, use Ruff for formatting * 🔧 Update Ruff config * 🔨 Update lint and format scripts, use Ruff * 🎨 Format internals with Ruff * 🎨 Format docs scripts * 🎨 Format tests * 🎨 Format extra commas in src for docs * 📝 Update docs mentioning `@lru_cache()`, use `@lru_cache` instead to keep consistency with the format * 🎨 Update src for docs, use plain `@lru_cache` * 🎨 Update src for docs format and docs references --- .pre-commit-config.yaml | 14 ++------------ docs/em/docs/advanced/settings.md | 12 ++++++------ .../tutorial/query-params-str-validations.md | 4 ++-- docs/en/docs/advanced/settings.md | 12 ++++++------ .../tutorial/query-params-str-validations.md | 4 ++-- .../tutorial/query-params-str-validations.md | 4 ++-- docs/zh/docs/advanced/settings.md | 12 ++++++------ docs_src/header_params/tutorial002_an.py | 2 +- docs_src/header_params/tutorial002_an_py39.py | 2 +- .../tutorial004.py | 2 +- .../tutorial004_an.py | 2 +- .../tutorial004_an_py310.py | 2 +- .../tutorial004_an_py310_regex.py | 2 +- .../tutorial004_an_py39.py | 2 +- .../tutorial004_py310.py | 5 +++-- .../tutorial008.py | 2 +- .../tutorial008_an.py | 2 +- .../tutorial008_an_py310.py | 2 +- .../tutorial008_an_py39.py | 2 +- .../tutorial008_py310.py | 5 ++--- .../tutorial010.py | 2 +- .../tutorial010_an.py | 2 +- .../tutorial010_an_py310.py | 2 +- .../tutorial010_an_py39.py | 2 +- .../tutorial010_py310.py | 5 ++--- docs_src/settings/app02/main.py | 2 +- docs_src/settings/app02_an/main.py | 2 +- docs_src/settings/app02_an_py39/main.py | 2 +- docs_src/settings/app03/main.py | 2 +- docs_src/settings/app03_an/main.py | 2 +- docs_src/settings/app03_an_py39/main.py | 2 +- fastapi/_compat.py | 6 +++--- fastapi/applications.py | 6 ++---- fastapi/security/http.py | 2 +- fastapi/security/oauth2.py | 4 +--- fastapi/utils.py | 3 ++- pyproject.toml | 18 ++++++++++++++++++ requirements-docs-tests.txt | 1 - requirements-docs.txt | 2 ++ requirements-tests.txt | 2 +- scripts/docs.py | 6 +++--- scripts/format.sh | 2 +- scripts/lint.sh | 2 +- scripts/mkdocs_hooks.py | 4 ++-- tests/test_openapi_examples.py | 2 +- tests/test_schema_extra_examples.py | 4 ++-- 46 files changed, 94 insertions(+), 89 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9f7085f72f..a7f2fb3f22 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,23 +13,13 @@ repos: - --unsafe - id: end-of-file-fixer - id: trailing-whitespace -- repo: https://github.com/asottile/pyupgrade - rev: v3.7.0 - hooks: - - id: pyupgrade - args: - - --py3-plus - - --keep-runtime-typing - repo: https://github.com/charliermarsh/ruff-pre-commit - rev: v0.0.275 + rev: v0.1.2 hooks: - id: ruff args: - --fix -- repo: https://github.com/psf/black - rev: 23.3.0 - hooks: - - id: black + - id: ruff-format ci: autofix_commit_msg: 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks autoupdate_commit_msg: ⬆ [pre-commit.ci] pre-commit autoupdate diff --git a/docs/em/docs/advanced/settings.md b/docs/em/docs/advanced/settings.md index bc50bf755a..cc7a08bab8 100644 --- a/docs/em/docs/advanced/settings.md +++ b/docs/em/docs/advanced/settings.md @@ -221,7 +221,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" uvicorn main:app ``` !!! tip - 👥 🔜 🔬 `@lru_cache()` 🍖. + 👥 🔜 🔬 `@lru_cache` 🍖. 🔜 👆 💪 🤔 `get_settings()` 😐 🔢. @@ -302,7 +302,7 @@ def get_settings(): 👥 🔜 ✍ 👈 🎚 🔠 📨, & 👥 🔜 👂 `.env` 📁 🔠 📨. 👶 👶 -✋️ 👥 ⚙️ `@lru_cache()` 👨‍🎨 🔛 🔝, `Settings` 🎚 🔜 ✍ 🕴 🕐, 🥇 🕰 ⚫️ 🤙. 👶 👶 +✋️ 👥 ⚙️ `@lru_cache` 👨‍🎨 🔛 🔝, `Settings` 🎚 🔜 ✍ 🕴 🕐, 🥇 🕰 ⚫️ 🤙. 👶 👶 ```Python hl_lines="1 10" {!../../../docs_src/settings/app03/main.py!} @@ -312,14 +312,14 @@ def get_settings(): #### `lru_cache` 📡 ℹ -`@lru_cache()` 🔀 🔢 ⚫️ 🎀 📨 🎏 💲 👈 📨 🥇 🕰, ↩️ 💻 ⚫️ 🔄, 🛠️ 📟 🔢 🔠 🕰. +`@lru_cache` 🔀 🔢 ⚫️ 🎀 📨 🎏 💲 👈 📨 🥇 🕰, ↩️ 💻 ⚫️ 🔄, 🛠️ 📟 🔢 🔠 🕰. , 🔢 🔛 ⚫️ 🔜 🛠️ 🕐 🔠 🌀 ❌. & ⤴️ 💲 📨 🔠 👈 🌀 ❌ 🔜 ⚙️ 🔄 & 🔄 🕐❔ 🔢 🤙 ⏮️ ⚫️❔ 🎏 🌀 ❌. 🖼, 🚥 👆 ✔️ 🔢: ```Python -@lru_cache() +@lru_cache def say_hi(name: str, salutation: str = "Ms."): return f"Hello {salutation} {name}" ``` @@ -371,7 +371,7 @@ participant execute as Execute function 👈 🌌, ⚫️ 🎭 🌖 🚥 ⚫️ 🌐 🔢. ✋️ ⚫️ ⚙️ 🔗 🔢, ⤴️ 👥 💪 🔐 ⚫️ 💪 🔬. -`@lru_cache()` 🍕 `functools` ❔ 🍕 🐍 🐩 🗃, 👆 💪 ✍ 🌅 🔃 ⚫️ 🐍 🩺 `@lru_cache()`. +`@lru_cache` 🍕 `functools` ❔ 🍕 🐍 🐩 🗃, 👆 💪 ✍ 🌅 🔃 ⚫️ 🐍 🩺 `@lru_cache`. ## 🌃 @@ -379,4 +379,4 @@ participant execute as Execute function * ⚙️ 🔗 👆 💪 📉 🔬. * 👆 💪 ⚙️ `.env` 📁 ⏮️ ⚫️. -* ⚙️ `@lru_cache()` ➡️ 👆 ❎ 👂 🇨🇻 📁 🔄 & 🔄 🔠 📨, ⏪ 🤝 👆 🔐 ⚫️ ⏮️ 🔬. +* ⚙️ `@lru_cache` ➡️ 👆 ❎ 👂 🇨🇻 📁 🔄 & 🔄 🔠 📨, ⏪ 🤝 👆 🔐 ⚫️ ⏮️ 🔬. diff --git a/docs/em/docs/tutorial/query-params-str-validations.md b/docs/em/docs/tutorial/query-params-str-validations.md index d6b67bd518..f0e455abe1 100644 --- a/docs/em/docs/tutorial/query-params-str-validations.md +++ b/docs/em/docs/tutorial/query-params-str-validations.md @@ -371,7 +371,7 @@ http://localhost:8000/items/ === "🐍 3️⃣.1️⃣0️⃣ & 🔛" - ```Python hl_lines="12" + ```Python hl_lines="11" {!> ../../../docs_src/query_params_str_validations/tutorial008_py310.py!} ``` @@ -421,7 +421,7 @@ http://127.0.0.1:8000/items/?item-query=foobaritems === "🐍 3️⃣.1️⃣0️⃣ & 🔛" - ```Python hl_lines="17" + ```Python hl_lines="16" {!> ../../../docs_src/query_params_str_validations/tutorial010_py310.py!} ``` diff --git a/docs/en/docs/advanced/settings.md b/docs/en/docs/advanced/settings.md index d39130777f..32df900064 100644 --- a/docs/en/docs/advanced/settings.md +++ b/docs/en/docs/advanced/settings.md @@ -276,7 +276,7 @@ Now we create a dependency that returns a new `config.Settings()`. ``` !!! tip - We'll discuss the `@lru_cache()` in a bit. + We'll discuss the `@lru_cache` in a bit. For now you can assume `get_settings()` is a normal function. @@ -388,7 +388,7 @@ def get_settings(): we would create that object for each request, and we would be reading the `.env` file for each request. ⚠️ -But as we are using the `@lru_cache()` decorator on top, the `Settings` object will be created only once, the first time it's called. ✔️ +But as we are using the `@lru_cache` decorator on top, the `Settings` object will be created only once, the first time it's called. ✔️ === "Python 3.9+" @@ -415,14 +415,14 @@ Then for any subsequent calls of `get_settings()` in the dependencies for the ne #### `lru_cache` Technical Details -`@lru_cache()` modifies the function it decorates to return the same value that was returned the first time, instead of computing it again, executing the code of the function every time. +`@lru_cache` modifies the function it decorates to return the same value that was returned the first time, instead of computing it again, executing the code of the function every time. So, the function below it will be executed once for each combination of arguments. And then the values returned by each of those combinations of arguments will be used again and again whenever the function is called with exactly the same combination of arguments. For example, if you have a function: ```Python -@lru_cache() +@lru_cache def say_hi(name: str, salutation: str = "Ms."): return f"Hello {salutation} {name}" ``` @@ -474,7 +474,7 @@ In the case of our dependency `get_settings()`, the function doesn't even take a That way, it behaves almost as if it was just a global variable. But as it uses a dependency function, then we can override it easily for testing. -`@lru_cache()` is part of `functools` which is part of Python's standard library, you can read more about it in the Python docs for `@lru_cache()`. +`@lru_cache` is part of `functools` which is part of Python's standard library, you can read more about it in the Python docs for `@lru_cache`. ## Recap @@ -482,4 +482,4 @@ You can use Pydantic Settings to handle the settings or configurations for your * By using a dependency you can simplify testing. * You can use `.env` files with it. -* Using `@lru_cache()` lets you avoid reading the dotenv file again and again for each request, while allowing you to override it during testing. +* Using `@lru_cache` lets you avoid reading the dotenv file again and again for each request, while allowing you to override it during testing. diff --git a/docs/en/docs/tutorial/query-params-str-validations.md b/docs/en/docs/tutorial/query-params-str-validations.md index 0e777f6a09..91ae615fff 100644 --- a/docs/en/docs/tutorial/query-params-str-validations.md +++ b/docs/en/docs/tutorial/query-params-str-validations.md @@ -737,7 +737,7 @@ And a `description`: !!! tip Prefer to use the `Annotated` version if possible. - ```Python hl_lines="12" + ```Python hl_lines="11" {!> ../../../docs_src/query_params_str_validations/tutorial008_py310.py!} ``` @@ -835,7 +835,7 @@ Then pass the parameter `deprecated=True` to `Query`: !!! tip Prefer to use the `Annotated` version if possible. - ```Python hl_lines="17" + ```Python hl_lines="16" {!> ../../../docs_src/query_params_str_validations/tutorial010_py310.py!} ``` diff --git a/docs/ru/docs/tutorial/query-params-str-validations.md b/docs/ru/docs/tutorial/query-params-str-validations.md index 15be5dbf6b..cc826b8711 100644 --- a/docs/ru/docs/tutorial/query-params-str-validations.md +++ b/docs/ru/docs/tutorial/query-params-str-validations.md @@ -741,7 +741,7 @@ http://localhost:8000/items/ !!! tip "Подсказка" Рекомендуется использовать версию с `Annotated` если возможно. - ```Python hl_lines="12" + ```Python hl_lines="11" {!> ../../../docs_src/query_params_str_validations/tutorial008_py310.py!} ``` @@ -839,7 +839,7 @@ http://127.0.0.1:8000/items/?item-query=foobaritems !!! tip "Подсказка" Рекомендуется использовать версию с `Annotated` если возможно. - ```Python hl_lines="17" + ```Python hl_lines="16" {!> ../../../docs_src/query_params_str_validations/tutorial010_py310.py!} ``` diff --git a/docs/zh/docs/advanced/settings.md b/docs/zh/docs/advanced/settings.md index 7f718acefb..93e48a6105 100644 --- a/docs/zh/docs/advanced/settings.md +++ b/docs/zh/docs/advanced/settings.md @@ -239,7 +239,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp"uvicorn main:app ``` !!! tip - 我们稍后会讨论 `@lru_cache()`。 + 我们稍后会讨论 `@lru_cache`。 目前,您可以将 `get_settings()` 视为普通函数。 @@ -337,7 +337,7 @@ def get_settings(): 我们将为每个请求创建该对象,并且将在每个请求中读取 `.env` 文件。 ⚠️ -但是,由于我们在顶部使用了 `@lru_cache()` 装饰器,因此只有在第一次调用它时,才会创建 `Settings` 对象一次。 ✔️ +但是,由于我们在顶部使用了 `@lru_cache` 装饰器,因此只有在第一次调用它时,才会创建 `Settings` 对象一次。 ✔️ === "Python 3.9+" @@ -364,13 +364,13 @@ def get_settings(): #### `lru_cache` 技术细节 -`@lru_cache()` 修改了它所装饰的函数,以返回第一次返回的相同值,而不是再次计算它,每次都执行函数的代码。 +`@lru_cache` 修改了它所装饰的函数,以返回第一次返回的相同值,而不是再次计算它,每次都执行函数的代码。 因此,下面的函数将对每个参数组合执行一次。然后,每个参数组合返回的值将在使用完全相同的参数组合调用函数时再次使用。 例如,如果您有一个函数: ```Python -@lru_cache() +@lru_cache def say_hi(name: str, salutation: str = "Ms."): return f"Hello {salutation} {name}" ``` @@ -422,7 +422,7 @@ participant execute as Execute function 这样,它的行为几乎就像是一个全局变量。但是由于它使用了依赖项函数,因此我们可以轻松地进行测试时的覆盖。 -`@lru_cache()` 是 `functools` 的一部分,它是 Python 标准库的一部分,您可以在Python 文档中了解有关 `@lru_cache()` 的更多信息。 +`@lru_cache` 是 `functools` 的一部分,它是 Python 标准库的一部分,您可以在Python 文档中了解有关 `@lru_cache` 的更多信息。 ## 小结 @@ -430,4 +430,4 @@ participant execute as Execute function * 通过使用依赖项,您可以简化测试。 * 您可以使用 `.env` 文件。 -* 使用 `@lru_cache()` 可以避免为每个请求重复读取 dotenv 文件,同时允许您在测试时进行覆盖。 +* 使用 `@lru_cache` 可以避免为每个请求重复读取 dotenv 文件,同时允许您在测试时进行覆盖。 diff --git a/docs_src/header_params/tutorial002_an.py b/docs_src/header_params/tutorial002_an.py index 65d972d46e..82fe49ba2b 100644 --- a/docs_src/header_params/tutorial002_an.py +++ b/docs_src/header_params/tutorial002_an.py @@ -10,6 +10,6 @@ app = FastAPI() async def read_items( strange_header: Annotated[ Union[str, None], Header(convert_underscores=False) - ] = None + ] = None, ): return {"strange_header": strange_header} diff --git a/docs_src/header_params/tutorial002_an_py39.py b/docs_src/header_params/tutorial002_an_py39.py index 7f6a99f9c3..008e4b6e1a 100644 --- a/docs_src/header_params/tutorial002_an_py39.py +++ b/docs_src/header_params/tutorial002_an_py39.py @@ -9,6 +9,6 @@ app = FastAPI() async def read_items( strange_header: Annotated[ Union[str, None], Header(convert_underscores=False) - ] = None + ] = None, ): return {"strange_header": strange_header} diff --git a/docs_src/query_params_str_validations/tutorial004.py b/docs_src/query_params_str_validations/tutorial004.py index 3639b6c38f..64a647a16a 100644 --- a/docs_src/query_params_str_validations/tutorial004.py +++ b/docs_src/query_params_str_validations/tutorial004.py @@ -9,7 +9,7 @@ app = FastAPI() async def read_items( q: Union[str, None] = Query( default=None, min_length=3, max_length=50, pattern="^fixedquery$" - ) + ), ): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: diff --git a/docs_src/query_params_str_validations/tutorial004_an.py b/docs_src/query_params_str_validations/tutorial004_an.py index 24698c7b34..c75d45d63e 100644 --- a/docs_src/query_params_str_validations/tutorial004_an.py +++ b/docs_src/query_params_str_validations/tutorial004_an.py @@ -10,7 +10,7 @@ app = FastAPI() async def read_items( q: Annotated[ Union[str, None], Query(min_length=3, max_length=50, pattern="^fixedquery$") - ] = None + ] = None, ): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: diff --git a/docs_src/query_params_str_validations/tutorial004_an_py310.py b/docs_src/query_params_str_validations/tutorial004_an_py310.py index b7b629ee8a..20cf1988fd 100644 --- a/docs_src/query_params_str_validations/tutorial004_an_py310.py +++ b/docs_src/query_params_str_validations/tutorial004_an_py310.py @@ -9,7 +9,7 @@ app = FastAPI() async def read_items( q: Annotated[ str | None, Query(min_length=3, max_length=50, pattern="^fixedquery$") - ] = None + ] = None, ): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: diff --git a/docs_src/query_params_str_validations/tutorial004_an_py310_regex.py b/docs_src/query_params_str_validations/tutorial004_an_py310_regex.py index 8fd375b3d5..21e0d3eb85 100644 --- a/docs_src/query_params_str_validations/tutorial004_an_py310_regex.py +++ b/docs_src/query_params_str_validations/tutorial004_an_py310_regex.py @@ -9,7 +9,7 @@ app = FastAPI() async def read_items( q: Annotated[ str | None, Query(min_length=3, max_length=50, regex="^fixedquery$") - ] = None + ] = None, ): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: diff --git a/docs_src/query_params_str_validations/tutorial004_an_py39.py b/docs_src/query_params_str_validations/tutorial004_an_py39.py index 8e9a6fc32d..de27097b38 100644 --- a/docs_src/query_params_str_validations/tutorial004_an_py39.py +++ b/docs_src/query_params_str_validations/tutorial004_an_py39.py @@ -9,7 +9,7 @@ app = FastAPI() async def read_items( q: Annotated[ Union[str, None], Query(min_length=3, max_length=50, pattern="^fixedquery$") - ] = None + ] = None, ): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: diff --git a/docs_src/query_params_str_validations/tutorial004_py310.py b/docs_src/query_params_str_validations/tutorial004_py310.py index f80798bcb8..7801e75000 100644 --- a/docs_src/query_params_str_validations/tutorial004_py310.py +++ b/docs_src/query_params_str_validations/tutorial004_py310.py @@ -5,8 +5,9 @@ app = FastAPI() @app.get("/items/") async def read_items( - q: str - | None = Query(default=None, min_length=3, max_length=50, pattern="^fixedquery$") + q: str | None = Query( + default=None, min_length=3, max_length=50, pattern="^fixedquery$" + ), ): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: diff --git a/docs_src/query_params_str_validations/tutorial008.py b/docs_src/query_params_str_validations/tutorial008.py index d112a9ab8a..e3e0b50aa1 100644 --- a/docs_src/query_params_str_validations/tutorial008.py +++ b/docs_src/query_params_str_validations/tutorial008.py @@ -12,7 +12,7 @@ async def read_items( title="Query string", description="Query string for the items to search in the database that have a good match", min_length=3, - ) + ), ): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: diff --git a/docs_src/query_params_str_validations/tutorial008_an.py b/docs_src/query_params_str_validations/tutorial008_an.py index 5699f1e88d..01606a9203 100644 --- a/docs_src/query_params_str_validations/tutorial008_an.py +++ b/docs_src/query_params_str_validations/tutorial008_an.py @@ -15,7 +15,7 @@ async def read_items( description="Query string for the items to search in the database that have a good match", min_length=3, ), - ] = None + ] = None, ): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: diff --git a/docs_src/query_params_str_validations/tutorial008_an_py310.py b/docs_src/query_params_str_validations/tutorial008_an_py310.py index 4aaadf8b47..44b3082b63 100644 --- a/docs_src/query_params_str_validations/tutorial008_an_py310.py +++ b/docs_src/query_params_str_validations/tutorial008_an_py310.py @@ -14,7 +14,7 @@ async def read_items( description="Query string for the items to search in the database that have a good match", min_length=3, ), - ] = None + ] = None, ): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: diff --git a/docs_src/query_params_str_validations/tutorial008_an_py39.py b/docs_src/query_params_str_validations/tutorial008_an_py39.py index 1c3b361765..f3f2f2c0e7 100644 --- a/docs_src/query_params_str_validations/tutorial008_an_py39.py +++ b/docs_src/query_params_str_validations/tutorial008_an_py39.py @@ -14,7 +14,7 @@ async def read_items( description="Query string for the items to search in the database that have a good match", min_length=3, ), - ] = None + ] = None, ): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: diff --git a/docs_src/query_params_str_validations/tutorial008_py310.py b/docs_src/query_params_str_validations/tutorial008_py310.py index 489f631d5e..5743852726 100644 --- a/docs_src/query_params_str_validations/tutorial008_py310.py +++ b/docs_src/query_params_str_validations/tutorial008_py310.py @@ -5,13 +5,12 @@ app = FastAPI() @app.get("/items/") async def read_items( - q: str - | None = Query( + q: str | None = Query( default=None, title="Query string", description="Query string for the items to search in the database that have a good match", min_length=3, - ) + ), ): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: diff --git a/docs_src/query_params_str_validations/tutorial010.py b/docs_src/query_params_str_validations/tutorial010.py index 3314f8b6d6..ff29176fe5 100644 --- a/docs_src/query_params_str_validations/tutorial010.py +++ b/docs_src/query_params_str_validations/tutorial010.py @@ -16,7 +16,7 @@ async def read_items( max_length=50, pattern="^fixedquery$", deprecated=True, - ) + ), ): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: diff --git a/docs_src/query_params_str_validations/tutorial010_an.py b/docs_src/query_params_str_validations/tutorial010_an.py index c5df00897f..ed343230f4 100644 --- a/docs_src/query_params_str_validations/tutorial010_an.py +++ b/docs_src/query_params_str_validations/tutorial010_an.py @@ -19,7 +19,7 @@ async def read_items( pattern="^fixedquery$", deprecated=True, ), - ] = None + ] = None, ): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: diff --git a/docs_src/query_params_str_validations/tutorial010_an_py310.py b/docs_src/query_params_str_validations/tutorial010_an_py310.py index a8e8c099b5..775095bda8 100644 --- a/docs_src/query_params_str_validations/tutorial010_an_py310.py +++ b/docs_src/query_params_str_validations/tutorial010_an_py310.py @@ -18,7 +18,7 @@ async def read_items( pattern="^fixedquery$", deprecated=True, ), - ] = None + ] = None, ): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: diff --git a/docs_src/query_params_str_validations/tutorial010_an_py39.py b/docs_src/query_params_str_validations/tutorial010_an_py39.py index 955880dd6a..b126c116f0 100644 --- a/docs_src/query_params_str_validations/tutorial010_an_py39.py +++ b/docs_src/query_params_str_validations/tutorial010_an_py39.py @@ -18,7 +18,7 @@ async def read_items( pattern="^fixedquery$", deprecated=True, ), - ] = None + ] = None, ): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: diff --git a/docs_src/query_params_str_validations/tutorial010_py310.py b/docs_src/query_params_str_validations/tutorial010_py310.py index 9ea7b3c49f..530e6cf5b6 100644 --- a/docs_src/query_params_str_validations/tutorial010_py310.py +++ b/docs_src/query_params_str_validations/tutorial010_py310.py @@ -5,8 +5,7 @@ app = FastAPI() @app.get("/items/") async def read_items( - q: str - | None = Query( + q: str | None = Query( default=None, alias="item-query", title="Query string", @@ -15,7 +14,7 @@ async def read_items( max_length=50, pattern="^fixedquery$", deprecated=True, - ) + ), ): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: diff --git a/docs_src/settings/app02/main.py b/docs_src/settings/app02/main.py index 163aa26142..941f82e6b3 100644 --- a/docs_src/settings/app02/main.py +++ b/docs_src/settings/app02/main.py @@ -7,7 +7,7 @@ from .config import Settings app = FastAPI() -@lru_cache() +@lru_cache def get_settings(): return Settings() diff --git a/docs_src/settings/app02_an/main.py b/docs_src/settings/app02_an/main.py index cb679202d6..3a578cc338 100644 --- a/docs_src/settings/app02_an/main.py +++ b/docs_src/settings/app02_an/main.py @@ -8,7 +8,7 @@ from .config import Settings app = FastAPI() -@lru_cache() +@lru_cache def get_settings(): return Settings() diff --git a/docs_src/settings/app02_an_py39/main.py b/docs_src/settings/app02_an_py39/main.py index 61be74fcb9..6d5db12a87 100644 --- a/docs_src/settings/app02_an_py39/main.py +++ b/docs_src/settings/app02_an_py39/main.py @@ -8,7 +8,7 @@ from .config import Settings app = FastAPI() -@lru_cache() +@lru_cache def get_settings(): return Settings() diff --git a/docs_src/settings/app03/main.py b/docs_src/settings/app03/main.py index 69bc8c6e0e..ea64a5709c 100644 --- a/docs_src/settings/app03/main.py +++ b/docs_src/settings/app03/main.py @@ -7,7 +7,7 @@ from . import config app = FastAPI() -@lru_cache() +@lru_cache def get_settings(): return config.Settings() diff --git a/docs_src/settings/app03_an/main.py b/docs_src/settings/app03_an/main.py index c33b98f474..2f64b9cd17 100644 --- a/docs_src/settings/app03_an/main.py +++ b/docs_src/settings/app03_an/main.py @@ -8,7 +8,7 @@ from . import config app = FastAPI() -@lru_cache() +@lru_cache def get_settings(): return config.Settings() diff --git a/docs_src/settings/app03_an_py39/main.py b/docs_src/settings/app03_an_py39/main.py index b89c6b6cf4..62f3476396 100644 --- a/docs_src/settings/app03_an_py39/main.py +++ b/docs_src/settings/app03_an_py39/main.py @@ -8,7 +8,7 @@ from . import config app = FastAPI() -@lru_cache() +@lru_cache def get_settings(): return config.Settings() diff --git a/fastapi/_compat.py b/fastapi/_compat.py index a4b305d429..fc605d0ec6 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -197,9 +197,9 @@ if PYDANTIC_V2: if "$ref" not in json_schema: # TODO remove when deprecating Pydantic v1 # Ref: https://github.com/pydantic/pydantic/blob/d61792cc42c80b13b23e3ffa74bc37ec7c77f7d1/pydantic/schema.py#L207 - json_schema[ - "title" - ] = field.field_info.title or field.alias.title().replace("_", " ") + json_schema["title"] = ( + field.field_info.title or field.alias.title().replace("_", " ") + ) return json_schema def get_compat_model_name_map(fields: List[ModelField]) -> ModelNameMap: diff --git a/fastapi/applications.py b/fastapi/applications.py index 8ca374a54e..3021d75937 100644 --- a/fastapi/applications.py +++ b/fastapi/applications.py @@ -896,9 +896,7 @@ class FastAPI(Starlette): [FastAPI docs for OpenAPI Webhooks](https://fastapi.tiangolo.com/advanced/openapi-webhooks/). """ ), - ] = ( - webhooks or routing.APIRouter() - ) + ] = webhooks or routing.APIRouter() self.root_path = root_path or openapi_prefix self.state: Annotated[ State, @@ -951,7 +949,7 @@ class FastAPI(Starlette): ) self.exception_handlers: Dict[ Any, Callable[[Request, Any], Union[Response, Awaitable[Response]]] - ] = ({} if exception_handlers is None else dict(exception_handlers)) + ] = {} if exception_handlers is None else dict(exception_handlers) self.exception_handlers.setdefault(HTTPException, http_exception_handler) self.exception_handlers.setdefault( RequestValidationError, request_validation_exception_handler diff --git a/fastapi/security/http.py b/fastapi/security/http.py index 3627777d67..738455de38 100644 --- a/fastapi/security/http.py +++ b/fastapi/security/http.py @@ -210,7 +210,7 @@ class HTTPBasic(HTTPBase): try: data = b64decode(param).decode("ascii") except (ValueError, UnicodeDecodeError, binascii.Error): - raise invalid_user_credentials_exc + raise invalid_user_credentials_exc # noqa: B904 username, separator, password = data.partition(":") if not separator: raise invalid_user_credentials_exc diff --git a/fastapi/security/oauth2.py b/fastapi/security/oauth2.py index d427783add..9281dfb64f 100644 --- a/fastapi/security/oauth2.py +++ b/fastapi/security/oauth2.py @@ -626,9 +626,7 @@ class SecurityScopes: The list of all the scopes required by dependencies. """ ), - ] = ( - scopes or [] - ) + ] = scopes or [] self.scope_str: Annotated[ str, Doc( diff --git a/fastapi/utils.py b/fastapi/utils.py index 53b47a1604..f8463dda24 100644 --- a/fastapi/utils.py +++ b/fastapi/utils.py @@ -152,7 +152,8 @@ def create_cloned_field( ] if field.key_field: # type: ignore[attr-defined] new_field.key_field = create_cloned_field( # type: ignore[attr-defined] - field.key_field, cloned_types=cloned_types # type: ignore[attr-defined] + field.key_field, # type: ignore[attr-defined] + cloned_types=cloned_types, ) new_field.validators = field.validators # type: ignore[attr-defined] new_field.pre_validators = field.pre_validators # type: ignore[attr-defined] diff --git a/pyproject.toml b/pyproject.toml index addde1d33f..e67486ae31 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -130,11 +130,13 @@ select = [ "I", # isort "C", # flake8-comprehensions "B", # flake8-bugbear + "UP", # pyupgrade ] ignore = [ "E501", # line too long, handled by black "B008", # do not perform function calls in argument defaults "C901", # too complex + "W191", # indentation contains tabs ] [tool.ruff.per-file-ignores] @@ -154,6 +156,22 @@ ignore = [ "docs_src/query_params_str_validations/tutorial012_an_py39.py" = ["B006"] "docs_src/query_params_str_validations/tutorial013_an.py" = ["B006"] "docs_src/query_params_str_validations/tutorial013_an_py39.py" = ["B006"] +"docs_src/security/tutorial004.py" = ["B904"] +"docs_src/security/tutorial004_an.py" = ["B904"] +"docs_src/security/tutorial004_an_py310.py" = ["B904"] +"docs_src/security/tutorial004_an_py39.py" = ["B904"] +"docs_src/security/tutorial004_py310.py" = ["B904"] +"docs_src/security/tutorial005.py" = ["B904"] +"docs_src/security/tutorial005_an.py" = ["B904"] +"docs_src/security/tutorial005_an_py310.py" = ["B904"] +"docs_src/security/tutorial005_an_py39.py" = ["B904"] +"docs_src/security/tutorial005_py310.py" = ["B904"] +"docs_src/security/tutorial005_py39.py" = ["B904"] + [tool.ruff.isort] known-third-party = ["fastapi", "pydantic", "starlette"] + +[tool.ruff.pyupgrade] +# Preserve types, even if a file imports `from __future__ import annotations`. +keep-runtime-typing = true diff --git a/requirements-docs-tests.txt b/requirements-docs-tests.txt index 1a4a572679..b82df49338 100644 --- a/requirements-docs-tests.txt +++ b/requirements-docs-tests.txt @@ -1,3 +1,2 @@ # For mkdocstrings and tests httpx >=0.23.0,<0.25.0 -black == 23.3.0 diff --git a/requirements-docs.txt b/requirements-docs.txt index 3e0df64839..69302f655e 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -15,3 +15,5 @@ pillow==9.5.0 cairosvg==2.7.0 mkdocstrings[python]==0.23.0 griffe-typingdoc==0.2.2 +# For griffe, it formats with black +black==23.3.0 diff --git a/requirements-tests.txt b/requirements-tests.txt index de8d3f26ce..e1a976c138 100644 --- a/requirements-tests.txt +++ b/requirements-tests.txt @@ -4,7 +4,7 @@ pydantic-settings >=2.0.0 pytest >=7.1.3,<8.0.0 coverage[toml] >= 6.5.0,< 8.0 mypy ==1.4.1 -ruff ==0.0.275 +ruff ==0.1.2 email_validator >=1.1.1,<3.0.0 dirty-equals ==0.6.0 # TODO: once removing databases from tutorial, upgrade SQLAlchemy diff --git a/scripts/docs.py b/scripts/docs.py index 0023c670cd..73e1900ada 100644 --- a/scripts/docs.py +++ b/scripts/docs.py @@ -36,7 +36,7 @@ site_path = Path("site").absolute() build_site_path = Path("site_build").absolute() -@lru_cache() +@lru_cache def is_mkdocs_insiders() -> bool: version = metadata.version("mkdocs-material") return "insiders" in version @@ -104,7 +104,7 @@ def new_lang(lang: str = typer.Argument(..., callback=lang_callback)): def build_lang( lang: str = typer.Argument( ..., callback=lang_callback, autocompletion=complete_existing_lang - ) + ), ) -> None: """ Build the docs for a language. @@ -251,7 +251,7 @@ def serve() -> None: def live( lang: str = typer.Argument( None, callback=lang_callback, autocompletion=complete_existing_lang - ) + ), ) -> None: """ Serve with livereload a docs site for a specific language. diff --git a/scripts/format.sh b/scripts/format.sh index 3fb3eb4f19..11f25f1ce8 100755 --- a/scripts/format.sh +++ b/scripts/format.sh @@ -2,4 +2,4 @@ set -x ruff fastapi tests docs_src scripts --fix -black fastapi tests docs_src scripts +ruff format fastapi tests docs_src scripts diff --git a/scripts/lint.sh b/scripts/lint.sh index 4db5caa962..c0e24db9f6 100755 --- a/scripts/lint.sh +++ b/scripts/lint.sh @@ -5,4 +5,4 @@ set -x mypy fastapi ruff fastapi tests docs_src scripts -black fastapi tests --check +ruff format fastapi tests --check diff --git a/scripts/mkdocs_hooks.py b/scripts/mkdocs_hooks.py index 2b6a056420..8335a13f62 100644 --- a/scripts/mkdocs_hooks.py +++ b/scripts/mkdocs_hooks.py @@ -14,14 +14,14 @@ non_traslated_sections = [ ] -@lru_cache() +@lru_cache def get_missing_translation_content(docs_dir: str) -> str: docs_dir_path = Path(docs_dir) missing_translation_path = docs_dir_path.parent.parent / "missing-translation.md" return missing_translation_path.read_text(encoding="utf-8") -@lru_cache() +@lru_cache def get_mkdocs_material_langs() -> List[str]: material_path = Path(material.__file__).parent material_langs_path = material_path / "templates" / "partials" / "languages" diff --git a/tests/test_openapi_examples.py b/tests/test_openapi_examples.py index 70664a8a4c..6597e5058b 100644 --- a/tests/test_openapi_examples.py +++ b/tests/test_openapi_examples.py @@ -28,7 +28,7 @@ def examples( "value": {"data": "Data in Body examples, example2"}, }, }, - ) + ), ): return item diff --git a/tests/test_schema_extra_examples.py b/tests/test_schema_extra_examples.py index a1505afe23..b313f47e90 100644 --- a/tests/test_schema_extra_examples.py +++ b/tests/test_schema_extra_examples.py @@ -40,7 +40,7 @@ def create_app(): {"data": "Data in Body examples, example1"}, {"data": "Data in Body examples, example2"}, ], - ) + ), ): return item @@ -54,7 +54,7 @@ def create_app(): {"data": "examples example_examples 1"}, {"data": "examples example_examples 2"}, ], - ) + ), ): return item From 223970e03c3ac43e3bec059f5b094e68029e9396 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 24 Oct 2023 20:26:43 +0000 Subject: [PATCH 02/37] =?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 74b0b1b277..0acca3761f 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,7 @@ hide: ## Latest Changes +* 👷 Adopt Ruff format. PR [#10517](https://github.com/tiangolo/fastapi/pull/10517) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add `CITATION.cff` file for academic citations. PR [#10496](https://github.com/tiangolo/fastapi/pull/10496) by [@tiangolo](https://github.com/tiangolo). * 📝 Update data structure and render for external-links. PR [#10495](https://github.com/tiangolo/fastapi/pull/10495) by [@tiangolo](https://github.com/tiangolo). * 🐛 Fix overriding MKDocs theme lang in hook. PR [#10490](https://github.com/tiangolo/fastapi/pull/10490) by [@tiangolo](https://github.com/tiangolo). From f7e338dcd832b4fb9d3236f622fb6bf6e97ef40d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 25 Oct 2023 12:25:03 +0400 Subject: [PATCH 03/37] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors=20badges?= =?UTF-8?q?,=20Databento=20(#10519)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/data/sponsors_badge.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/data/sponsors_badge.yml b/docs/en/data/sponsors_badge.yml index d67e27c877..acbcc22056 100644 --- a/docs/en/data/sponsors_badge.yml +++ b/docs/en/data/sponsors_badge.yml @@ -14,6 +14,7 @@ logins: - nihpo - armand-sauzay - databento-bot + - databento - nanram22 - Flint-company - porter-dev From 2754d4e0fe2e45673d4ded8491a40f6d1bcd1d80 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 25 Oct 2023 08:25:52 +0000 Subject: [PATCH 04/37] =?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 0acca3761f..d761fa20bc 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,7 @@ hide: ## Latest Changes +* 🔧 Update sponsors badges, Databento. PR [#10519](https://github.com/tiangolo/fastapi/pull/10519) by [@tiangolo](https://github.com/tiangolo). * 👷 Adopt Ruff format. PR [#10517](https://github.com/tiangolo/fastapi/pull/10517) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add `CITATION.cff` file for academic citations. PR [#10496](https://github.com/tiangolo/fastapi/pull/10496) by [@tiangolo](https://github.com/tiangolo). * 📝 Update data structure and render for external-links. PR [#10495](https://github.com/tiangolo/fastapi/pull/10495) by [@tiangolo](https://github.com/tiangolo). From e45cbb7e5e804079a0eb57b3175a77b4d18a5fe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 29 Oct 2023 13:12:11 +0400 Subject: [PATCH 05/37] =?UTF-8?q?=F0=9F=91=B7=20Install=20MkDocs=20Materia?= =?UTF-8?q?l=20Insiders=20only=20when=20secrets=20are=20available,=20for?= =?UTF-8?q?=20Dependabot=20(#10544)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build-docs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 4100781c5a..701c74697f 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -50,7 +50,7 @@ jobs: run: pip install -r requirements-docs.txt # Install MkDocs Material Insiders here just to put it in the cache for the rest of the steps - name: Install Material for MkDocs Insiders - if: ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false ) && steps.cache.outputs.cache-hit != 'true' + if: ( github.event_name != 'pull_request' || github.secret_source == 'Actions' ) && steps.cache.outputs.cache-hit != 'true' run: | pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/squidfunk/mkdocs-material-insiders.git pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/griffe-typing-deprecated.git @@ -88,7 +88,7 @@ jobs: if: steps.cache.outputs.cache-hit != 'true' run: pip install -r requirements-docs.txt - name: Install Material for MkDocs Insiders - if: ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false ) && steps.cache.outputs.cache-hit != 'true' + if: ( github.event_name != 'pull_request' || github.secret_source != 'Actions' ) && steps.cache.outputs.cache-hit != 'true' run: | pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/squidfunk/mkdocs-material-insiders.git pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/griffe-typing-deprecated.git From 072c701b0ed5c831f6c923d2af9d89eef4eacbf7 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 29 Oct 2023 09:12:56 +0000 Subject: [PATCH 06/37] =?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 d761fa20bc..9db471b3fa 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,7 @@ hide: ## Latest Changes +* 👷 Install MkDocs Material Insiders only when secrets are available, for Dependabot. PR [#10544](https://github.com/tiangolo/fastapi/pull/10544) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors badges, Databento. PR [#10519](https://github.com/tiangolo/fastapi/pull/10519) by [@tiangolo](https://github.com/tiangolo). * 👷 Adopt Ruff format. PR [#10517](https://github.com/tiangolo/fastapi/pull/10517) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add `CITATION.cff` file for academic citations. PR [#10496](https://github.com/tiangolo/fastapi/pull/10496) by [@tiangolo](https://github.com/tiangolo). From e0c5beb5c8d22c90e9ae8c0d72728a60d451edd2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 29 Oct 2023 13:32:50 +0400 Subject: [PATCH 07/37] =?UTF-8?q?=E2=AC=86=20Bump=20mkdocs-material=20from?= =?UTF-8?q?=209.1.21=20to=209.4.7=20(#10545)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.1.21 to 9.4.7. - [Release notes](https://github.com/squidfunk/mkdocs-material/releases) - [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG) - [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.1.21...9.4.7) --- updated-dependencies: - dependency-name: mkdocs-material dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements-docs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-docs.txt b/requirements-docs.txt index 69302f655e..83dc94ee01 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -1,6 +1,6 @@ -e . -r requirements-docs-tests.txt -mkdocs-material==9.1.21 +mkdocs-material==9.4.7 mdx-include >=1.4.1,<2.0.0 mkdocs-markdownextradata-plugin >=0.1.7,<0.3.0 mkdocs-redirects>=1.2.1,<1.3.0 From 378e590757814099abdd49a7e42d1a393db2a206 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 29 Oct 2023 09:33:30 +0000 Subject: [PATCH 09/37] =?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 9db471b3fa..036e8c45c7 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,7 @@ hide: ## Latest Changes +* ⬆ Bump mkdocs-material from 9.1.21 to 9.4.7. PR [#10545](https://github.com/tiangolo/fastapi/pull/10545) by [@dependabot[bot]](https://github.com/apps/dependabot). * 👷 Install MkDocs Material Insiders only when secrets are available, for Dependabot. PR [#10544](https://github.com/tiangolo/fastapi/pull/10544) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors badges, Databento. PR [#10519](https://github.com/tiangolo/fastapi/pull/10519) by [@tiangolo](https://github.com/tiangolo). * 👷 Adopt Ruff format. PR [#10517](https://github.com/tiangolo/fastapi/pull/10517) by [@tiangolo](https://github.com/tiangolo). From 38db1fe074ba48b8b60827d0aa4e523d888e5a07 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 29 Oct 2023 09:33:47 +0000 Subject: [PATCH 10/37] =?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 036e8c45c7..94c3451f85 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,7 @@ hide: ## Latest Changes +* ⬆ Update mkdocs-material requirement from <9.0.0,>=8.1.4 to >=8.1.4,<10.0.0. PR [#5862](https://github.com/tiangolo/fastapi/pull/5862) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump mkdocs-material from 9.1.21 to 9.4.7. PR [#10545](https://github.com/tiangolo/fastapi/pull/10545) by [@dependabot[bot]](https://github.com/apps/dependabot). * 👷 Install MkDocs Material Insiders only when secrets are available, for Dependabot. PR [#10544](https://github.com/tiangolo/fastapi/pull/10544) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors badges, Databento. PR [#10519](https://github.com/tiangolo/fastapi/pull/10519) by [@tiangolo](https://github.com/tiangolo). From 0b83491843ddeecea6708a58b25cd895f446e364 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 29 Oct 2023 13:49:21 +0400 Subject: [PATCH 11/37] =?UTF-8?q?=E2=AC=86=20Bump=20pillow=20from=209.5.0?= =?UTF-8?q?=20to=2010.1.0=20(#10446)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [pillow](https://github.com/python-pillow/Pillow) from 9.5.0 to 10.1.0. - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/9.5.0...10.1.0) --- updated-dependencies: - dependency-name: pillow dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements-docs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-docs.txt b/requirements-docs.txt index 83dc94ee01..28408a9f1b 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -10,7 +10,7 @@ pyyaml >=5.3.1,<7.0.0 # For Material for MkDocs, Chinese search jieba==0.42.1 # For image processing by Material for MkDocs -pillow==9.5.0 +pillow==10.1.0 # For image processing by Material for MkDocs cairosvg==2.7.0 mkdocstrings[python]==0.23.0 From b84f9f6ecb4292fb51f22314ff7e60b3eadb97c0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 29 Oct 2023 09:49:57 +0000 Subject: [PATCH 12/37] =?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 94c3451f85..ea2284cd52 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,7 @@ hide: ## Latest Changes +* ⬆ Bump pillow from 9.5.0 to 10.1.0. PR [#10446](https://github.com/tiangolo/fastapi/pull/10446) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Update mkdocs-material requirement from <9.0.0,>=8.1.4 to >=8.1.4,<10.0.0. PR [#5862](https://github.com/tiangolo/fastapi/pull/5862) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump mkdocs-material from 9.1.21 to 9.4.7. PR [#10545](https://github.com/tiangolo/fastapi/pull/10545) by [@dependabot[bot]](https://github.com/apps/dependabot). * 👷 Install MkDocs Material Insiders only when secrets are available, for Dependabot. PR [#10544](https://github.com/tiangolo/fastapi/pull/10544) by [@tiangolo](https://github.com/tiangolo). From fbe6ba6df119b4f028f06cbcceb2ba4782899b1f Mon Sep 17 00:00:00 2001 From: Dmitry Date: Mon, 30 Oct 2023 10:01:00 +0300 Subject: [PATCH 13/37] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix=20typo=20in=20`d?= =?UTF-8?q?ocs/em/docs/index.md`,=20Python=203.8=20(#10521)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit typo in index page 7️⃣❌ -> 8️⃣✅ --- docs/em/docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/em/docs/index.md b/docs/em/docs/index.md index ea8a9d41c8..c7df281609 100644 --- a/docs/em/docs/index.md +++ b/docs/em/docs/index.md @@ -27,7 +27,7 @@ --- -FastAPI 🏛, ⏩ (↕-🎭), 🕸 🛠️ 🏗 🛠️ ⏮️ 🐍 3️⃣.7️⃣ ➕ ⚓️ 🔛 🐩 🐍 🆎 🔑. +FastAPI 🏛, ⏩ (↕-🎭), 🕸 🛠️ 🏗 🛠️ ⏮️ 🐍 3️⃣.8️⃣ ➕ ⚓️ 🔛 🐩 🐍 🆎 🔑. 🔑 ⚒: From cbc8f186649419b962d978a4d604dee69ed70fd3 Mon Sep 17 00:00:00 2001 From: Hasnat Sajid <86589885+hasnatsajid@users.noreply.github.com> Date: Mon, 30 Oct 2023 12:05:01 +0500 Subject: [PATCH 14/37] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix=20links=20in=20`?= =?UTF-8?q?docs/em/docs/async.md`=20(#10507)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/em/docs/async.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/em/docs/async.md b/docs/em/docs/async.md index 13b362b5de..ddcae15739 100644 --- a/docs/em/docs/async.md +++ b/docs/em/docs/async.md @@ -409,11 +409,11 @@ async def read_burgers(): ### 🔗 -🎏 ✔ [🔗](/tutorial/dependencies/index.md){.internal-link target=_blank}. 🚥 🔗 🐩 `def` 🔢 ↩️ `async def`, ⚫️ 🏃 🔢 🧵. +🎏 ✔ [🔗](./tutorial/dependencies/index.md){.internal-link target=_blank}. 🚥 🔗 🐩 `def` 🔢 ↩️ `async def`, ⚫️ 🏃 🔢 🧵. ### 🎧-🔗 -👆 💪 ✔️ 💗 🔗 & [🎧-🔗](/tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} 🚫 🔠 🎏 (🔢 🔢 🔑), 👫 💪 ✍ ⏮️ `async def` & ⏮️ 😐 `def`. ⚫️ 🔜 👷, & 🕐 ✍ ⏮️ 😐 `def` 🔜 🤙 🔛 🔢 🧵 (⚪️➡️ 🧵) ↩️ ➖ "⌛". +👆 💪 ✔️ 💗 🔗 & [🎧-🔗](./tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} 🚫 🔠 🎏 (🔢 🔢 🔑), 👫 💪 ✍ ⏮️ `async def` & ⏮️ 😐 `def`. ⚫️ 🔜 👷, & 🕐 ✍ ⏮️ 😐 `def` 🔜 🤙 🔛 🔢 🧵 (⚪️➡️ 🧵) ↩️ ➖ "⌛". ### 🎏 🚙 🔢 From 6b903ff1fbafd09f821a3c9f370317aaa1b26892 Mon Sep 17 00:00:00 2001 From: Hasnat Sajid <86589885+hasnatsajid@users.noreply.github.com> Date: Mon, 30 Oct 2023 12:07:15 +0500 Subject: [PATCH 15/37] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Update=20links=20in?= =?UTF-8?q?=20`docs/en/docs/async.md`=20and=20`docs/zh/docs/async.md`=20to?= =?UTF-8?q?=20make=20them=20relative=20(#10498)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/async.md | 4 ++-- docs/zh/docs/async.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/en/docs/async.md b/docs/en/docs/async.md index 3d4b1956af..2ead1f2db7 100644 --- a/docs/en/docs/async.md +++ b/docs/en/docs/async.md @@ -409,11 +409,11 @@ Still, in both situations, chances are that **FastAPI** will [still be faster](/ ### Dependencies -The same applies for [dependencies](/tutorial/dependencies/index.md){.internal-link target=_blank}. If a dependency is a standard `def` function instead of `async def`, it is run in the external threadpool. +The same applies for [dependencies](./tutorial/dependencies/index.md){.internal-link target=_blank}. If a dependency is a standard `def` function instead of `async def`, it is run in the external threadpool. ### Sub-dependencies -You can have multiple dependencies and [sub-dependencies](/tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} requiring each other (as parameters of the function definitions), some of them might be created with `async def` and some with normal `def`. It would still work, and the ones created with normal `def` would be called on an external thread (from the threadpool) instead of being "awaited". +You can have multiple dependencies and [sub-dependencies](./tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} requiring each other (as parameters of the function definitions), some of them might be created with `async def` and some with normal `def`. It would still work, and the ones created with normal `def` would be called on an external thread (from the threadpool) instead of being "awaited". ### Other utility functions diff --git a/docs/zh/docs/async.md b/docs/zh/docs/async.md index 7cc76fc864..59eebd0491 100644 --- a/docs/zh/docs/async.md +++ b/docs/zh/docs/async.md @@ -409,11 +409,11 @@ Starlette (和 **FastAPI**) 是基于 Date: Mon, 30 Oct 2023 07:42:04 +0000 Subject: [PATCH 16/37] =?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 ea2284cd52..38462ce6de 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,7 @@ hide: ## Latest Changes +* ✏️ Fix typo in `docs/em/docs/index.md`, Python 3.8. PR [#10521](https://github.com/tiangolo/fastapi/pull/10521) by [@kerriop](https://github.com/kerriop). * ⬆ Bump pillow from 9.5.0 to 10.1.0. PR [#10446](https://github.com/tiangolo/fastapi/pull/10446) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Update mkdocs-material requirement from <9.0.0,>=8.1.4 to >=8.1.4,<10.0.0. PR [#5862](https://github.com/tiangolo/fastapi/pull/5862) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump mkdocs-material from 9.1.21 to 9.4.7. PR [#10545](https://github.com/tiangolo/fastapi/pull/10545) by [@dependabot[bot]](https://github.com/apps/dependabot). From 7702c5af361606fad8d031ab3e10c9b30ac2b781 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 30 Oct 2023 07:51:12 +0000 Subject: [PATCH 17/37] =?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 38462ce6de..2b1f8dc388 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,7 @@ hide: ## Latest Changes +* ✏️ Fix links in `docs/em/docs/async.md`. PR [#10507](https://github.com/tiangolo/fastapi/pull/10507) by [@hasnatsajid](https://github.com/hasnatsajid). * ✏️ Fix typo in `docs/em/docs/index.md`, Python 3.8. PR [#10521](https://github.com/tiangolo/fastapi/pull/10521) by [@kerriop](https://github.com/kerriop). * ⬆ Bump pillow from 9.5.0 to 10.1.0. PR [#10446](https://github.com/tiangolo/fastapi/pull/10446) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Update mkdocs-material requirement from <9.0.0,>=8.1.4 to >=8.1.4,<10.0.0. PR [#5862](https://github.com/tiangolo/fastapi/pull/5862) by [@dependabot[bot]](https://github.com/apps/dependabot). From e7204ac7bf01ecc39cc37ef28fda3406a24a2ed8 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 30 Oct 2023 07:52:04 +0000 Subject: [PATCH 18/37] =?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 2b1f8dc388..a079bfd187 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,7 @@ hide: ## Latest Changes +* ✏️ Update links in `docs/en/docs/async.md` and `docs/zh/docs/async.md` to make them relative. PR [#10498](https://github.com/tiangolo/fastapi/pull/10498) by [@hasnatsajid](https://github.com/hasnatsajid). * ✏️ Fix links in `docs/em/docs/async.md`. PR [#10507](https://github.com/tiangolo/fastapi/pull/10507) by [@hasnatsajid](https://github.com/hasnatsajid). * ✏️ Fix typo in `docs/em/docs/index.md`, Python 3.8. PR [#10521](https://github.com/tiangolo/fastapi/pull/10521) by [@kerriop](https://github.com/kerriop). * ⬆ Bump pillow from 9.5.0 to 10.1.0. PR [#10446](https://github.com/tiangolo/fastapi/pull/10446) by [@dependabot[bot]](https://github.com/apps/dependabot). From 759378d67ff73da99a3f096aff42fc50ac900e61 Mon Sep 17 00:00:00 2001 From: Koke <31826970+White-Mask@users.noreply.github.com> Date: Mon, 30 Oct 2023 05:00:16 -0300 Subject: [PATCH 19/37] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Update=20Pydantic=20?= =?UTF-8?q?links=20to=20dotenv=20support=20(#10511)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/em/docs/advanced/settings.md | 2 +- docs/en/docs/advanced/settings.md | 2 +- docs/zh/docs/advanced/settings.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/em/docs/advanced/settings.md b/docs/em/docs/advanced/settings.md index cc7a08bab8..2ebe8ffcbe 100644 --- a/docs/em/docs/advanced/settings.md +++ b/docs/em/docs/advanced/settings.md @@ -254,7 +254,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" uvicorn main:app ✋️ 🇨🇻 📁 🚫 🤙 ✔️ ✔️ 👈 ☑ 📁. -Pydantic ✔️ 🐕‍🦺 👂 ⚪️➡️ 👉 🆎 📁 ⚙️ 🔢 🗃. 👆 💪 ✍ 🌖 Pydantic ⚒: 🇨🇻 (.🇨🇻) 🐕‍🦺. +Pydantic ✔️ 🐕‍🦺 👂 ⚪️➡️ 👉 🆎 📁 ⚙️ 🔢 🗃. 👆 💪 ✍ 🌖 Pydantic ⚒: 🇨🇻 (.🇨🇻) 🐕‍🦺. !!! tip 👉 👷, 👆 💪 `pip install python-dotenv`. diff --git a/docs/en/docs/advanced/settings.md b/docs/en/docs/advanced/settings.md index 32df900064..f6db8d2b15 100644 --- a/docs/en/docs/advanced/settings.md +++ b/docs/en/docs/advanced/settings.md @@ -326,7 +326,7 @@ This practice is common enough that it has a name, these environment variables a But a dotenv file doesn't really have to have that exact filename. -Pydantic has support for reading from these types of files using an external library. You can read more at Pydantic Settings: Dotenv (.env) support. +Pydantic has support for reading from these types of files using an external library. You can read more at Pydantic Settings: Dotenv (.env) support. !!! tip For this to work, you need to `pip install python-dotenv`. diff --git a/docs/zh/docs/advanced/settings.md b/docs/zh/docs/advanced/settings.md index 93e48a6105..76070fb7fa 100644 --- a/docs/zh/docs/advanced/settings.md +++ b/docs/zh/docs/advanced/settings.md @@ -289,7 +289,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp"uvicorn main:app 但是,dotenv 文件实际上不一定要具有确切的文件名。 -Pydantic 支持使用外部库从这些类型的文件中读取。您可以在Pydantic 设置: Dotenv (.env) 支持中阅读更多相关信息。 +Pydantic 支持使用外部库从这些类型的文件中读取。您可以在Pydantic 设置: Dotenv (.env) 支持中阅读更多相关信息。 !!! tip 要使其工作,您需要执行 `pip install python-dotenv`。 From e4b21c6eab7cd58caf3c6c492ea1ce7945425dd1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 30 Oct 2023 08:08:48 +0000 Subject: [PATCH 20/37] =?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 a079bfd187..57fb5ac2f1 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,7 @@ hide: ## Latest Changes +* ✏️ Update Pydantic links to dotenv support. PR [#10511](https://github.com/tiangolo/fastapi/pull/10511) by [@White-Mask](https://github.com/White-Mask). * ✏️ Update links in `docs/en/docs/async.md` and `docs/zh/docs/async.md` to make them relative. PR [#10498](https://github.com/tiangolo/fastapi/pull/10498) by [@hasnatsajid](https://github.com/hasnatsajid). * ✏️ Fix links in `docs/em/docs/async.md`. PR [#10507](https://github.com/tiangolo/fastapi/pull/10507) by [@hasnatsajid](https://github.com/hasnatsajid). * ✏️ Fix typo in `docs/em/docs/index.md`, Python 3.8. PR [#10521](https://github.com/tiangolo/fastapi/pull/10521) by [@kerriop](https://github.com/kerriop). From 758a8f29e1c5b11a44499d23f003d61febb6e617 Mon Sep 17 00:00:00 2001 From: Alejandra Klachquin Date: Mon, 30 Oct 2023 06:58:58 -0300 Subject: [PATCH 21/37] =?UTF-8?q?=F0=9F=93=8C=20Pin=20Swagger=20UI=20versi?= =?UTF-8?q?on=20to=205.9.0=20temporarily=20to=20handle=20a=20bug=20crashin?= =?UTF-8?q?g=20it=20in=205.9.1=20(#10529)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/en/docs/how-to/custom-docs-ui-assets.md | 4 ++-- docs_src/custom_docs_ui/tutorial001.py | 4 ++-- fastapi/openapi/docs.py | 4 ++-- tests/test_tutorial/test_custom_docs_ui/test_tutorial001.py | 6 ++++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/docs/en/docs/how-to/custom-docs-ui-assets.md b/docs/en/docs/how-to/custom-docs-ui-assets.md index f263248692..9726be2c71 100644 --- a/docs/en/docs/how-to/custom-docs-ui-assets.md +++ b/docs/en/docs/how-to/custom-docs-ui-assets.md @@ -96,8 +96,8 @@ You can probably right-click each link and select an option similar to `Save lin **Swagger UI** uses the files: -* `swagger-ui-bundle.js` -* `swagger-ui.css` +* `swagger-ui-bundle.js` +* `swagger-ui.css` And **ReDoc** uses the file: diff --git a/docs_src/custom_docs_ui/tutorial001.py b/docs_src/custom_docs_ui/tutorial001.py index f7ceb0c2fc..4384433e37 100644 --- a/docs_src/custom_docs_ui/tutorial001.py +++ b/docs_src/custom_docs_ui/tutorial001.py @@ -14,8 +14,8 @@ async def custom_swagger_ui_html(): openapi_url=app.openapi_url, title=app.title + " - Swagger UI", oauth2_redirect_url=app.swagger_ui_oauth2_redirect_url, - swagger_js_url="https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js", - swagger_css_url="https://unpkg.com/swagger-ui-dist@5/swagger-ui.css", + swagger_js_url="https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui-bundle.js", + swagger_css_url="https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui.css", ) diff --git a/fastapi/openapi/docs.py b/fastapi/openapi/docs.py index 8cf0d17a15..69473d19cb 100644 --- a/fastapi/openapi/docs.py +++ b/fastapi/openapi/docs.py @@ -53,7 +53,7 @@ def get_swagger_ui_html( It is normally set to a CDN URL. """ ), - ] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js", + ] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.9.0/swagger-ui-bundle.js", swagger_css_url: Annotated[ str, Doc( @@ -63,7 +63,7 @@ def get_swagger_ui_html( It is normally set to a CDN URL. """ ), - ] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css", + ] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.9.0/swagger-ui.css", swagger_favicon_url: Annotated[ str, Doc( diff --git a/tests/test_tutorial/test_custom_docs_ui/test_tutorial001.py b/tests/test_tutorial/test_custom_docs_ui/test_tutorial001.py index aff070d747..34a18b12ca 100644 --- a/tests/test_tutorial/test_custom_docs_ui/test_tutorial001.py +++ b/tests/test_tutorial/test_custom_docs_ui/test_tutorial001.py @@ -20,8 +20,10 @@ def client(): def test_swagger_ui_html(client: TestClient): response = client.get("/docs") assert response.status_code == 200, response.text - assert "https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js" in response.text - assert "https://unpkg.com/swagger-ui-dist@5/swagger-ui.css" in response.text + assert ( + "https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui-bundle.js" in response.text + ) + assert "https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui.css" in response.text def test_swagger_ui_oauth2_redirect_html(client: TestClient): From 0f1ddf5f69187f7f7666ffc7b58a0010d21e3289 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 30 Oct 2023 09:59:37 +0000 Subject: [PATCH 22/37] =?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 57fb5ac2f1..5565d362a8 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,7 @@ hide: ## Latest Changes +* 📌 Pin Swagger UI version to 5.9.0 temporarily to handle a bug crashing it in 5.9.1. PR [#10529](https://github.com/tiangolo/fastapi/pull/10529) by [@alejandraklachquin](https://github.com/alejandraklachquin). * ✏️ Update Pydantic links to dotenv support. PR [#10511](https://github.com/tiangolo/fastapi/pull/10511) by [@White-Mask](https://github.com/White-Mask). * ✏️ Update links in `docs/en/docs/async.md` and `docs/zh/docs/async.md` to make them relative. PR [#10498](https://github.com/tiangolo/fastapi/pull/10498) by [@hasnatsajid](https://github.com/hasnatsajid). * ✏️ Fix links in `docs/em/docs/async.md`. PR [#10507](https://github.com/tiangolo/fastapi/pull/10507) by [@hasnatsajid](https://github.com/hasnatsajid). From 6c53ddd084185c40f9ff960747ba1c9b5e2ce094 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 30 Oct 2023 14:04:14 +0400 Subject: [PATCH 23/37] =?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 | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 5565d362a8..a52973f6fd 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,7 +7,25 @@ hide: ## Latest Changes +### Fixes + * 📌 Pin Swagger UI version to 5.9.0 temporarily to handle a bug crashing it in 5.9.1. PR [#10529](https://github.com/tiangolo/fastapi/pull/10529) by [@alejandraklachquin](https://github.com/alejandraklachquin). + * This is not really a bug in FastAPI but in Swagger UI, nevertheless pinning the version will work while a soulution is found on the [Swagger UI side](https://github.com/swagger-api/swagger-ui/issues/9337). + +### Docs + +* 📝 Update data structure and render for external-links. PR [#10495](https://github.com/tiangolo/fastapi/pull/10495) by [@tiangolo](https://github.com/tiangolo). +* ✏️ Fix link to SPDX license identifier in `docs/en/docs/tutorial/metadata.md`. PR [#10433](https://github.com/tiangolo/fastapi/pull/10433) by [@worldworm](https://github.com/worldworm). +* 📝 Update example validation error from Pydantic v1 to match Pydantic v2 in `docs/en/docs/tutorial/path-params.md`. PR [#10043](https://github.com/tiangolo/fastapi/pull/10043) by [@giuliowaitforitdavide](https://github.com/giuliowaitforitdavide). +* ✏️ Fix typos in emoji docs and in some source examples. PR [#10438](https://github.com/tiangolo/fastapi/pull/10438) by [@afuetterer](https://github.com/afuetterer). +* ✏️ Fix typo in `docs/en/docs/reference/dependencies.md`. PR [#10465](https://github.com/tiangolo/fastapi/pull/10465) by [@suravshresth](https://github.com/suravshresth). +* ✏️ Fix typos and rewordings in `docs/en/docs/tutorial/body-nested-models.md`. PR [#10468](https://github.com/tiangolo/fastapi/pull/10468) by [@yogabonito](https://github.com/yogabonito). +* 📝 Update docs, remove references to removed `pydantic.Required` in `docs/en/docs/tutorial/query-params-str-validations.md`. PR [#10469](https://github.com/tiangolo/fastapi/pull/10469) by [@yogabonito](https://github.com/yogabonito). +* ✏️ Fix typo in `docs/en/docs/reference/index.md`. PR [#10467](https://github.com/tiangolo/fastapi/pull/10467) by [@tarsil](https://github.com/tarsil). +* 🔥 Remove unnecessary duplicated docstrings. PR [#10484](https://github.com/tiangolo/fastapi/pull/10484) by [@tiangolo](https://github.com/tiangolo). + +### Internal + * ✏️ Update Pydantic links to dotenv support. PR [#10511](https://github.com/tiangolo/fastapi/pull/10511) by [@White-Mask](https://github.com/White-Mask). * ✏️ Update links in `docs/en/docs/async.md` and `docs/zh/docs/async.md` to make them relative. PR [#10498](https://github.com/tiangolo/fastapi/pull/10498) by [@hasnatsajid](https://github.com/hasnatsajid). * ✏️ Fix links in `docs/em/docs/async.md`. PR [#10507](https://github.com/tiangolo/fastapi/pull/10507) by [@hasnatsajid](https://github.com/hasnatsajid). @@ -19,17 +37,9 @@ hide: * 🔧 Update sponsors badges, Databento. PR [#10519](https://github.com/tiangolo/fastapi/pull/10519) by [@tiangolo](https://github.com/tiangolo). * 👷 Adopt Ruff format. PR [#10517](https://github.com/tiangolo/fastapi/pull/10517) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add `CITATION.cff` file for academic citations. PR [#10496](https://github.com/tiangolo/fastapi/pull/10496) by [@tiangolo](https://github.com/tiangolo). -* 📝 Update data structure and render for external-links. PR [#10495](https://github.com/tiangolo/fastapi/pull/10495) by [@tiangolo](https://github.com/tiangolo). * 🐛 Fix overriding MKDocs theme lang in hook. PR [#10490](https://github.com/tiangolo/fastapi/pull/10490) by [@tiangolo](https://github.com/tiangolo). -* ✏️ Fix link to SPDX license identifier in `docs/en/docs/tutorial/metadata.md`. PR [#10433](https://github.com/tiangolo/fastapi/pull/10433) by [@worldworm](https://github.com/worldworm). -* 📝 Update example validation error from Pydantic v1 to match Pydantic v2 in `docs/en/docs/tutorial/path-params.md`. PR [#10043](https://github.com/tiangolo/fastapi/pull/10043) by [@giuliowaitforitdavide](https://github.com/giuliowaitforitdavide). -* ✏️ Fix typos in emoji docs and in some source examples. PR [#10438](https://github.com/tiangolo/fastapi/pull/10438) by [@afuetterer](https://github.com/afuetterer). -* ✏️ Fix typo in `docs/en/docs/reference/dependencies.md`. PR [#10465](https://github.com/tiangolo/fastapi/pull/10465) by [@suravshresth](https://github.com/suravshresth). -* ✏️ Fix typos and rewordings in `docs/en/docs/tutorial/body-nested-models.md`. PR [#10468](https://github.com/tiangolo/fastapi/pull/10468) by [@yogabonito](https://github.com/yogabonito). -* 📝 Update docs, remove references to removed `pydantic.Required` in `docs/en/docs/tutorial/query-params-str-validations.md`. PR [#10469](https://github.com/tiangolo/fastapi/pull/10469) by [@yogabonito](https://github.com/yogabonito). -* ✏️ Fix typo in `docs/en/docs/reference/index.md`. PR [#10467](https://github.com/tiangolo/fastapi/pull/10467) by [@tarsil](https://github.com/tarsil). * 🔥 Drop/close Gitter chat. Questions should go to GitHub Discussions, free conversations to Discord.. PR [#10485](https://github.com/tiangolo/fastapi/pull/10485) by [@tiangolo](https://github.com/tiangolo). -* 🔥 Remove unnecessary duplicated docstrings. PR [#10484](https://github.com/tiangolo/fastapi/pull/10484) by [@tiangolo](https://github.com/tiangolo). + ## 0.104.0 ## Features From 7e5afe2cb9bf1fa30c04a4dd393ea397a46db29b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 30 Oct 2023 14:04:54 +0400 Subject: [PATCH 24/37] =?UTF-8?q?=F0=9F=94=96=20Release=20version=200.104.?= =?UTF-8?q?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 a52973f6fd..3f05787fd9 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,9 @@ hide: ## Latest Changes + +## 0.104.1 + ### Fixes * 📌 Pin Swagger UI version to 5.9.0 temporarily to handle a bug crashing it in 5.9.1. PR [#10529](https://github.com/tiangolo/fastapi/pull/10529) by [@alejandraklachquin](https://github.com/alejandraklachquin). diff --git a/fastapi/__init__.py b/fastapi/__init__.py index 4fdb155c2a..c81f09b27e 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.104.0" +__version__ = "0.104.1" from starlette import status as status From 1c25e2d8dc99331290e99e17814ec4d83adce725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 30 Oct 2023 15:12:57 +0400 Subject: [PATCH 25/37] =?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 3f05787fd9..fee5b10801 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -13,7 +13,7 @@ hide: ### Fixes * 📌 Pin Swagger UI version to 5.9.0 temporarily to handle a bug crashing it in 5.9.1. PR [#10529](https://github.com/tiangolo/fastapi/pull/10529) by [@alejandraklachquin](https://github.com/alejandraklachquin). - * This is not really a bug in FastAPI but in Swagger UI, nevertheless pinning the version will work while a soulution is found on the [Swagger UI side](https://github.com/swagger-api/swagger-ui/issues/9337). + * This is not really a bug in FastAPI but in Swagger UI, nevertheless pinning the version will work while a solution is found on the [Swagger UI side](https://github.com/swagger-api/swagger-ui/issues/9337). ### Docs From 4f89886b0030f7f0bb1bdb363b7c50ad96445a03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 4 Nov 2023 05:52:42 +0400 Subject: [PATCH 26/37] =?UTF-8?q?=F0=9F=91=B7=20Upgrade=20latest-changes?= =?UTF-8?q?=20GitHub=20Action=20(#10587)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/latest-changes.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/latest-changes.yml b/.github/workflows/latest-changes.yml index ffec5ee5e9..b9b550d5ea 100644 --- a/.github/workflows/latest-changes.yml +++ b/.github/workflows/latest-changes.yml @@ -34,9 +34,12 @@ jobs: if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }} with: limit-access-to-actor: true - - uses: docker://tiangolo/latest-changes:0.0.3 + - uses: docker://tiangolo/latest-changes:0.2.0 + # - uses: tiangolo/latest-changes@main with: token: ${{ secrets.GITHUB_TOKEN }} latest_changes_file: docs/en/docs/release-notes.md - latest_changes_header: '## Latest Changes\n\n' + latest_changes_header: '## Latest Changes' + end_regex: '^## ' debug_logs: true + label_header_prefix: '### ' From 46335068d2130839ca64a0484dd5b0ff2eeda818 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 4 Nov 2023 01:53:13 +0000 Subject: [PATCH 27/37] =?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 fee5b10801..b0c13f5af0 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,7 @@ hide: ## Latest Changes +* 👷 Upgrade latest-changes GitHub Action. PR [#10587](https://github.com/tiangolo/fastapi/pull/10587) by [@tiangolo](https://github.com/tiangolo). ## 0.104.1 From b04d07c9339b3ac3b1cf72724231982c318c2907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 4 Nov 2023 06:02:18 +0400 Subject: [PATCH 28/37] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes,?= =?UTF-8?q?=20move=20and=20check=20latest-changes=20(#10588)?= 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 b0c13f5af0..186d2117cc 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,8 @@ hide: ## Latest Changes +### Internal + * 👷 Upgrade latest-changes GitHub Action. PR [#10587](https://github.com/tiangolo/fastapi/pull/10587) by [@tiangolo](https://github.com/tiangolo). ## 0.104.1 From 480620372a662aa9025c47410fbc90a255b2fc94 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 4 Nov 2023 02:03:01 +0000 Subject: [PATCH 29/37] =?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 186d2117cc..b62656982f 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Internal +* 📝 Update release notes, move and check latest-changes. PR [#10588](https://github.com/tiangolo/fastapi/pull/10588) by [@tiangolo](https://github.com/tiangolo). * 👷 Upgrade latest-changes GitHub Action. PR [#10587](https://github.com/tiangolo/fastapi/pull/10587) by [@tiangolo](https://github.com/tiangolo). ## 0.104.1 From 781984b22651d04a33a260d981d59da53fd950f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 18 Nov 2023 14:38:01 +0100 Subject: [PATCH 30/37] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors,=20add?= =?UTF-8?q?=20Reflex=20(#10676)?= 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/reflex-banner.png | Bin 0 -> 8143 bytes docs/en/docs/img/sponsors/reflex.png | Bin 0 -> 11293 bytes docs/en/overrides/main.html | 6 ++++++ 6 files changed, 11 insertions(+) create mode 100644 docs/en/docs/img/sponsors/reflex-banner.png create mode 100644 docs/en/docs/img/sponsors/reflex.png diff --git a/README.md b/README.md index aeb29b5874..06c0c44522 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 dac47d2f07..f2e07cbd8e 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -14,6 +14,9 @@ gold: - url: https://bump.sh/fastapi?utm_source=fastapi&utm_medium=referral&utm_campaign=sponsor title: Automate FastAPI documentation generation with Bump.sh img: https://fastapi.tiangolo.com/img/sponsors/bump-sh.svg + - url: https://reflex.dev + title: Reflex + img: https://fastapi.tiangolo.com/img/sponsors/reflex.png silver: - url: https://www.deta.sh/?ref=fastapi title: The launchpad for all your (team's) ideas diff --git a/docs/en/data/sponsors_badge.yml b/docs/en/data/sponsors_badge.yml index acbcc22056..43b69bf003 100644 --- a/docs/en/data/sponsors_badge.yml +++ b/docs/en/data/sponsors_badge.yml @@ -21,3 +21,4 @@ logins: - fern-api - ndimares - svixhq + - Alek99 diff --git a/docs/en/docs/img/sponsors/reflex-banner.png b/docs/en/docs/img/sponsors/reflex-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..3095c3a7b40906a8f6476c97370d03f95470e461 GIT binary patch literal 8143 zcmV;=A28sFP)5C00009a7bBm000XU z000XU0RWnu7ytkPKxsomP;*c-LjVAHoMT{Me2|lzTg;-sz>u3)QWWIwq!1AqrNI7( zftf*sfs=ucK{heDxWG5qErbCGiWAF=lS_(n7*N2sYYdDa`m%0DVqS_|`yBVC^Ro|% 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%0DVqS_|`yBVC^Ro|% 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 T*-t(000000NkvXXu0mjf_P{u$ literal 0 HcmV?d00001 diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index 4c7f19fd4d..ed08028ec6 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -52,6 +52,12 @@ + {% endblock %} From 81bab7761770264e5f6901d0a50fe5d79a5bffa1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 18 Nov 2023 13:38:23 +0000 Subject: [PATCH 31/37] =?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 b62656982f..4b6a1967b8 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Internal +* 🔧 Update sponsors, add Reflex. PR [#10676](https://github.com/tiangolo/fastapi/pull/10676) by [@tiangolo](https://github.com/tiangolo). * 📝 Update release notes, move and check latest-changes. PR [#10588](https://github.com/tiangolo/fastapi/pull/10588) by [@tiangolo](https://github.com/tiangolo). * 👷 Upgrade latest-changes GitHub Action. PR [#10587](https://github.com/tiangolo/fastapi/pull/10587) by [@tiangolo](https://github.com/tiangolo). From 71d51a99531da8489772bc295d88a0a9a452d45d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 18 Nov 2023 14:47:04 +0100 Subject: [PATCH 32/37] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors,=20add?= =?UTF-8?q?=20Codacy=20(#10677)?= 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/codacy.png | Bin 0 -> 30480 bytes 4 files changed, 5 insertions(+) create mode 100644 docs/en/docs/img/sponsors/codacy.png diff --git a/README.md b/README.md index 06c0c44522..655038c6fe 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,7 @@ The key features are: + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index f2e07cbd8e..4f98c01a0f 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -42,6 +42,9 @@ silver: - url: https://www.svix.com/ title: Svix - Webhooks as a service img: https://fastapi.tiangolo.com/img/sponsors/svix.svg + - url: https://www.codacy.com/?utm_source=github&utm_medium=sponsors&utm_id=pioneers + title: Take code reviews from hours to minutes + img: https://fastapi.tiangolo.com/img/sponsors/codacy.png 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 43b69bf003..4078454a8c 100644 --- a/docs/en/data/sponsors_badge.yml +++ b/docs/en/data/sponsors_badge.yml @@ -22,3 +22,4 @@ logins: - ndimares - svixhq - Alek99 + - codacy diff --git a/docs/en/docs/img/sponsors/codacy.png b/docs/en/docs/img/sponsors/codacy.png new file mode 100644 index 0000000000000000000000000000000000000000..baa615c2a836413df2aec00ff582162c759a4aab GIT binary patch literal 30480 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 Z{9hD0a-~Z>ZF>L!002ovPDHLkV1i{;0#5({ literal 0 HcmV?d00001 From ac93277d3b506f4076aee1af6ae5a86406f545c6 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 18 Nov 2023 13:47:35 +0000 Subject: [PATCH 33/37] =?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 4b6a1967b8..34bbab1355 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Internal +* 🔧 Update sponsors, add Codacy. PR [#10677](https://github.com/tiangolo/fastapi/pull/10677) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, add Reflex. PR [#10676](https://github.com/tiangolo/fastapi/pull/10676) by [@tiangolo](https://github.com/tiangolo). * 📝 Update release notes, move and check latest-changes. PR [#10588](https://github.com/tiangolo/fastapi/pull/10588) by [@tiangolo](https://github.com/tiangolo). * 👷 Upgrade latest-changes GitHub Action. PR [#10587](https://github.com/tiangolo/fastapi/pull/10587) by [@tiangolo](https://github.com/tiangolo). From 1560879a8417f71d038e25532577f78b55a69b11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Tue, 28 Nov 2023 11:52:35 +0100 Subject: [PATCH 34/37] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors,=20add?= =?UTF-8?q?=20Scalar=20(#10728)?= 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/scalar-banner.svg | 1 + docs/en/docs/img/sponsors/scalar.svg | 1 + docs/en/overrides/main.html | 6 ++++++ 5 files changed, 12 insertions(+) create mode 100644 docs/en/docs/img/sponsors/scalar-banner.svg create mode 100644 docs/en/docs/img/sponsors/scalar.svg diff --git a/README.md b/README.md index 655038c6fe..b53076dcbe 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ The key features are: + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 4f98c01a0f..1a253f6490 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -17,6 +17,9 @@ gold: - url: https://reflex.dev title: Reflex img: https://fastapi.tiangolo.com/img/sponsors/reflex.png + - url: https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge + title: "Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files" + img: https://fastapi.tiangolo.com/img/sponsors/scalar.svg 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/scalar-banner.svg b/docs/en/docs/img/sponsors/scalar-banner.svg new file mode 100644 index 0000000000..bab74e2d7c --- /dev/null +++ b/docs/en/docs/img/sponsors/scalar-banner.svg @@ -0,0 +1 @@ + diff --git a/docs/en/docs/img/sponsors/scalar.svg b/docs/en/docs/img/sponsors/scalar.svg new file mode 100644 index 0000000000..174c57ee23 --- /dev/null +++ b/docs/en/docs/img/sponsors/scalar.svg @@ -0,0 +1 @@ + diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index ed08028ec6..9aa452e365 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -58,6 +58,12 @@ + {% endblock %} From e9ce31e96bd61f09decc1ba8d1908fb5d3315043 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 28 Nov 2023 10:52:59 +0000 Subject: [PATCH 35/37] =?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 34bbab1355..9a6c969ab9 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,8 @@ hide: ## Latest Changes +* 🔧 Update sponsors, add Scalar. PR [#10728](https://github.com/tiangolo/fastapi/pull/10728) by [@tiangolo](https://github.com/tiangolo). + ### Internal * 🔧 Update sponsors, add Codacy. PR [#10677](https://github.com/tiangolo/fastapi/pull/10677) by [@tiangolo](https://github.com/tiangolo). From 13cef7a21a8fb941f91c981e93b138d1b44aabd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Tue, 28 Nov 2023 13:10:12 +0100 Subject: [PATCH 36/37] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors,=20remov?= =?UTF-8?q?e=20Fern=20(#10729)?= 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/advanced/generate-clients.md | 5 ++--- docs/en/docs/alternatives.md | 2 -- docs/en/overrides/main.html | 6 ------ 5 files changed, 2 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index b53076dcbe..c8d17889d5 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,6 @@ The key features are: - diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 1a253f6490..113772964a 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -5,9 +5,6 @@ gold: - url: https://platform.sh/try-it-now/?utm_source=fastapi-signup&utm_medium=banner&utm_campaign=FastAPI-signup-June-2023 title: "Build, run and scale your apps on a modern, reliable, and secure PaaS." img: https://fastapi.tiangolo.com/img/sponsors/platform-sh.png - - url: https://www.buildwithfern.com/?utm_source=tiangolo&utm_medium=website&utm_campaign=main-badge - title: Fern | SDKs and API docs - img: https://fastapi.tiangolo.com/img/sponsors/fern.svg - url: https://www.porter.run title: Deploy FastAPI on AWS with a few clicks img: https://fastapi.tiangolo.com/img/sponsors/porter.png diff --git a/docs/en/docs/advanced/generate-clients.md b/docs/en/docs/advanced/generate-clients.md index 07a8f039f6..fb9aa643e2 100644 --- a/docs/en/docs/advanced/generate-clients.md +++ b/docs/en/docs/advanced/generate-clients.md @@ -20,10 +20,9 @@ Some of them also ✨ [**sponsor FastAPI**](../help-fastapi.md#sponsor-the-autho And it shows their true commitment to FastAPI and its **community** (you), as they not only want to provide you a **good service** but also want to make sure you have a **good and healthy framework**, FastAPI. 🙇 -You might want to try their services and follow their guides: +For example, you might want to try Speakeasy. -* Fern -* Speakeasy +There are also several other companies offering similar services that you can search and find online. 🤓 ## Generate a TypeScript Frontend Client diff --git a/docs/en/docs/alternatives.md b/docs/en/docs/alternatives.md index a777ddb98e..0f074ccf32 100644 --- a/docs/en/docs/alternatives.md +++ b/docs/en/docs/alternatives.md @@ -119,8 +119,6 @@ That's why when talking about version 2.0 it's common to say "Swagger", and for These two were chosen for being fairly popular and stable, but doing a quick search, you could find dozens of additional alternative user interfaces for OpenAPI (that you can use with **FastAPI**). - For example, you could try Fern which is also a FastAPI sponsor. 😎🎉 - ### Flask REST frameworks There are several Flask REST frameworks, but after investing the time and work into investigating them, I found that many are discontinued or abandoned, with several standing issues that made them unfit. diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index 9aa452e365..c4aea9a8e6 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -34,12 +34,6 @@ -