JSON Schema

TypeSystem can convert Schema or Field instances to/from JSON Schema.

Note

TypeSystem only supports $ref pointers that use the standard "components/schemas" namespace to store referenced schemas.

All references should be of the style {"$ref": "#/components/schemas/..."}.

Using hyperlinked references, relative references, or references to parts of the document other than "components/schemas" is not supported.

Let's define a schema, and dump it out into a JSON schema document:

import json
import typesystem

booking_schema = typesystem.Schema(
    fields={
        "start_date": typesystem.Date(title="Start date"),
        "end_date": typesystem.Date(title="End date"),
        "room": typesystem.Choice(title="Room type", choices=[
            ('double', 'Double room'),
            ('twin', 'Twin room'),
            ('single', 'Single room')
        ]),
        "include_breakfast": typesystem.Boolean(title="Include breakfast", default=False),

    }
)

schema = typesystem.to_json_schema(booking_schema)
print(json.dumps(schema, indent=4))

That will print the following JSON schema document:

{
    "type": "object",
    "properties": {
        "start_date": {
            "type": "string",
            "minLength": 1,
            "format": "date"
        },
        "end_date": {
            "type": "string",
            "minLength": 1,
            "format": "date"
        },
        "room": {
            "enum": [
                "double",
                "twin",
                "single"
            ]
        },
        "include_breakfast": {
            "type": "boolean",
            "default": false
        }
    },
    "required": [
        "start_date",
        "end_date",
        "room"
    ]
}

We can also convert in the other direction:

import typesystem

schema = {
    "type": "object",
    "properties": {
        "start_date": {
            "type": "string",
            "minLength": 1,
            "format": "date"
        },
        "end_date": {
            "type": "string",
            "minLength": 1,
            "format": "date"
        },
        "room": {
            "enum": [
                "double",
                "twin",
                "single"
            ]
        },
        "include_breakfast": {
            "type": "boolean",
            "default": False
        }
    },
    "required": [
        "start_date",
        "end_date",
        "room"
    ]
}

validator = typesystem.from_json_schema(schema)
validator.validate({
  'start_date': '2021-01-01',
  'end_date': '2021-01-03'
})
# raises `ValidationError: {'room': 'This field is required.'}`