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 9f7085f72..a7f2fb3f2 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 bc50bf755..cc7a08bab 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 d6b67bd51..f0e455abe 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 d39130777..32df90006 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 0e777f6a0..91ae615ff 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 15be5dbf6..cc826b871 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 7f718acef..93e48a610 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 65d972d46..82fe49ba2 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 7f6a99f9c..008e4b6e1 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 3639b6c38..64a647a16 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 24698c7b3..c75d45d63 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 b7b629ee8..20cf1988f 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 8fd375b3d..21e0d3eb8 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 8e9a6fc32..de27097b3 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 f80798bcb..7801e7500 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 d112a9ab8..e3e0b50aa 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 5699f1e88..01606a920 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 4aaadf8b4..44b3082b6 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 1c3b36176..f3f2f2c0e 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 489f631d5..574385272 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 3314f8b6d..ff29176fe 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 c5df00897..ed343230f 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 a8e8c099b..775095bda 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 955880dd6..b126c116f 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 9ea7b3c49..530e6cf5b 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 163aa2614..941f82e6b 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 cb679202d..3a578cc33 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 61be74fcb..6d5db12a8 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 69bc8c6e0..ea64a5709 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 c33b98f47..2f64b9cd1 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 b89c6b6cf..62f347639 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 a4b305d42..fc605d0ec 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 8ca374a54..3021d7593 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 3627777d6..738455de3 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 d427783ad..9281dfb64 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 53b47a160..f8463dda2 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 addde1d33..e67486ae3 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 1a4a57267..b82df4933 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 3e0df6483..69302f655 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 de8d3f26c..e1a976c13 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 0023c670c..73e1900ad 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 3fb3eb4f1..11f25f1ce 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 4db5caa96..c0e24db9f 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 2b6a05642..8335a13f6 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 70664a8a4..6597e5058 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 a1505afe2..b313f47e9 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 74b0b1b27..0acca3761 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 d67e27c87..acbcc2205 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 0acca3761..d761fa20b 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 4100781c5..701c74697 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 d761fa20b..9db471b3f 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 69302f655..83dc94ee0 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 9db471b3f..036e8c45c 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 036e8c45c..94c3451f8 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 83dc94ee0..28408a9f1 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 94c3451f8..ea2284cd5 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 ea8a9d41c..c7df28160 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 13b362b5d..ddcae1573 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 3d4b1956a..2ead1f2db 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 7cc76fc86..59eebd049 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 ea2284cd5..38462ce6d 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 38462ce6d..2b1f8dc38 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 2b1f8dc38..a079bfd18 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 cc7a08bab..2ebe8ffcb 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 32df90006..f6db8d2b1 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 93e48a610..76070fb7f 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 a079bfd18..57fb5ac2f 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 f26324869..9726be2c7 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 f7ceb0c2f..4384433e3 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 8cf0d17a1..69473d19c 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 aff070d74..34a18b12c 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 57fb5ac2f..5565d362a 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 5565d362a..a52973f6f 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 a52973f6f..3f05787fd 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 4fdb155c2..c81f09b27 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 3f05787fd..fee5b1080 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 ffec5ee5e..b9b550d5e 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 fee5b1080..b0c13f5af 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 b0c13f5af..186d2117c 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 186d2117c..b62656982 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 aeb29b587..06c0c4452 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 dac47d2f0..f2e07cbd8 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 acbcc2205..43b69bf00 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 4c7f19fd4..ed08028ec 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 b62656982..4b6a1967b 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 06c0c4452..655038c6f 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 f2e07cbd8..4f98c01a0 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 43b69bf00..4078454a8 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 4b6a1967b..34bbab135 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 655038c6f..b53076dcb 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 4f98c01a0..1a253f649 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 000000000..bab74e2d7 --- /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 000000000..174c57ee2 --- /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 ed08028ec..9aa452e36 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 34bbab135..9a6c969ab 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 b53076dcb..c8d17889d 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 1a253f649..113772964 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 07a8f039f..fb9aa643e 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 a777ddb98..0f074ccf3 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 9aa452e36..c4aea9a8e 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -34,12 +34,6 @@ -