|
1 | 1 | import ipaddress |
2 | 2 | import uuid |
| 3 | +import inspect as inspect_module |
3 | 4 | import weakref |
4 | 5 | from datetime import date, datetime, time, timedelta |
5 | 6 | from decimal import Decimal |
|
26 | 27 | ) |
27 | 28 |
|
28 | 29 | from pydantic import BaseModel, EmailStr |
| 30 | +from pydantic import Field as PydanticField |
29 | 31 | from pydantic.fields import FieldInfo as PydanticFieldInfo |
30 | 32 | from sqlalchemy import ( |
31 | 33 | Boolean, |
|
52 | 54 | from sqlalchemy.orm.instrumentation import is_instrumented |
53 | 55 | from sqlalchemy.sql.schema import MetaData |
54 | 56 | from sqlalchemy.sql.sqltypes import LargeBinary, Time, Uuid |
55 | | -from typing_extensions import Literal, TypeAlias, deprecated, get_origin |
| 57 | +from typing_extensions import Annotated, Literal, TypeAlias, deprecated, get_origin |
56 | 58 |
|
57 | 59 | from ._compat import ( # type: ignore[attr-defined] |
58 | 60 | IS_PYDANTIC_V2, |
|
98 | 100 | ] |
99 | 101 | OnDeleteType = Literal["CASCADE", "SET NULL", "RESTRICT"] |
100 | 102 |
|
| 103 | +FIELD_ACCEPTED_KWARGS = set(inspect_module.signature(PydanticField).parameters.keys()) |
| 104 | +FIELD_ACCEPTED_KWARGS.remove('json_schema_extra') |
| 105 | + |
101 | 106 |
|
102 | 107 | def __dataclass_transform__( |
103 | 108 | *, |
@@ -248,7 +253,19 @@ def Field( |
248 | 253 | sa_type: Union[Type[Any], UndefinedType] = Undefined, |
249 | 254 | sa_column_args: Union[Sequence[Any], UndefinedType] = Undefined, |
250 | 255 | sa_column_kwargs: Union[Mapping[str, Any], UndefinedType] = Undefined, |
251 | | - schema_extra: Optional[Dict[str, Any]] = None, |
| 256 | + schema_extra: Annotated[ |
| 257 | + Optional[Dict[str, Any]], |
| 258 | + deprecated( |
| 259 | + """ |
| 260 | + This parameter is deprecated. |
| 261 | + Use `json_schema_extra` to add extra information to the JSON schema. |
| 262 | + Use `pydantic_kwargs` to pass additional parameters to `Field` that are not |
| 263 | + part of this interface, but accepted by Pydantic's Field. |
| 264 | + """ |
| 265 | + ), |
| 266 | + ] = None, |
| 267 | + json_schema_extra: Optional[Dict[str, Any]] = None, |
| 268 | + pydantic_kwargs: Optional[Dict[str, Any]] = None, |
252 | 269 | ) -> Any: ... |
253 | 270 |
|
254 | 271 |
|
@@ -294,8 +311,19 @@ def Field( |
294 | 311 | sa_type: Union[Type[Any], UndefinedType] = Undefined, |
295 | 312 | sa_column_args: Union[Sequence[Any], UndefinedType] = Undefined, |
296 | 313 | sa_column_kwargs: Union[Mapping[str, Any], UndefinedType] = Undefined, |
297 | | - schema_extra: Optional[Dict[str, Any]] = None, |
| 314 | + schema_extra: Annotated[ |
| 315 | + Optional[Dict[str, Any]], |
| 316 | + deprecated( |
| 317 | + """ |
| 318 | + This parameter is deprecated. |
| 319 | + Use `json_schema_extra` to add extra information to the JSON schema. |
| 320 | + Use `pydantic_kwargs` to pass additional parameters to `Field` that are not |
| 321 | + part of this interface, but accepted by Pydantic's Field. |
| 322 | + """ |
| 323 | + ), |
| 324 | + ] = None, |
298 | 325 | json_schema_extra: Optional[Dict[str, Any]] = None, |
| 326 | + pydantic_kwargs: Optional[Dict[str, Any]] = None, |
299 | 327 | ) -> Any: ... |
300 | 328 |
|
301 | 329 |
|
@@ -341,8 +369,19 @@ def Field( |
341 | 369 | discriminator: Optional[str] = None, |
342 | 370 | repr: bool = True, |
343 | 371 | sa_column: Union[Column[Any], UndefinedType] = Undefined, |
344 | | - schema_extra: Optional[Dict[str, Any]] = None, |
| 372 | + schema_extra: Annotated[ |
| 373 | + Optional[Dict[str, Any]], |
| 374 | + deprecated( |
| 375 | + """ |
| 376 | + This parameter is deprecated. |
| 377 | + Use `json_schema_extra` to add extra information to the JSON schema. |
| 378 | + Use `pydantic_kwargs` to pass additional parameters to `Field` that are not |
| 379 | + part of this interface, but accepted by Pydantic's Field. |
| 380 | + """ |
| 381 | + ), |
| 382 | + ] = None, |
345 | 383 | json_schema_extra: Optional[Dict[str, Any]] = None, |
| 384 | + pydantic_kwargs: Optional[Dict[str, Any]] = None, |
346 | 385 | ) -> Any: ... |
347 | 386 |
|
348 | 387 |
|
@@ -386,12 +425,40 @@ def Field( |
386 | 425 | sa_column: Union[Column, UndefinedType] = Undefined, # type: ignore |
387 | 426 | sa_column_args: Union[Sequence[Any], UndefinedType] = Undefined, |
388 | 427 | sa_column_kwargs: Union[Mapping[str, Any], UndefinedType] = Undefined, |
389 | | - schema_extra: Optional[Dict[str, Any]] = None, |
| 428 | + schema_extra: Annotated[ |
| 429 | + Optional[Dict[str, Any]], |
| 430 | + deprecated( |
| 431 | + """ |
| 432 | + This parameter is deprecated. |
| 433 | + Use `json_schema_extra` to add extra information to the JSON schema. |
| 434 | + Use `pydantic_kwargs` to pass additional parameters to `Field` that are not |
| 435 | + part of this interface, but accepted by Pydantic's Field. |
| 436 | + """ |
| 437 | + ), |
| 438 | + ] = None, |
390 | 439 | json_schema_extra: Optional[Dict[str, Any]] = None, |
| 440 | + pydantic_kwargs: Optional[Dict[str, Any]] = None, |
391 | 441 | ) -> Any: |
| 442 | + if schema_extra and (json_schema_extra or pydantic_kwargs): |
| 443 | + raise RuntimeError( |
| 444 | + "Passing schema_extra is not supported when " |
| 445 | + "also passing a json_schema_extra" |
| 446 | + ) |
| 447 | + |
| 448 | + current_pydantic_kwargs = pydantic_kwargs or {} |
| 449 | + current_json_schema_extra = json_schema_extra or {} |
392 | 450 | current_schema_extra = schema_extra or {} |
393 | | - if json_schema_extra: |
394 | | - current_schema_extra["json_schema_extra"] = json_schema_extra |
| 451 | + |
| 452 | + if current_schema_extra: |
| 453 | + for key, value in current_schema_extra.items(): |
| 454 | + if key in FIELD_ACCEPTED_KWARGS: |
| 455 | + current_pydantic_kwargs[key] = value |
| 456 | + else: |
| 457 | + current_json_schema_extra[key] = value |
| 458 | + |
| 459 | + print(current_pydantic_kwargs) |
| 460 | + print(current_json_schema_extra) |
| 461 | + |
395 | 462 | field_info = FieldInfo( |
396 | 463 | default, |
397 | 464 | default_factory=default_factory, |
@@ -427,7 +494,8 @@ def Field( |
427 | 494 | sa_column=sa_column, |
428 | 495 | sa_column_args=sa_column_args, |
429 | 496 | sa_column_kwargs=sa_column_kwargs, |
430 | | - **current_schema_extra, |
| 497 | + json_schema_extra=current_json_schema_extra, |
| 498 | + **current_pydantic_kwargs, |
431 | 499 | ) |
432 | 500 | post_init_field_info(field_info) |
433 | 501 | return field_info |
|
0 commit comments