Skip to content

Commit

Permalink
Fix ordering bug of PlainValidator annotation #8512 (#8567)
Browse files Browse the repository at this point in the history
Signed-off-by: Damien Nadé <anvil.github@livna.org>
  • Loading branch information
Anvil committed Jan 19, 2024
1 parent 8e9b107 commit 48d0df4
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 2 deletions.
8 changes: 6 additions & 2 deletions pydantic/functional_validators.py
Expand Up @@ -153,13 +153,17 @@ class Model(BaseModel):
func: core_schema.NoInfoValidatorFunction | core_schema.WithInfoValidatorFunction

def __get_pydantic_core_schema__(self, source_type: Any, handler: _GetCoreSchemaHandler) -> core_schema.CoreSchema:
schema = handler(source_type)
serialization = core_schema.wrap_serializer_function_ser_schema(function=lambda v, h: h(v), schema=schema)
info_arg = _inspect_validator(self.func, 'plain')
if info_arg:
func = cast(core_schema.WithInfoValidatorFunction, self.func)
return core_schema.with_info_plain_validator_function(func, field_name=handler.field_name)
return core_schema.with_info_plain_validator_function(
func, field_name=handler.field_name, serialization=serialization
)
else:
func = cast(core_schema.NoInfoValidatorFunction, self.func)
return core_schema.no_info_plain_validator_function(func)
return core_schema.no_info_plain_validator_function(func, serialization=serialization)


@dataclasses.dataclass(frozen=True, **_internal_dataclass.slots_true)
Expand Down
17 changes: 17 additions & 0 deletions tests/test_validators.py
Expand Up @@ -20,6 +20,7 @@
ConfigDict,
Field,
GetCoreSchemaHandler,
PlainSerializer,
PydanticDeprecatedSince20,
PydanticUserError,
TypeAdapter,
Expand Down Expand Up @@ -2806,3 +2807,19 @@ def value_b_validator(cls, value):
'ctx': {'error': IsInstance(AssertionError)},
},
]


def test_plain_validator_plain_serializer() -> None:
"""https://github.com/pydantic/pydantic/issues/8512"""
ser_type = str
serializer = PlainSerializer(lambda x: ser_type(int(x)), return_type=ser_type)
validator = PlainValidator(lambda x: bool(int(x)))

class Blah(BaseModel):
foo: Annotated[bool, validator, serializer]
bar: Annotated[bool, serializer, validator]

blah = Blah(foo='0', bar='1')
data = blah.model_dump()
assert isinstance(data['foo'], ser_type)
assert isinstance(data['bar'], ser_type)

0 comments on commit 48d0df4

Please sign in to comment.