File: dataclass_init.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,262 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 InitVar, dataclass, field

import pytest

from apischema import ValidationError, deserialize, serialize, validator
from apischema.json_schema import definitions_schema
from apischema.metadata import init_var


@dataclass
class Foo:
    bar: int
    init_only: InitVar[int] = field(metadata=init_var(int))
    no_init: int = field(init=False)

    def __post_init__(self, init_only: int):
        self.no_init = init_only

    # InitVar are passed as kwargs, like in __post_init__
    @validator
    def validate(self, init_only: int):
        if self.bar == init_only:
            raise ValueError("Error")


assert deserialize(Foo, {"bar": 0, "init_only": 1}) == Foo(0, 1)
assert serialize(Foo, Foo(0, 1)) == {"bar": 0, "no_init": 1}
with pytest.raises(ValidationError) as err:
    deserialize(Foo, {"bar": 0})
assert definitions_schema(
    deserialization=[Foo], serialization=[Foo], all_refs=True
) == {
    "Foo": {
        "type": "object",
        "properties": {
            "bar": {"type": "integer"},
            "no_init": {"readOnly": True, "type": "integer"},
            "init_only": {"writeOnly": True, "type": "integer"},
        },
        "additionalProperties": False,
        "required": ["bar", "init_only"],
    }
}