From 16e7a5cb8a1e02fce3f5ec1dbf55263f569b3612 Mon Sep 17 00:00:00 2001 From: Alex Couper Date: Thu, 23 May 2024 23:47:40 +0000 Subject: [PATCH] Only use feature if it's available --- fastapi/_compat.py | 6 +++++- tests/test_serialize_response_model.py | 5 ++++- tests/utils.py | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/fastapi/_compat.py b/fastapi/_compat.py index 714c9c4d2..90cec70b5 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -147,6 +147,10 @@ if PYDANTIC_V2: ) -> Any: # What calls this code passes a value that already called # self._type_adapter.validate_python(value) + # + # context argument was introduced in pydantic 2.7.3 + kwargs = {"context": context} if PYDANTIC_VERSION > "2.7.2" else {} + return self._type_adapter.dump_python( value, mode=mode, @@ -156,7 +160,7 @@ if PYDANTIC_V2: exclude_unset=exclude_unset, exclude_defaults=exclude_defaults, exclude_none=exclude_none, - context=context, + **kwargs, ) def __hash__(self) -> int: diff --git a/tests/test_serialize_response_model.py b/tests/test_serialize_response_model.py index 612d41fc1..754e1a382 100644 --- a/tests/test_serialize_response_model.py +++ b/tests/test_serialize_response_model.py @@ -1,7 +1,9 @@ from typing import Dict, List, Optional +import pytest from fastapi import FastAPI -from pydantic import BaseModel, Field +from fastapi._compat import PYDANTIC_VERSION +from pydantic import BaseModel, Field, SerializationInfo, model_serializer from starlette.testclient import TestClient app = FastAPI() @@ -176,6 +178,7 @@ def test_validdict_exclude_unset(): } +@pytest.mark.skipif(PYDANTIC_VERSION < "2.7.2", reason="requires Pydantic 2.7.3+") def test_validdict_with_context(): response = client.get("/items/validdict-with-context") response.raise_for_status() diff --git a/tests/utils.py b/tests/utils.py index 460c028f7..3f9459b20 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -8,4 +8,4 @@ needs_py310 = pytest.mark.skipif( sys.version_info < (3, 10), reason="requires python3.10+" ) needs_pydanticv2 = pytest.mark.skipif(not PYDANTIC_V2, reason="requires Pydantic v2") -needs_pydanticv1 = pytest.mark.skipif(PYDANTIC_V2, reason="requires Pydantic v1") +needs_pydanticv1 = pytest.mark.skipif(PYDANTIC_V2, reason="requires Pydantic v1") \ No newline at end of file