jcrist · GitHub

An example:

import enum
from typing import Union
import msgspec
import rich
class Role(enum.Enum):
    """A role for a team member"""
    manager = "manager"
    lead = "lead"
    developer = "developer"
    other = "other"
class TeamMember(msgspec.Struct):
    """A team member in a team"""
    name: str
    skills: list[str] = []
    email: Union[str, None] = None
    role: Role
class Team(msgspec.Struct):
    """A team in the organization"""
    name: str
    members: list[TeamMember] = []
rich.print(msgspec.json.schema(list[Team]))

And the output:

{
    'type': 'array',
    'items': {'$ref': '#/$defs/Team'},
    '$defs': {
        'Team': {
            'title': 'Team',
            'description': 'A team in the organization',
            'type': 'object',
            'required': ['name'],
            'properties': {
                'name': {'title': 'Name', 'type': 'string'},
                'members': {
                    'title': 'Members',
                    'default': [],
                    'type': 'array',
                    'items': {'$ref': '#/$defs/TeamMember'}
                }
            }
        },
        'TeamMember': {
            'title': 'TeamMember',
            'description': 'A team member in a team',
            'type': 'object',
            'required': ['name', 'role'],
            'properties': {
                'name': {'title': 'Name', 'type': 'string'},
                'role': {'$ref': '#/$defs/Role'},
                'skills': {
                    'title': 'Skills',
                    'default': [],
                    'type': 'array',
                    'items': {'type': 'string'}
                },
                'email': {
                    'title': 'Email',
                    'default': None,
                    'anyOf': [{'type': 'string'}, {'type': 'null'}]
                }
            }
        },
        'Role': {
            'title': 'Role',
            'description': 'A role for a team member',
            'enum': ['developer', 'lead', 'manager', 'other']
        }
    }
}

Read the original on github.com ↗