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%
There were gaps in the functionality of existing solutions (Like pydantic) that made using them untenable for my use cases.
pip install schemey
- 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)
This demonstrates generating a validator for a dataclass.
This demonstrates generating a validated dataclass
This demonstrates adding custom validation rules to dataclass fields
This demonstrates adding fully custom marshalling and validations for a class
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.
This demonstrates starting with a json schema and generating python dataclasses from it.
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)
python setup.py install easy_install "schemey[dev]"
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