resolved RESOLVED UNSUBMITTED PASS ยท None tool calls ยท 0 s ยท fastapi/fastapi
๐ Fix handling arbitrary types when using `arbitrary_types_allowed=True` ๐ Fix handling arbitrary types when using `arbitrary_types_allowed=True` Related to https://github.com/fastapi/fastapi/discussions/14184, https://github.com/fastapi/fastapi/issues/14483
| # | Tool | Arguments | Result |
|---|---|---|---|
| No trace captured. | |||
--- a/fastapi/_compat/v2.py
+++ b/fastapi/_compat/v2.py
@@ -1,7 +1,7 @@
import re
import warnings
from copy import copy, deepcopy
-from dataclasses import dataclass
+from dataclasses import dataclass, is_dataclass
from enum import Enum
from typing import (
Any,
@@ -18,7 +18,7 @@
from fastapi._compat import may_v1, shared
from fastapi.openapi.constants import REF_TEMPLATE
from fastapi.types import IncEx, ModelNameMap, UnionType
-from pydantic import BaseModel, TypeAdapter, create_model
+from pydantic import BaseModel, ConfigDict, TypeAdapter, create_model
from pydantic import PydanticSchemaGenerationError as PydanticSchemaGenerationError
from pydantic import PydanticUndefinedAnnotation as PydanticUndefinedAnnotation
from pydantic import ValidationError as ValidationError
@@ -64,6 +64,7 @@ class ModelField:
field_info: FieldInfo
name: str
mode: Literal["validation", "serialization"] = "validation"
+ config: Union[ConfigDict, None] = None
@property
def alias(self) -> str:
@@ -94,8 +95,14 @@ def __post_init__(self) -> None:
warnings.simplefilter(
"ignore", category=UnsupportedFieldAttributeWarning
)
+ annotated_args = (
+ self.field_info.annotation,
+ *self.field_info.metadata,
+ self.field_info,
+ )
self._type_adapter: TypeAdapter[Any] = TypeAdapter(
- Annotated[self.field_info.annotation, self.field_info]
+ Annotated[annotated_args],
+ config=self.config,
)
def get_default(self) -> Any:
@@ -412,10 +419,21 @@ def create_body_model(
def get_model_fields(model: Type[BaseModel]) -> List[ModelField]:
- return [
- ModelField(field_info=field_info, name=name)
- for name, field_info in model.model_fields.items()
- ]
+ model_fields: List[ModelField] = []
+ for name, field_info in model.model_fields.items():
+ type_ = field_info.annotation
+ if lenient_issubclass(type_, (BaseModel, dict)) or is_dataclass(type_):
+ model_config = None
+ else:
+ model_config = model.model_config
+ model_fields.append(
+ ModelField(
+ field_info=field_info,
+ name=name,
+ config=model_config,
+ )
+ )
+ return model_fields
# Duplicate of several schema functions from Pydantic v1 to make them compatible with... [100%]
=============================== warnings summary ===============================
../../../../../../../Users/jp/repos/kaggle-gemini-coding-agent-post-training/.envs/overlays/starlette-0.50.0-py3-none-any/starlette/testclient.py:45
/Users/jp/repos/kaggle-gemini-coding-agent-post-training/.envs/overlays/starlette-0.50.0-py3-none-any/starlette/testclient.py:45: DeprecationWarning: The anyio.abc.BlockingPortal alias is deprecated, use anyio.from_thread.BlockingPortal instead.
_PortalFactoryType = Callable[[], AbstractContextManager[anyio.abc.BlockingPortal]]
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
3 passed, 1 warning in 0.45s