mirror of
https://github.com/kennethreitz/pydantic.git
synced 2026-06-05 23:00:18 +00:00
50fd2c5b48
* Added validators for dataclass, fix #415 * Added dataclass validators * Added dataclass validators * Updated docs for added validating to dataclass * Updated docs for added validating to dataclass * Fixed line endings * Set __validators__ type to Mapping instead of Dict * Update History * Use __mro__ instead of __bases__ for gather_validators * Fix PR number * Fix issue.rst header underline * Fix HISTORY.rst merge conflict * Fix utils.py merge conflict * fix utils.py * Rebase and other fixes * Fix rebase and other issues * Change history * Remove unnecessary lines in main.py * Rebase * Update history * Rename ModelType to ModelOrDc * Added inheritance replace test * More consiste dataclass validator tests * fix history. * Remove Optional ModelOrDc Type * Fix ModelOrDc
111 lines
2.5 KiB
Python
Executable File
111 lines
2.5 KiB
Python
Executable File
from dataclasses import asdict, is_dataclass
|
|
from typing import List
|
|
|
|
import pytest
|
|
|
|
from pydantic import ValidationError, validator
|
|
from pydantic.dataclasses import dataclass
|
|
|
|
|
|
def test_simple():
|
|
@dataclass
|
|
class MyDataclass:
|
|
a: str
|
|
|
|
@validator('a')
|
|
def change_a(cls, v):
|
|
return v + ' changed'
|
|
|
|
assert MyDataclass(a='this is foobar good').a == 'this is foobar good changed'
|
|
|
|
|
|
def test_validate_whole():
|
|
@dataclass
|
|
class MyDataclass:
|
|
a: List[int]
|
|
|
|
@validator('a', whole=True, pre=True)
|
|
def check_a1(cls, v):
|
|
v.append('123')
|
|
return v
|
|
|
|
@validator('a', whole=True)
|
|
def check_a2(cls, v):
|
|
v.append(456)
|
|
return v
|
|
|
|
assert MyDataclass(a=[1, 2]).a == [1, 2, 123, 456]
|
|
|
|
|
|
def test_validate_multiple():
|
|
# also test TypeError
|
|
@dataclass
|
|
class MyDataclass:
|
|
a: str
|
|
b: str
|
|
|
|
@validator('a', 'b')
|
|
def check_a_and_b(cls, v, field, **kwargs):
|
|
if len(v) < 4:
|
|
raise TypeError(f'{field.alias} is too short')
|
|
return v + 'x'
|
|
|
|
assert asdict(MyDataclass(a='1234', b='5678')) == {'a': '1234x', 'b': '5678x'}
|
|
|
|
with pytest.raises(ValidationError) as exc_info:
|
|
MyDataclass(a='x', b='x')
|
|
assert exc_info.value.errors() == [
|
|
{'loc': ('a',), 'msg': 'a is too short', 'type': 'type_error'},
|
|
{'loc': ('b',), 'msg': 'b is too short', 'type': 'type_error'},
|
|
]
|
|
|
|
|
|
def test_classmethod():
|
|
@dataclass
|
|
class MyDataclass:
|
|
a: str
|
|
|
|
@validator('a')
|
|
def check_a(cls, v):
|
|
assert cls is MyDataclass and is_dataclass(MyDataclass)
|
|
return v
|
|
|
|
m = MyDataclass(a='this is foobar good')
|
|
assert m.a == 'this is foobar good'
|
|
m.check_a('x')
|
|
|
|
|
|
def test_validate_parent():
|
|
@dataclass
|
|
class Parent:
|
|
a: str
|
|
|
|
@validator('a')
|
|
def change_a(cls, v):
|
|
return v + ' changed'
|
|
|
|
@dataclass
|
|
class Child(Parent):
|
|
pass
|
|
|
|
assert Parent(a='this is foobar good').a == 'this is foobar good changed'
|
|
assert Child(a='this is foobar good').a == 'this is foobar good changed'
|
|
|
|
|
|
def test_inheritance_replace():
|
|
@dataclass
|
|
class Parent:
|
|
a: int
|
|
|
|
@validator('a')
|
|
def add_to_a(cls, v):
|
|
return v + 1
|
|
|
|
@dataclass
|
|
class Child(Parent):
|
|
@validator('a')
|
|
def add_to_a(cls, v):
|
|
return v + 5
|
|
|
|
assert Child(a=0).a == 5
|