Python dict-like object which abstracts resolution of JSONSchema references
Project description
JSONSchema Ref Dict
Python dict-like object which abstracts resolution of JSONSchema references.
from json_ref_dict import RefDict schema = RefDict("https://json-schema.org/draft-07/schema#/")
Nested items containing "$ref"
will be resolved lazily when accessed,
meaning the dictionary can be treating as a single, continuous (and
possibly infinite) document.
Remote references are supported, and will be resolved relative to the current document.
If no scheme is provided, it is assumed that the document is present on the local filesystem (see Example below).
If PyYAML is installed, then loading of YAML documents will be supported, otherwise only JSON documents may be loaded.
Example
Given the following related schemas:
master.yaml
definitions: foo: type: string local_ref: $ref: '#/definitions/foo' remote_ref: $ref: 'other.yaml#/definitions/bar' backref: $ref: 'other.yaml#/definitions/baz'
other.yaml
definitions: bar: type: integer baz: $ref: 'master.yaml#/definitions/foo'
We can parse these as a single object as follows:
from json_ref_dict import RefDict schema = RefDict("master.yaml#/definitions") print(schema) >>> {'foo': {'type': 'string'}, 'local_ref': {'$ref': '#/definitions/foo'}, 'remote_ref': {'$ref': 'other.yaml#/definitions/bar'}, 'backref': {'$ref': 'other.yaml#/definitions/baz'}} print(schema["local_ref"]) >>> {'type': 'string'} print(schema["remote_ref"]) >>> {'type': 'integer'} print(schema["backref"]) >>> {'type': 'string'}
Materializing documents
If you don't want the lazy behaviour, and want to get all of the IO out of the way up front, then you can "materialize" the dictionary:
from json_ref_dict import materialize, RefDict schema = materialize(RefDict("https://json-schema.org/draft-04/schema#/")) assert isinstance(schema, dict)
A materialized RefDict
is just a regular dict, containing a document with all references resolved. This is useful if, for example, you want to cache/persist the entire schema. Be aware that if there are cyclical references in the schema, these will be present on the materialized dictionary.
The materialize
helper also supports some basic transformation options, as performing global transformations on infinite documents is non-trivial:
include_keys
- an iterable of keys to include in the materialized document.exclude_keys
- an iterable of keys to exclude from the materialized document.value_map
- an operation to apply to the values of the document (not lists or dictionaries).
Requirements
This package is currently tested for Python 3.6.
Installation
This project may be installed using pip:
pip install json-ref-dict
Development
- Clone the repository:
git clone git@github.com:jacksmith15/json-ref-dict.git && cd json-ref-dict
- 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.
- Black - for uniform code formatting.
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.
Filename, size | File type | Python version | Upload date | Hashes |
---|---|---|---|---|
Filename, size json_ref_dict-0.6.1-py3-none-any.whl (11.7 kB) | File type Wheel | Python version py3 | Upload date | Hashes View |
Filename, size json-ref-dict-0.6.1.tar.gz (10.9 kB) | File type Source | Python version None | Upload date | Hashes View |
Hashes for json_ref_dict-0.6.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c641c68cfdaccd192e88a6797ef4d13228c8383983a5aca0b2e39a958792caa4 |
|
MD5 | 0eb15066ffd4651cc0f704b8300c7242 |
|
BLAKE2-256 | 77b9b61ed4c7876d957939b10f7491a8ea88de253c7e12c60a6045713a7ef077 |