#json-schema #diff #breaking

bin+lib json-schema-diff

Diff changes between JSON schema files

8 releases

0.1.7 Jun 6, 2023
0.1.6 May 16, 2023
0.1.4 Apr 7, 2023
0.1.2 Mar 29, 2023

#412 in Database interfaces

Download history 328/week @ 2024-06-09 410/week @ 2024-06-16 396/week @ 2024-06-23 108/week @ 2024-06-30 256/week @ 2024-07-07 382/week @ 2024-07-14 596/week @ 2024-07-21 339/week @ 2024-07-28 315/week @ 2024-08-04 509/week @ 2024-08-11 336/week @ 2024-08-18 366/week @ 2024-08-25 383/week @ 2024-09-01 558/week @ 2024-09-08 402/week @ 2024-09-15 480/week @ 2024-09-22

1,829 downloads per month
Used in 2 crates

Apache-2.0

40KB
881 lines

json-schema-diff

A work-in-progress tool to diff changes between JSON schemas. A lot of JSON schema features are not implemented and therefore ignored, see the issue tracker.

Use this tool as a best-effort to find obviously breaking changes in CI, but not for much more.

This crate is used with draft-07 but even that is work in progress.

Usage via CLI

Install Rust and:

cargo install json-schema-diff

cat schema-old.json schema-new.json
# {"type": "string"}
# {"type": "boolean"}

cargo run --features=build-binary -- \
    schema-old.json \
    schema-new.json
# {"path":"","change":{"TypeRemove":{"removed":"string"}},"is_breaking":true}
# {"path":"","change":{"TypeAdd":{"added":"boolean"}},"is_breaking":false}

Sentry uses this tool in sentry-kafka-schemas to annotate pull requests with breaking changes made to schema definitions. It invokes the CLI tool on the schema from master vs the schema in the PR, and post-processes the output using a Python script for human consumption.

is_breaking is just a suggestion. You may choose to ignore it entirely and instead define which kinds of changes are breaking to you in wrapper scripts.

Usage as library

use json_schema_diff::*;

let lhs = serde_json::json! {{ 
    "type": "string",
}};
let rhs = serde_json::json! {{ 
    "type": "boolean",
}};

assert_eq!(
    json_schema_diff::diff(lhs, rhs).unwrap(),
    vec![
        Change {
            path: "".to_owned(),
            change: ChangeKind::TypeRemove { removed: JsonSchemaType::String }
        },
        Change {
            path: "".to_owned(),
            change: ChangeKind::TypeAdd { added: JsonSchemaType::Boolean }
        }
    ]
);

License

Licensed under Apache 2.0

Dependencies

~2–3.5MB
~63K SLoC