File: test_schema.py

package info (click to toggle)
python-apischema 0.18.3-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,636 kB
  • sloc: python: 15,281; makefile: 3; sh: 2
file content (59 lines) | stat: -rw-r--r-- 1,516 bytes parent folder | download | duplicates (2)
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
from dataclasses import dataclass, field
from typing import NewType, Optional

from apischema import deserializer, schema, type_name
from apischema.json_schema import deserialization_schema


class Foo:
    pass


@dataclass
class Bar:
    foo: Optional[Foo]


@deserializer
def foo(bar: Bar) -> Foo:
    return bar.foo or Foo()


def test_recursive_by_conversion_schema():
    assert deserialization_schema(Foo) == {
        "$ref": "#/$defs/Foo",
        "$defs": {
            "Foo": {
                "type": "object",
                "properties": {
                    "foo": {"anyOf": [{"$ref": "#/$defs/Foo"}, {"type": "null"}]}
                },
                "required": ["foo"],
                "additionalProperties": False,
            }
        },
        "$schema": "http://json-schema.org/draft/2020-12/schema#",
    }


MoreThanTwo = NewType("MoreThanTwo", int)
schema(min=0, extra=lambda s: s.update({"minimum": 2}))(type_name(None)(MoreThanTwo))


@dataclass
class WithSchema:
    attr1: MoreThanTwo = field(metadata=schema(min=3))
    attr2: MoreThanTwo = field(metadata=schema(min=1))


def test_flattened_schema():
    assert deserialization_schema(WithSchema) == {
        "$schema": "http://json-schema.org/draft/2020-12/schema#",
        "type": "object",
        "properties": {
            "attr1": {"type": "integer", "minimum": 3},
            "attr2": {"type": "integer", "minimum": 2},
        },
        "required": ["attr1", "attr2"],
        "additionalProperties": False,
    }