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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
from dataclasses import dataclass
from typing import Literal
from apischema.json_schema import (
JsonSchemaVersion,
definitions_schema,
deserialization_schema,
)
@dataclass
class Bar:
baz: int | None
constant: Literal[0] = 0
@dataclass
class Foo:
bar: Bar
assert deserialization_schema(Foo, all_refs=True) == {
"$schema": "http://json-schema.org/draft/2020-12/schema#",
"$ref": "#/$defs/Foo",
"$defs": {
"Foo": {
"type": "object",
"properties": {"bar": {"$ref": "#/$defs/Bar"}},
"required": ["bar"],
"additionalProperties": False,
},
"Bar": {
"type": "object",
"properties": {
"baz": {"type": ["integer", "null"]},
"constant": {"type": "integer", "const": 0, "default": 0},
},
"required": ["baz"],
"additionalProperties": False,
},
},
}
assert deserialization_schema(
Foo, all_refs=True, version=JsonSchemaVersion.DRAFT_7
) == {
"$schema": "http://json-schema.org/draft-07/schema#",
# $ref is isolated in allOf + draft 7 prefix
"allOf": [{"$ref": "#/definitions/Foo"}],
"definitions": { # not "$defs"
"Foo": {
"type": "object",
"properties": {"bar": {"$ref": "#/definitions/Bar"}},
"required": ["bar"],
"additionalProperties": False,
},
"Bar": {
"type": "object",
"properties": {
"baz": {"type": ["integer", "null"]},
"constant": {"type": "integer", "const": 0, "default": 0},
},
"required": ["baz"],
"additionalProperties": False,
},
},
}
assert deserialization_schema(Foo, version=JsonSchemaVersion.OPEN_API_3_1) == {
# No definitions for OpenAPI, use definitions_schema for it
"$ref": "#/components/schemas/Foo" # OpenAPI prefix
}
assert definitions_schema(
deserialization=[Foo], version=JsonSchemaVersion.OPEN_API_3_1
) == {
"Foo": {
"type": "object",
"properties": {"bar": {"$ref": "#/components/schemas/Bar"}},
"required": ["bar"],
"additionalProperties": False,
},
"Bar": {
"type": "object",
"properties": {
"baz": {"type": ["integer", "null"]},
"constant": {"type": "integer", "const": 0, "default": 0},
},
"required": ["baz"],
"additionalProperties": False,
},
}
assert definitions_schema(
deserialization=[Foo], version=JsonSchemaVersion.OPEN_API_3_0
) == {
"Foo": {
"type": "object",
"properties": {"bar": {"$ref": "#/components/schemas/Bar"}},
"required": ["bar"],
"additionalProperties": False,
},
"Bar": {
"type": "object",
# "nullable" instead of "type": "null"
"properties": {
"baz": {"type": "integer", "nullable": True},
"constant": {"type": "integer", "enum": [0], "default": 0},
},
"required": ["baz"],
"additionalProperties": False,
},
}
|