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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
from dataclasses import dataclass, field
from typing import List, Optional
import pytest
from apischema import settings
from apischema.conversions import Conversion, LazyConversion
from apischema.metadata import conversion
from apischema.recursion import DeserializationRecursiveChecker, is_recursive
class A:
pass
@dataclass
class B:
b: Optional["B"]
@dataclass
class C:
b: B
d: "D"
f: "F"
@dataclass
class D:
c: List[C]
@dataclass
class E:
c: List[C]
@dataclass
class F:
e: E
rec_conv = None
@dataclass
class G:
a: Optional[A] = field(
metadata=conversion(deserialization=LazyConversion(lambda: rec_conv))
)
rec_conv = Conversion(lambda _: None, source=Optional[G], target=A)
@pytest.mark.parametrize(
"tp, expected",
[(A, False), (B, True), (C, True), (D, True), (E, True), (F, True), (G, True)],
)
def test_is_recursive(tp, expected):
assert (
is_recursive(
tp,
None,
settings.deserialization.default_conversion,
DeserializationRecursiveChecker,
)
== expected
)
|