Skip to main content

Generate JSON schema from python dataclasses

Project description

dc_schema

CI codecov

Tiny library to generate JSON schema (2020-12) from python dataclasses. No other dependencies, standard library only.

pip install dc-schema 

Assumptions

  • python 3.9+

Motivation

Create a lightweight, focused solution to generate JSON schema from plain dataclasses. pydantic is a much more mature option, however it also does a lot of other things I didn't want to include here. Deepen my understanding of python dataclasses, typing and JSON schema.

Usage

Basics

Create a regular python dataclass and pass it to get_schema.

import dataclasses
import datetime
import json

from dc_schema import get_schema

@dataclasses.dataclass
class Book:
    title: str
    published: bool = False

@dataclasses.dataclass
class Author:
    name: str
    age: int
    dob: datetime.date
    books: list[Book]

print(json.dumps(get_schema(Author), indent=2))
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "title": "Author",
  "properties": {
    "name": {
      "type": "string"
    },
    "age": {
      "type": "integer"
    },
    "dob": {
      "type": "string",
      "format": "date"
    },
    "books": {
      "type": "array",
      "items": {
        "allOf": [
          {
            "$ref": "#/$defs/Book"
          }
        ]
      }
    }
  },
  "required": [
    "name",
    "age",
    "dob",
    "books"
  ],
  "$defs": {
    "Book": {
      "type": "object",
      "title": "Book",
      "properties": {
        "title": {
          "type": "string"
        },
        "published": {
          "type": "boolean",
          "default": false
        }
      },
      "required": [
        "title"
      ]
    }
  }
}

Annotations

You can use typing.Annotated + SchemaAnnotation to attach metadata to the schema, such as field descriptions, examples, validation (min/max length, regex pattern, ...), etc. Consult the code for full details.

import dataclasses
import datetime
import json
import typing as t

from dc_schema import get_schema, SchemaAnnotation

@dataclasses.dataclass
class Author:
    name: t.Annotated[str, SchemaAnnotation(title="Full name", description="The authors full name")]
    age: t.Annotated[int, SchemaAnnotation(minimum=0)]
    dob: t.Annotated[t.Optional[datetime.date], SchemaAnnotation(examples=["1990-01-17"])] = None

print(json.dumps(get_schema(Author), indent=2))
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "title": "Author",
  "properties": {
    "name": {
      "type": "string",
      "title": "Full name",
      "description": "The authors full name"
    },
    "age": {
      "type": "integer",
      "minimum": 0
    },
    "dob": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "examples": [
        "1990-01-17"
      ]
    }
  },
  "required": [
    "name",
    "age"
  ]
}

To customize the metadata of a dataclass itself, use a SchemaConfig.

import dataclasses
import json

from dc_schema import get_schema, SchemaAnnotation

@dataclasses.dataclass
class User:
    name: str

    class SchemaConfig:
        annotation = SchemaAnnotation(title="System user", description="A user of the system")

print(json.dumps(get_schema(User), indent=2))
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "title": "System user",
  "description": "A user of the system",
  "properties": {
    "name": {
      "type": "string"
    }
  },
  "required": [
    "name"
  ]
}

Further examples

See the tests for full example usage.

CLI

dc_schema <file_path> <dataclass>

e.g.

dc_schema ./schema.py Author

Other tools

For working with dataclasses or JSON schema:

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dc_schema-0.0.8.tar.gz (6.4 kB view details)

Uploaded Source

Built Distribution

dc_schema-0.0.8-py3-none-any.whl (6.1 kB view details)

Uploaded Python 3

File details

Details for the file dc_schema-0.0.8.tar.gz.

File metadata

  • Download URL: dc_schema-0.0.8.tar.gz
  • Upload date:
  • Size: 6.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.12 CPython/3.10.0 Linux/5.13.0-39-generic

File hashes

Hashes for dc_schema-0.0.8.tar.gz
Algorithm Hash digest
SHA256 89fed792c63b80a91d4fef723f9aefbca83952eb611fbc168ef8381bf62acbb5
MD5 35c94fa1c779b0ce61f293df3f9b7341
BLAKE2b-256 b521bdff5fc8ae03453b23e753a79ebfcfa7e44b9ff40e5a7d364e2456a997ad

See more details on using hashes here.

File details

Details for the file dc_schema-0.0.8-py3-none-any.whl.

File metadata

  • Download URL: dc_schema-0.0.8-py3-none-any.whl
  • Upload date:
  • Size: 6.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.12 CPython/3.10.0 Linux/5.13.0-39-generic

File hashes

Hashes for dc_schema-0.0.8-py3-none-any.whl
Algorithm Hash digest
SHA256 c5990a2ce8fa22ccf18789b11db2440eeddcd36727cd7d3b6c802366d92ef17a
MD5 67cd3dc64d280006118011d92b9ff1b9
BLAKE2b-256 484c69eb48bd94bbb9da06f5c019e951d3f07c14e1f3cec7fbf950f1d2536728

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page