Skip to content

Commit

Permalink
Re-organize exports for new validators and serializers (pydantic#5641)
Browse files Browse the repository at this point in the history
  • Loading branch information
adriangb authored May 9, 2023
1 parent ab31b36 commit bd463b7
Show file tree
Hide file tree
Showing 34 changed files with 1,047 additions and 900 deletions.
1 change: 0 additions & 1 deletion docs/api/decorators.md

This file was deleted.

1 change: 1 addition & 0 deletions docs/api/functional_serializers.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
::: pydantic.functional_serializers
1 change: 1 addition & 0 deletions docs/api/functional_validators.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
::: pydantic.functional_validators
27 changes: 14 additions & 13 deletions docs/usage/validators.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ from typing import List
from typing_extensions import Annotated

from pydantic import BaseModel, ValidationError, field_validator
from pydantic.annotated_arguments import AfterValidator
from pydantic.functional_validators import AfterValidator


def check_squares(v: int) -> int:
Expand Down Expand Up @@ -177,7 +177,7 @@ from typing import List, TypeVar
from typing_extensions import Annotated

from pydantic import BaseModel
from pydantic.annotated_arguments import AfterValidator
from pydantic.functional_validators import AfterValidator

T = TypeVar('T')

Expand Down Expand Up @@ -266,30 +266,31 @@ declarative.
define a help function with which you will avoid setting `allow_reuse=True` over and
over again.

## Root Validators
## Model Validators

Validation can also be performed on the entire model's data.

```py
from pydantic import BaseModel, ValidationError, root_validator
from pydantic import BaseModel, ValidationError, model_validator


class UserModel(BaseModel):
username: str
password1: str
password2: str

@root_validator(pre=True)
def check_card_number_omitted(cls, values):
assert 'card_number' not in values, 'card_number should not be included'
return values
@model_validator(mode='before')
def check_card_number_omitted(cls, data):
assert 'card_number' not in data, 'card_number should not be included'
return data

@root_validator(skip_on_failure=True)
def check_passwords_match(cls, values):
pw1, pw2 = values.get('password1'), values.get('password2')
@model_validator(mode='after')
def check_passwords_match(cls, m: 'UserModel'):
pw1 = m.password1
pw2 = m.password2
if pw1 is not None and pw2 is not None and pw1 != pw2:
raise ValueError('passwords do not match')
return values
return m


print(UserModel(username='scolvin', password1='zxcvbn', password2='zxcvbn'))
Expand Down Expand Up @@ -340,7 +341,7 @@ In this case you should set `check_fields=False` on the validator.

Validators also work with *pydantic* dataclasses.

**TODO: Change this example so that it _should_ use a validator; right now it would be better off with default_factory..**
**TODO: Change this example so that it *should* use a validator; right now it would be better off with default_factory..**

```py
from datetime import datetime
Expand Down
5 changes: 3 additions & 2 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,14 +101,15 @@ nav:
- Blog:
- blog/pydantic-v2-alpha.md
- blog/pydantic-v2.md
- API:
- API Documentation:
- 'pydantic': api/main.md
- 'pydantic.alias_generators': api/alias_generators.md
- 'pydantic.type_adapter': api/type_adapter.md
- 'pydantic.color': api/color.md
- 'pydantic.config': api/config.md
- 'pydantic.dataclasses': api/dataclasses.md
- 'pydantic.decorators': api/decorators.md
- 'pydantic.functional_validators': api/functional_validators.md
- 'pydantic.functional_serializers': api/functional_serializers.md
- 'pydantic.errors': api/errors.md
- 'pydantic.fields': api/fields.md
- 'pydantic.json_schema': api/json_schema.md
Expand Down
18 changes: 11 additions & 7 deletions pydantic/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@
from . import dataclasses
from ._migration import getattr_migration
from .config import ConfigDict, Extra
from .decorators import field_serializer, field_validator, model_serializer, model_validator, root_validator, validator
from .deprecated.config import BaseConfig
from .deprecated.class_validators import root_validator, validator
from .deprecated.config import BaseConfig # type: ignore
from .deprecated.tools import *
from .errors import *
from .fields import AliasChoices, AliasPath, Field, PrivateAttr, computed_field
from .functional_serializers import field_serializer, model_serializer
from .functional_validators import field_validator, model_validator
from .main import *
from .networks import *
from .type_adapter import TypeAdapter
Expand All @@ -30,18 +32,20 @@
__all__ = [
# dataclasses
'dataclasses',
# decorators
# functional validators
'ValidationInfo',
'FieldValidationInfo',
'ValidatorFunctionWrapHandler',
'field_validator',
'model_validator',
# deprecated V1 functional validators
'root_validator',
'validator',
# functional serializers
'field_serializer',
'model_serializer',
'ValidationInfo',
'FieldValidationInfo',
'SerializationInfo',
'FieldSerializationInfo',
'ValidatorFunctionWrapHandler',
'SerializationInfo',
'SerializerFunctionWrapHandler',
# config
'BaseConfig',
Expand Down
2 changes: 1 addition & 1 deletion pydantic/_internal/_decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
from ._internal_dataclass import slots_dataclass

if TYPE_CHECKING:
from ..decorators import FieldValidatorModes
from ..functional_validators import FieldValidatorModes

try:
from functools import cached_property # type: ignore
Expand Down
2 changes: 1 addition & 1 deletion pydantic/_internal/_generate_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@
from ._utils import lenient_issubclass

if TYPE_CHECKING:
from ..decorators import FieldValidatorModes
from ..main import BaseModel
from ..validators import FieldValidatorModes
from ._dataclasses import StandardDataclass

_SUPPORTS_TYPEDDICT = sys.version_info >= (3, 11)
Expand Down
8 changes: 7 additions & 1 deletion pydantic/_migration.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import sys
import warnings
from typing import Any, Callable
from typing import Any, Callable, Dict

from ._internal._validators import import_string

Expand All @@ -19,6 +20,8 @@
'pydantic.json.custom_pydantic_encoder': 'pydantic.deprecated.json.custom_pydantic_encoder',
'pydantic.json.timedelta_isoformat': 'pydantic.deprecated.json.timedelta_isoformat',
'pydantic.decorator.validate_arguments': 'pydantic.deprecated.decorator.validate_arguments',
'pydantic.class_validators.validator': 'pydantic.deprecated.class_validators.validator',
'pydantic.class_validators.root_validator': 'pydantic.deprecated.class_validators.root_validator',
}

REMOVED_IN_V2 = {
Expand Down Expand Up @@ -269,6 +272,9 @@ def wrapper(name: str) -> object:
return import_string(DEPRECATED_MOVED_IN_V2[import_path])
if import_path in REMOVED_IN_V2:
raise PydanticImportError(f'`{import_path}` has been removed in V2.')
globals: Dict[str, Any] = sys.modules[module].__dict__
if name in globals:
return globals[name]
raise AttributeError(f'module {__name__!r} has no attribute {name!r}')

return wrapper
95 changes: 0 additions & 95 deletions pydantic/annotated_arguments.py

This file was deleted.

Loading

0 comments on commit bd463b7

Please sign in to comment.