File: inherited_discriminator.py

package info (click to toggle)
python-apischema 0.18.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 1,608 kB
  • sloc: python: 15,266; sh: 7; makefile: 7
file content (43 lines) | stat: -rw-r--r-- 1,082 bytes parent folder | download
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
from dataclasses import dataclass

from apischema import deserialize, discriminator, serialize
from apischema.json_schema import deserialization_schema


@discriminator("type")
class Pet:
    pass


@dataclass
class Cat(Pet):
    pass


@dataclass
class Dog(Pet):
    pass


data = {"type": "Dog"}
assert deserialize(Pet, data) == deserialize(Cat | Dog, data) == Dog()
assert serialize(Pet, Dog()), serialize(Cat | Dog, Dog()) == data

assert (
    deserialization_schema(Pet)
    == deserialization_schema(Cat | Dog)
    == {
        "$schema": "http://json-schema.org/draft/2020-12/schema#",
        "oneOf": [{"$ref": "#/$defs/Cat"}, {"$ref": "#/$defs/Dog"}],
        "$defs": {
            "Pet": {
                "type": "object",
                "required": ["type"],
                "properties": {"type": {"type": "string"}},
                "discriminator": {"propertyName": "type"},
            },
            "Cat": {"allOf": [{"$ref": "#/$defs/Pet"}, {"type": "object"}]},
            "Dog": {"allOf": [{"$ref": "#/$defs/Pet"}, {"type": "object"}]},
        },
    }
)