Skip to main content

Convention over configuration Object Schemas for python

Project description

Schemey - Json Schemas for Python.

This project allows for generation of json schemas based on python classes, or python classes based on json schemas. It also allows for generation of validated dataclasses, where setters cannot violate the invariants established in a schema.

It uses the fantastic JSON Schema library for python. (Though older versions did not.)

The general idea is that the framework should not insist on any particular data structure or paradigm - it is designed to be extensible, and out of the box support is provided for iterable types, dataclasses, enums, timestamps and primitives.

Serialization is provided using marshy.

Current test coverage is at 100%

Why did you build this?

There were gaps in the functionality of existing solutions (Like pydantic) that made using them untenable for my use cases.

Installation

pip install schemey

Concepts

  • A Schema contains a link between a JSON Schema and a Python Type
  • A Validator is used to validate python objects using a schema
  • A SchemaContext is used to generate python objects for json schemas / vice versa
  • A SchemaFactory is used to plug new translation rules into a SchemaContext (more below)

Examples

Hello World

This demonstrates generating a validator for a dataclass.

Validated Dataclass

This demonstrates generating a validated dataclass

Validated Fields

This demonstrates adding custom validation rules to dataclass fields

Custom Class Validations

This demonstrates adding fully custom marshalling and validations for a class

Custom JSON Schema Validations

This demonstrates creating custom json schema validations for things not natively supported by json schema. For example, checking a date against the current time, or that a property of an object is less than another property of that object.

Beginning with a JSON Schema

This demonstrates starting with a json schema and generating python dataclasses from it.

Configuring the Context itself

Schemey uses Injecty for configuration. The default configuration is here

For example, for a project named no_more_uuids, I may add a file injecty_config_no_more_uuids/__init__.py:

from schemey.factory.schema_factory_abc import SchemaFactoryABC
from schemey.factory.uuid_factory import UuidFactory

priority = 120  # Applied after default


def configure(context):
    context.deregister_impl(SchemaFactoryABC, UuidFactory)

Installing local development dependencies

python setup.py install easy_install "schemey[dev]"

Release Procedure

status

The typical process here is:

  • Create a PR with changes. Merge these to main (The Quality workflows make sure that your PR meets the styling, linting, and code coverage standards).
  • New releases created in github are automatically uploaded to pypi

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

schemey-8.0.0.tar.gz (55.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

schemey-8.0.0-py3-none-any.whl (20.3 kB view details)

Uploaded Python 3

File details

Details for the file schemey-8.0.0.tar.gz.

File metadata

  • Download URL: schemey-8.0.0.tar.gz
  • Upload date:
  • Size: 55.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.16 {"installer":{"name":"uv","version":"0.9.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for schemey-8.0.0.tar.gz
Algorithm Hash digest
SHA256 32468faec189d3234c627b0190492b758b8dde95d7a4c73f98811a7b9665d9dc
MD5 f6516909ff97c1d8316d70baf28e1e58
BLAKE2b-256 0d8143db0e9914cc72b74b0b736c7aaada9f78f23ed2bfcd470ee150ee8b0c55

See more details on using hashes here.

File details

Details for the file schemey-8.0.0-py3-none-any.whl.

File metadata

  • Download URL: schemey-8.0.0-py3-none-any.whl
  • Upload date:
  • Size: 20.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.16 {"installer":{"name":"uv","version":"0.9.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for schemey-8.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 53ab91d7ddd4b1c42c438e023acbe5d74c7891a9c9c7e665dd5ac2fb4343fa4f
MD5 ad5671466eace6dd9ad2778c4fb7678a
BLAKE2b-256 98e55da41cb84bb722eeef33cb60c3842687916777cc32c1a3c4550ec1c80c56

See more details on using hashes here.

Supported by

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