Skip to main content

A tool to check whether a JSON schema is subset/subschema of another JSON schema

Project description

jsonsubschema

Travis build status Codecov code coverage

jsonsubschema checks if one JSON schema is a subschema (subtype) of another.

For any two JSON schemas s1 and s2, s1 <: s2 (reads s1 is subschema/subtype of s2) if every JSON document instance that validates against s1 also validates against s2.

jsonsubschema is very useful in analysing schema evolution and ensuring that newer schema versions are backward compatible. jsonsubschema also enables static type checking on different components of a system that uses JSON schema to describe data interfaces among the system's different components.

The details of JSON subschema are covered in our ISSTA 2021 paper, which received a Distinguished Artifact Award:

@InProceedings{issta21JSONsubschema,
  author    = {Habib, Andrew and Shinnar, Avraham and Hirzel, Martin and Pradel, Michael},
  title     = {Finding Data Compatibility Bugs with JSON Subschema Checking},
  booktitle = {The ACM SIGSOFT International Symposium on Software Testing and Analysis (ISSTA)},
  year      = {2021},
  pages     = {620--632},
  url       = {https://doi.org/10.1145/3460319.3464796},
}

I) Obtaining the tool

Requirements

  • python 3.8.*
  • Other python dependencies will be installed during the below setup process

You can either install subschema from the source code from github or the pypy package.

A) Install from github source code

Execute the following:

git clone https://github.com/IBM/jsonsubschema.git 
cd jsonsubschema
python setup.py install
cd ..

B) Install from pypy

Execute the following:

pip install jsonsubschema

II) Running subschema

JSON subschema provides two usage interfaces:

A) CLI interface

  1. Create two JSON schema examples by executing the following:
echo '{"type": ["null", "string"]}' > s1.json
echo '{"type": ["string", "null"], "not": {"enum": [""]}}' > s2.json
  1. Invoke the CLI by executing:
python -m jsonsubschema.cli s2.json s1.json

B) python API

from jsonsubschema import isSubschema

def main():
	s1 = {'type': "integer"}
	s2 = {'type': ["integer", "string"]}

	print(f'LHS <: RHS {isSubschema(s1, s2)}')

if __name__ == "__main__":
	main()

License

jsonsubschema is distributed under the terms of the Apache 2.0 License, see LICENSE.txt.

Contributions

json-subschema is still at an early phase of development and we welcome contributions. Contributors are expected to submit a 'Developer's Certificate of Origin', which can be found in DCO1.1.txt.

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

jsonsubschema-0.0.7.tar.gz (38.8 kB view details)

Uploaded Source

Built Distribution

jsonsubschema-0.0.7-py3-none-any.whl (28.1 kB view details)

Uploaded Python 3

File details

Details for the file jsonsubschema-0.0.7.tar.gz.

File metadata

  • Download URL: jsonsubschema-0.0.7.tar.gz
  • Upload date:
  • Size: 38.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.18

File hashes

Hashes for jsonsubschema-0.0.7.tar.gz
Algorithm Hash digest
SHA256 852e0878842122a046fce5b3db1bfb801a26de20a2dfaebd8df20f366a762d2c
MD5 2db71072b47f9ff3f1b65918f99c8b23
BLAKE2b-256 1d877a0ca64e7972b2ffe70a5e2c12d846e2eab16b386f736f783983419b7585

See more details on using hashes here.

File details

Details for the file jsonsubschema-0.0.7-py3-none-any.whl.

File metadata

File hashes

Hashes for jsonsubschema-0.0.7-py3-none-any.whl
Algorithm Hash digest
SHA256 4133bd1f7a2529b28aa7150f71bbcd5d6acf3663f0b83dedd9e6df71c4585779
MD5 66f1a3b49ae2ee716db1606f3aa17f0f
BLAKE2b-256 df28e84a5da033a9a67050440856ead2cc5fa4e9ea1dcd27b05efd50cb255b3e

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