Tools for generating Python models from JSONSchema definitions.
Project description
Statham Schema
A tool for generating Python objects from JSONSchema documents.
This project aims to simplify the experience of integrating with external sources, by providing:
- External validation: Ensure that incoming data matches what you expect.
- Internal validation: Ensure your application logic is consistent with the schema. Static type checking (see mypy) can do this job for you.
- Visibility: Update the model layer against schema changes automatically, and let static tools identify any issues.
The models generated by this tool are declared using a JSONSchema DSL. This DSL can easily be used to write schemas by hand, and extend models with extra features.
Example DSL Definition
from typing import List
from statham.dsl.elements import Array, Integer, Object, String
from statham.dsl.property import Property
class Choice(Object):
choice_text: str = Property(String(maxLength=200), required=True)
votes: int = Property(Integer(default=0))
class Poll(Object):
question: str = Property(String(maxLength=200), required=True)
choices: List[Choice] = Property(Array(Choice), required=True)
Requirements
This package is currently tested for Python 3.6.
Installation
This project may be installed using pip:
pip install statham-schema
Generating python classes
Class definitions may be generated with the following command:
statham --input /path/to/schema.json
This will write generated python classes to stdout. Optionally specify an --output
path to write to file.
Command-line arguments
Required arguments:
--input INPUT Specify the path to the JSON Schema to be generated.
If the target schema is not at the root of a document, specify the
JSON Pointer in the same format as a JSONSchema `$ref`, e.g.
`--input path/to/document.json#/definitions/schema`
Optional arguments:
--output OUTPUT Output directory or file in which to write the output.
If the provided path is a directory, the command will derive the name
from the input argument. If not passed, the command will write to
stdout.
-h, --help Display this help message and exit.
Using custom format keywords
JSONSchema allows use of custom string formats as specified here. Custom validation logic for string format may be added like so:
from statham.validators import format_checker
@format_checker.register("my_format")
def _check_my_format(value: str) -> bool:
...
Supported JSONSchema features
- Basic types (primitves, array, object)
- Composite primitive types
- Type validation on generated classes
- Validation of
required
- Local references
- Type-specific validation (pattern, format, minimum, maximum etc)
- Custom string format validation
- Remote references
-
anyOf
,oneOf
,allOf
-
additionalProperties
- Tuple validation of arrays
- Built-in string format validation #6
- Generic keywords:
enum
#8,const
#9 - Array keywords:
uniqueItems
#10,contains
-
not
keyword #14 -
minProperties
,maxProperties
#15 - Property dependencies
- Schema dependencies
-
propertyNames
,patternProperties
-
additionalItems
keyword -
if
,then
,else
keywords
Development
- Clone the repository:
git clone git@github.com:jacksmith15/statham-schema.git && cd statham-schema
- Install the requirements:
pip install -r requirements.txt -r requirements-test.txt
- Run
pre-commit install
- Run the tests:
bash run_test.sh -c -a
This project uses the following QA tools:
- PyTest - for running unit tests.
- PyLint - for enforcing code style.
- MyPy - for static type checking.
- Travis CI - for continuous integration.
License
This project is distributed under the MIT license.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for statham_schema-0.4.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ea029f044f45ed4b36a9424edb64dd526418e72c36ce9e3227832c3067d0c174 |
|
MD5 | 1e330e836669e76ade8e068b8cbec538 |
|
BLAKE2b-256 | 51241ce395a3c6db00082832f71a99b3f8fc0dd2a3063df60dbf44a78fe8d4c1 |