From 57e31cf733e6e2d884176a569a2404ea985ba91f Mon Sep 17 00:00:00 2001 From: rayharnett Date: Mon, 18 May 2026 10:46:36 +0100 Subject: [PATCH 1/3] Bump fastapi 0.123.3 -> 0.136.1 - Replace `pydantic.v1.utils.deep_update` (dropped in 0.128.0) with a local implementation in `collection_util.py` - fastapi[all] no longer includes orjson (ORJSONResponse deprecated in 0.131.0) Co-Authored-By: Claude Sonnet 4.6 --- pyproject.toml | 2 +- src/fides/api/models/application_config.py | 2 +- .../privacy_request/privacy_request_data.py | 3 +- .../manual_task_conditional_evaluation.py | 3 +- .../api/task/manual/manual_task_graph_task.py | 3 +- src/fides/api/util/collection_util.py | 12 +++++ uv.lock | 49 ++----------------- 7 files changed, 22 insertions(+), 52 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8b6f2e65e43..3b874f583bc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,7 +54,7 @@ dependencies = [ "expandvars==0.9.0", "fastapi-cli~=0.0.16", "fastapi-pagination[sqlalchemy]==0.15.12", - "fastapi[all]==0.123.3", + "fastapi[all]==0.136.1", "fideslang==3.1.3", "firebase-admin==5.3.0", "flower==2.0.1", diff --git a/src/fides/api/models/application_config.py b/src/fides/api/models/application_config.py index becf8615c85..ec113ff0544 100644 --- a/src/fides/api/models/application_config.py +++ b/src/fides/api/models/application_config.py @@ -4,7 +4,6 @@ from typing import Any, Dict, Iterable, Optional from loguru import logger -from pydantic.v1.utils import deep_update from pydash.objects import get from sqlalchemy import Boolean, CheckConstraint, Column from sqlalchemy.ext.mutable import MutableDict @@ -12,6 +11,7 @@ from fides.api.db.base_class import Base, JSONTypeOverride from fides.api.db.encryption_utils import encrypted_type +from fides.api.util.collection_util import deep_update from fides.config import FidesConfig diff --git a/src/fides/api/task/conditional_dependencies/privacy_request/privacy_request_data.py b/src/fides/api/task/conditional_dependencies/privacy_request/privacy_request_data.py index c5f65b61f75..4a13fd32657 100644 --- a/src/fides/api/task/conditional_dependencies/privacy_request/privacy_request_data.py +++ b/src/fides/api/task/conditional_dependencies/privacy_request/privacy_request_data.py @@ -1,7 +1,5 @@ from typing import Any, Optional, Protocol -from pydantic.v1.utils import deep_update - from fides.api.models.policy import Policy from fides.api.schemas.policy import Policy as PolicySchema from fides.api.schemas.redis_cache import Identity @@ -17,6 +15,7 @@ set_nested_value, transform_value_for_evaluation, ) +from fides.api.util.collection_util import deep_update class EvaluablePrivacyRequest(Protocol): diff --git a/src/fides/api/task/manual/manual_task_conditional_evaluation.py b/src/fides/api/task/manual/manual_task_conditional_evaluation.py index 025aec5e553..af94880dd8e 100644 --- a/src/fides/api/task/manual/manual_task_conditional_evaluation.py +++ b/src/fides/api/task/manual/manual_task_conditional_evaluation.py @@ -1,7 +1,6 @@ from typing import Any, Optional, cast from loguru import logger -from pydantic.v1.utils import deep_update from sqlalchemy.orm import Session from fides.api.graph.config import CollectionAddress, FieldAddress @@ -29,7 +28,7 @@ extract_field_addresses, extract_nested_field_value, ) -from fides.api.util.collection_util import Row +from fides.api.util.collection_util import Row, deep_update def get_all_field_addresses_from_manual_task(manual_task: ManualTask) -> set[str]: diff --git a/src/fides/api/task/manual/manual_task_graph_task.py b/src/fides/api/task/manual/manual_task_graph_task.py index d298960857e..7b85d6f9901 100644 --- a/src/fides/api/task/manual/manual_task_graph_task.py +++ b/src/fides/api/task/manual/manual_task_graph_task.py @@ -1,7 +1,6 @@ from typing import Any, Optional from loguru import logger -from pydantic.v1.utils import deep_update from fides.api.common_exceptions import AwaitingAsyncTask from fides.api.models.attachment import AttachmentType @@ -32,7 +31,7 @@ get_manual_task_for_connection_config, ) from fides.api.task.task_resources import TaskResources -from fides.api.util.collection_util import Row +from fides.api.util.collection_util import Row, deep_update from fides.service.attachment_service import AttachmentService diff --git a/src/fides/api/util/collection_util.py b/src/fides/api/util/collection_util.py index db4b9fb47db..4fbdaf68049 100644 --- a/src/fides/api/util/collection_util.py +++ b/src/fides/api/util/collection_util.py @@ -13,6 +13,18 @@ FIDESOPS_DO_NOT_MASK_INDEX = "FIDESOPS_DO_NOT_MASK" +def deep_update(mapping: Dict[str, Any], *updating_mappings: Dict[str, Any]) -> Dict[str, Any]: + """Recursively merge dicts, with later mappings taking precedence.""" + updated_mapping = mapping.copy() + for updating_mapping in updating_mappings: + for k, v in updating_mapping.items(): + if k in updated_mapping and isinstance(updated_mapping[k], dict) and isinstance(v, dict): + updated_mapping[k] = deep_update(updated_mapping[k], v) + else: + updated_mapping[k] = v + return updated_mapping + + def make_immutable(obj: Any) -> Any: """ Recursively converts a mutable object into an immutable version. diff --git a/uv.lock b/uv.lock index 6e2521e5f4e..a1e0aa21101 100644 --- a/uv.lock +++ b/uv.lock @@ -1082,7 +1082,7 @@ requires-dist = [ { name = "defusedxml", specifier = "==0.7.1" }, { name = "email-validator", specifier = "~=2.3.0" }, { name = "expandvars", specifier = "==0.9.0" }, - { name = "fastapi", extras = ["all"], specifier = "==0.123.3" }, + { name = "fastapi", extras = ["all"], specifier = "==0.136.1" }, { name = "fastapi-cli", specifier = "~=0.0.16" }, { name = "fastapi-pagination", extras = ["sqlalchemy"], specifier = "==0.15.12" }, { name = "fideslang", specifier = "==3.1.3" }, @@ -1241,17 +1241,18 @@ wheels = [ [[package]] name = "fastapi" -version = "0.123.3" +version = "0.136.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc" }, { name = "pydantic" }, { name = "starlette" }, { name = "typing-extensions" }, + { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9e/26/057d598830bac13da7c9b1bc598dd02a5b7178254ce3d8c052bfae4dbfd1/fastapi-0.123.3.tar.gz", hash = "sha256:4c2bd282575f4be7986e637a3339fb193460806eb6b15a1ea8c48e2b4e641d77", size = 350248, upload-time = "2025-12-02T07:44:48.352Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5d/45/c130091c2dfa061bbfe3150f2a5091ef1adf149f2a8d2ae769ecaf6e99a2/fastapi-0.136.1.tar.gz", hash = "sha256:7af665ad7acfa0a3baf8983d393b6b471b9da10ede59c60045f49fbc89a0fa7f", size = 397448, upload-time = "2026-04-23T16:49:44.046Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/bb/3e0f41ceb4653d19da0a4ad4ead6a16598a54a102fc690e8c3eb83f174c6/fastapi-0.123.3-py3-none-any.whl", hash = "sha256:fe463e5865baf5550c4e73fe421250e4709bf845505dd14a64f83af25abe2789", size = 111133, upload-time = "2025-12-02T07:44:47.053Z" }, + { url = "https://files.pythonhosted.org/packages/5a/ff/2e4eca3ade2c22fe1dea7043b8ee9dabe47753349eb1b56a202de8af6349/fastapi-0.136.1-py3-none-any.whl", hash = "sha256:a6e9d7eeada96c93a4d69cb03836b44fa34e2854accb7244a1ece36cd4781c3f", size = 117683, upload-time = "2026-04-23T16:49:42.437Z" }, ] [package.optional-dependencies] @@ -1261,12 +1262,10 @@ all = [ { name = "httpx" }, { name = "itsdangerous" }, { name = "jinja2" }, - { name = "orjson" }, { name = "pydantic-extra-types" }, { name = "pydantic-settings" }, { name = "python-multipart" }, { name = "pyyaml" }, - { name = "ujson" }, { name = "uvicorn", extra = ["standard"] }, ] @@ -2668,44 +2667,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/12/27/fb8d7338b4d551900fa3e580acbe7a0cf655d940e164cb5c00ec31961094/orderly_set-5.5.0-py3-none-any.whl", hash = "sha256:46f0b801948e98f427b412fcabb831677194c05c3b699b80de260374baa0b1e7", size = 13068, upload-time = "2025-07-10T20:10:54.377Z" }, ] -[[package]] -name = "orjson" -version = "3.11.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/53/45/b268004f745ede84e5798b48ee12b05129d19235d0e15267aa57dcdb400b/orjson-3.11.7.tar.gz", hash = "sha256:9b1a67243945819ce55d24a30b59d6a168e86220452d2c96f4d1f093e71c0c49", size = 6144992, upload-time = "2026-02-02T15:38:49.29Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/89/25/6e0e52cac5aab51d7b6dcd257e855e1dec1c2060f6b28566c509b4665f62/orjson-3.11.7-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1d98b30cc1313d52d4af17d9c3d307b08389752ec5f2e5febdfada70b0f8c733", size = 228390, upload-time = "2026-02-02T15:38:06.8Z" }, - { url = "https://files.pythonhosted.org/packages/a5/29/a77f48d2fc8a05bbc529e5ff481fb43d914f9e383ea2469d4f3d51df3d00/orjson-3.11.7-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:d897e81f8d0cbd2abb82226d1860ad2e1ab3ff16d7b08c96ca00df9d45409ef4", size = 125189, upload-time = "2026-02-02T15:38:08.181Z" }, - { url = "https://files.pythonhosted.org/packages/89/25/0a16e0729a0e6a1504f9d1a13cdd365f030068aab64cec6958396b9969d7/orjson-3.11.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:814be4b49b228cfc0b3c565acf642dd7d13538f966e3ccde61f4f55be3e20785", size = 128106, upload-time = "2026-02-02T15:38:09.41Z" }, - { url = "https://files.pythonhosted.org/packages/66/da/a2e505469d60666a05ab373f1a6322eb671cb2ba3a0ccfc7d4bc97196787/orjson-3.11.7-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d06e5c5fed5caedd2e540d62e5b1c25e8c82431b9e577c33537e5fa4aa909539", size = 123363, upload-time = "2026-02-02T15:38:10.73Z" }, - { url = "https://files.pythonhosted.org/packages/23/bf/ed73f88396ea35c71b38961734ea4a4746f7ca0768bf28fd551d37e48dd0/orjson-3.11.7-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31c80ce534ac4ea3739c5ee751270646cbc46e45aea7576a38ffec040b4029a1", size = 129007, upload-time = "2026-02-02T15:38:12.138Z" }, - { url = "https://files.pythonhosted.org/packages/73/3c/b05d80716f0225fc9008fbf8ab22841dcc268a626aa550561743714ce3bf/orjson-3.11.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f50979824bde13d32b4320eedd513431c921102796d86be3eee0b58e58a3ecd1", size = 141667, upload-time = "2026-02-02T15:38:13.398Z" }, - { url = "https://files.pythonhosted.org/packages/61/e8/0be9b0addd9bf86abfc938e97441dcd0375d494594b1c8ad10fe57479617/orjson-3.11.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e54f3808e2b6b945078c41aa8d9b5834b28c50843846e97807e5adb75fa9705", size = 130832, upload-time = "2026-02-02T15:38:14.698Z" }, - { url = "https://files.pythonhosted.org/packages/c9/ec/c68e3b9021a31d9ec15a94931db1410136af862955854ed5dd7e7e4f5bff/orjson-3.11.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a12b80df61aab7b98b490fe9e4879925ba666fccdfcd175252ce4d9035865ace", size = 133373, upload-time = "2026-02-02T15:38:16.109Z" }, - { url = "https://files.pythonhosted.org/packages/d2/45/f3466739aaafa570cc8e77c6dbb853c48bf56e3b43738020e2661e08b0ac/orjson-3.11.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:996b65230271f1a97026fd0e6a753f51fbc0c335d2ad0c6201f711b0da32693b", size = 138307, upload-time = "2026-02-02T15:38:17.453Z" }, - { url = "https://files.pythonhosted.org/packages/e1/84/9f7f02288da1ffb31405c1be07657afd1eecbcb4b64ee2817b6fe0f785fa/orjson-3.11.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ab49d4b2a6a1d415ddb9f37a21e02e0d5dbfe10b7870b21bf779fc21e9156157", size = 408695, upload-time = "2026-02-02T15:38:18.831Z" }, - { url = "https://files.pythonhosted.org/packages/18/07/9dd2f0c0104f1a0295ffbe912bc8d63307a539b900dd9e2c48ef7810d971/orjson-3.11.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:390a1dce0c055ddf8adb6aa94a73b45a4a7d7177b5c584b8d1c1947f2ba60fb3", size = 144099, upload-time = "2026-02-02T15:38:20.28Z" }, - { url = "https://files.pythonhosted.org/packages/a5/66/857a8e4a3292e1f7b1b202883bcdeb43a91566cf59a93f97c53b44bd6801/orjson-3.11.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1eb80451a9c351a71dfaf5b7ccc13ad065405217726b59fdbeadbcc544f9d223", size = 134806, upload-time = "2026-02-02T15:38:22.186Z" }, - { url = "https://files.pythonhosted.org/packages/0a/5b/6ebcf3defc1aab3a338ca777214966851e92efb1f30dc7fc8285216e6d1b/orjson-3.11.7-cp313-cp313-win32.whl", hash = "sha256:7477aa6a6ec6139c5cb1cc7b214643592169a5494d200397c7fc95d740d5fcf3", size = 127914, upload-time = "2026-02-02T15:38:23.511Z" }, - { url = "https://files.pythonhosted.org/packages/00/04/c6f72daca5092e3117840a1b1e88dfc809cc1470cf0734890d0366b684a1/orjson-3.11.7-cp313-cp313-win_amd64.whl", hash = "sha256:b9f95dcdea9d4f805daa9ddf02617a89e484c6985fa03055459f90e87d7a0757", size = 124986, upload-time = "2026-02-02T15:38:24.836Z" }, - { url = "https://files.pythonhosted.org/packages/03/ba/077a0f6f1085d6b806937246860fafbd5b17f3919c70ee3f3d8d9c713f38/orjson-3.11.7-cp313-cp313-win_arm64.whl", hash = "sha256:800988273a014a0541483dc81021247d7eacb0c845a9d1a34a422bc718f41539", size = 126045, upload-time = "2026-02-02T15:38:26.216Z" }, - { url = "https://files.pythonhosted.org/packages/e9/1e/745565dca749813db9a093c5ebc4bac1a9475c64d54b95654336ac3ed961/orjson-3.11.7-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:de0a37f21d0d364954ad5de1970491d7fbd0fb1ef7417d4d56a36dc01ba0c0a0", size = 228391, upload-time = "2026-02-02T15:38:27.757Z" }, - { url = "https://files.pythonhosted.org/packages/46/19/e40f6225da4d3aa0c8dc6e5219c5e87c2063a560fe0d72a88deb59776794/orjson-3.11.7-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:c2428d358d85e8da9d37cba18b8c4047c55222007a84f97156a5b22028dfbfc0", size = 125188, upload-time = "2026-02-02T15:38:29.241Z" }, - { url = "https://files.pythonhosted.org/packages/9d/7e/c4de2babef2c0817fd1f048fd176aa48c37bec8aef53d2fa932983032cce/orjson-3.11.7-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c4bc6c6ac52cdaa267552544c73e486fecbd710b7ac09bc024d5a78555a22f6", size = 128097, upload-time = "2026-02-02T15:38:30.618Z" }, - { url = "https://files.pythonhosted.org/packages/eb/74/233d360632bafd2197f217eee7fb9c9d0229eac0c18128aee5b35b0014fe/orjson-3.11.7-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd0d68edd7dfca1b2eca9361a44ac9f24b078de3481003159929a0573f21a6bf", size = 123364, upload-time = "2026-02-02T15:38:32.363Z" }, - { url = "https://files.pythonhosted.org/packages/79/51/af79504981dd31efe20a9e360eb49c15f06df2b40e7f25a0a52d9ae888e8/orjson-3.11.7-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:623ad1b9548ef63886319c16fa317848e465a21513b31a6ad7b57443c3e0dcf5", size = 129076, upload-time = "2026-02-02T15:38:33.68Z" }, - { url = "https://files.pythonhosted.org/packages/67/e2/da898eb68b72304f8de05ca6715870d09d603ee98d30a27e8a9629abc64b/orjson-3.11.7-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6e776b998ac37c0396093d10290e60283f59cfe0fc3fccbd0ccc4bd04dd19892", size = 141705, upload-time = "2026-02-02T15:38:34.989Z" }, - { url = "https://files.pythonhosted.org/packages/c5/89/15364d92acb3d903b029e28d834edb8780c2b97404cbf7929aa6b9abdb24/orjson-3.11.7-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:652c6c3af76716f4a9c290371ba2e390ede06f6603edb277b481daf37f6f464e", size = 130855, upload-time = "2026-02-02T15:38:36.379Z" }, - { url = "https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a56df3239294ea5964adf074c54bcc4f0ccd21636049a2cf3ca9cf03b5d03cf1", size = 133386, upload-time = "2026-02-02T15:38:37.704Z" }, - { url = "https://files.pythonhosted.org/packages/b9/0e/45e1dcf10e17d0924b7c9162f87ec7b4ca79e28a0548acf6a71788d3e108/orjson-3.11.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bda117c4148e81f746655d5a3239ae9bd00cb7bc3ca178b5fc5a5997e9744183", size = 138295, upload-time = "2026-02-02T15:38:39.096Z" }, - { url = "https://files.pythonhosted.org/packages/63/d7/4d2e8b03561257af0450f2845b91fbd111d7e526ccdf737267108075e0ba/orjson-3.11.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:23d6c20517a97a9daf1d48b580fcdc6f0516c6f4b5038823426033690b4d2650", size = 408720, upload-time = "2026-02-02T15:38:40.634Z" }, - { url = "https://files.pythonhosted.org/packages/78/cf/d45343518282108b29c12a65892445fc51f9319dc3c552ceb51bb5905ed2/orjson-3.11.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:8ff206156006da5b847c9304b6308a01e8cdbc8cce824e2779a5ba71c3def141", size = 144152, upload-time = "2026-02-02T15:38:42.262Z" }, - { url = "https://files.pythonhosted.org/packages/a9/3a/d6001f51a7275aacd342e77b735c71fa04125a3f93c36fee4526bc8c654e/orjson-3.11.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:962d046ee1765f74a1da723f4b33e3b228fe3a48bd307acce5021dfefe0e29b2", size = 134814, upload-time = "2026-02-02T15:38:43.627Z" }, - { url = "https://files.pythonhosted.org/packages/1d/d3/f19b47ce16820cc2c480f7f1723e17f6d411b3a295c60c8ad3aa9ff1c96a/orjson-3.11.7-cp314-cp314-win32.whl", hash = "sha256:89e13dd3f89f1c38a9c9eba5fbf7cdc2d1feca82f5f290864b4b7a6aac704576", size = 127997, upload-time = "2026-02-02T15:38:45.06Z" }, - { url = "https://files.pythonhosted.org/packages/12/df/172771902943af54bf661a8d102bdf2e7f932127968080632bda6054b62c/orjson-3.11.7-cp314-cp314-win_amd64.whl", hash = "sha256:845c3e0d8ded9c9271cd79596b9b552448b885b97110f628fb687aee2eed11c1", size = 124985, upload-time = "2026-02-02T15:38:46.388Z" }, - { url = "https://files.pythonhosted.org/packages/6f/1c/f2a8d8a1b17514660a614ce5f7aac74b934e69f5abc2700cc7ced882a009/orjson-3.11.7-cp314-cp314-win_arm64.whl", hash = "sha256:4a2e9c5be347b937a2e0203866f12bba36082e89b402ddb9e927d5822e43088d", size = 126038, upload-time = "2026-02-02T15:38:47.703Z" }, -] - [[package]] name = "packaging" version = "23.0" From 944394a3ed3553a834e7f029282f6ac8f878a952 Mon Sep 17 00:00:00 2001 From: rayharnett Date: Mon, 18 May 2026 12:14:00 +0100 Subject: [PATCH 2/3] Fix E501 line-too-long violations in collection_util.py - Split deep_update function signature across lines - Wrap docstrings in make_mutable and flatten_dict - Shorten comment about dictionary handling - All ruff checks now pass Co-Authored-By: Claude Haiku 4.5 --- src/fides/api/util/collection_util.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/fides/api/util/collection_util.py b/src/fides/api/util/collection_util.py index 4fbdaf68049..fb4f447120a 100644 --- a/src/fides/api/util/collection_util.py +++ b/src/fides/api/util/collection_util.py @@ -13,12 +13,18 @@ FIDESOPS_DO_NOT_MASK_INDEX = "FIDESOPS_DO_NOT_MASK" -def deep_update(mapping: Dict[str, Any], *updating_mappings: Dict[str, Any]) -> Dict[str, Any]: +def deep_update( + mapping: Dict[str, Any], *updating_mappings: Dict[str, Any] +) -> Dict[str, Any]: """Recursively merge dicts, with later mappings taking precedence.""" updated_mapping = mapping.copy() for updating_mapping in updating_mappings: for k, v in updating_mapping.items(): - if k in updated_mapping and isinstance(updated_mapping[k], dict) and isinstance(v, dict): + if ( + k in updated_mapping + and isinstance(updated_mapping[k], dict) + and isinstance(v, dict) + ): updated_mapping[k] = deep_update(updated_mapping[k], v) else: updated_mapping[k] = v @@ -43,8 +49,9 @@ def make_immutable(obj: Any) -> Any: def make_mutable(obj: Any) -> Any: """ Recursively converts an immutable object into a mutable version. - `Map`s from the `immutables` library and dictionaries are converted to mutable dictionaries, - tuples and `OrderedSet`s are converted to lists, and other objects are returned unchanged. + `Map`s from the `immutables` library and dicts are converted to dicts, + tuples and `OrderedSet`s are converted to lists, and other objects are + returned unchanged. """ if isinstance(obj, (dict, immutables.Map)): return {key: make_mutable(value) for key, value in obj.items()} @@ -168,7 +175,7 @@ def unflatten_dict(flat_dict: Dict[str, Any], separator: str = ".") -> Dict[str, target.append(None) target[idx] = value else: - # If the value is a dictionary, add its components to the queue for processing + # If value is a dict, add its components to the queue for processing if isinstance(value, dict): target = target.setdefault(keys[-1], {}) for inner_key, inner_value in value.items(): @@ -186,9 +193,9 @@ def unflatten_dict(flat_dict: Dict[str, Any], separator: str = ".") -> Dict[str, # pylint: disable=too-many-branches def flatten_dict(data: Any, prefix: str = "", separator: str = ".") -> Dict[str, Any]: """ - Recursively flatten a dictionary or list into a flat dictionary with dot-notation keys. - Handles nested dictionaries and arrays with proper indices. - Preserves empty lists and dictionaries. + Recursively flatten a dict or list into a flat dict with dot-notation keys. + Handles nested dicts and arrays with proper indices. + Preserves empty lists and dicts. example: From 0369851e0ed9b2ca97748a2047090755d610da85 Mon Sep 17 00:00:00 2001 From: rayharnett Date: Mon, 18 May 2026 12:45:37 +0100 Subject: [PATCH 3/3] add changelog for PR #8214 --- changelog/8214-bump-fastapi.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/8214-bump-fastapi.yaml diff --git a/changelog/8214-bump-fastapi.yaml b/changelog/8214-bump-fastapi.yaml new file mode 100644 index 00000000000..d6b60193fe8 --- /dev/null +++ b/changelog/8214-bump-fastapi.yaml @@ -0,0 +1,4 @@ +type: Changed +description: Bumped fastapi from 0.123.3 to 0.136.1 +pr: 8214 +labels: []