"required": ["bar"], "additionalProperties": False, }, "Bar": { "type": "object", "properties": {"baz": {"type": ["integer", "null"]}}, "required": ["baz"], "additionalProperties": False, }, }, } assert deserialization_schema(Foo, version=JsonSchemaVersion.OPEN_API_3_0) == { # No definitions for OpenAPI, use refs_schema for it "$ref": "#/components/schemas/Foo", # OpenAPI prefix } 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": {
from dataclasses import dataclass from apischema.json_schema import definitions_schema @dataclass class Bar: baz: int = 0 @dataclass class Foo: bar: Bar assert definitions_schema(deserialization=[list[Foo]], all_refs=True) == { "Foo": { "type": "object", "properties": {"bar": {"$ref": "#/$defs/Bar"}}, "required": ["bar"], "additionalProperties": False, }, "Bar": { "type": "object", "properties": {"baz": {"type": "integer"}}, "additionalProperties": False, }, }
# Serialization fields computation can be deferred in a function # The serialization name will then be defaulted to the function name complete = object_serialization(Data, complete_data) data = Data(0, "data") assert serialize(Data, data, conversion=size_only) == {"id": 0, "size": 4} assert serialize(Data, data, conversion=complete) == { "id": 0, "content": "data", "size": 4, "details": None, # because get_details return None in this example } assert definitions_schema( serialization=[(Data, size_only), (Data, complete)], version=JsonSchemaVersion.OPEN_API_3_0, ) == { "DataSize": { "type": "object", "properties": { "id": { "type": "integer" }, "size": { "type": "integer" } }, "required": ["id", "size"], "additionalProperties": False, }, "CompleteData": {