1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
from dataclasses import dataclass
from typing import Generic, TypeVar
import pytest
from apischema import ValidationError, deserialize
from apischema.typing import Annotated
T = TypeVar("T")
@dataclass
class A(Generic[T]):
a: T
@dataclass
class B(Generic[T]):
b: T
def a_to_b(a: A[T]) -> B[T]:
return B(a.a)
def test_generic_conversion():
assert deserialize(B[int], {"a": 0}, conversion=a_to_b) == B(0)
with pytest.raises(ValidationError):
deserialize(B[int], {"a": ""}, conversion=a_to_b)
def a_to_b_unparametrized(a: A) -> B:
return B(a.a)
def test_unparameterized_generic_conversion():
# With unparametrized conversion, generic args are lost
assert deserialize(B[int], {"a": ""}, conversion=a_to_b_unparametrized) == B("")
def a_to_b_annotated(a: Annotated[A[T], "a"]) -> B[T]:
return B(a.a)
def test_annotated_generic_conversion():
assert deserialize(B[int], {"a": 0}, conversion=a_to_b_annotated) == B(0)
with pytest.raises(ValidationError):
deserialize(B[int], {"a": ""}, conversion=a_to_b_annotated)
|