Structural comparison of two objects.
Project description
struct_diff
Copares two objects and produces a dictionary describing changes. Ideal for comparing two JSON or YAML objects and generating a structural human-readable diff.
This is a Python port of json-diff JavaScript library.
Purpose
It produces diff like this:
{
"type__deleted": "donut",
"name": {
"__old": "Cake",
"__new": "Donut"
},
"arr": [
[
" "
],
[
"-",
2
],
[
"+",
{
"obj": "ok",
"secondkey": 123
}
],
[
" "
],
[
"+",
4
]
],
... shortened ...
}
and from that it can generate a human-readable structural JSON diff:
{
- type: "donut"
- name: "Cake"
+ name: "Donut"
arr: [
...
- 2
+ {
+ obj: "ok"
+ secondkey: 123
+ }
...
+ 4
]
image: {
caption: {
- width: 123
+ width: 321
- height: 321
+ height: {
+ value: 642
+ units: "mm"
+ }
}
}
thumbnail: {
+ extra: {
+ price: 111
+ sizes: [
+ "L"
+ "XL"
+ ]
+ }
- width: 32
+ width: 64
}
}
or structural YAML diff:
- type: "donut"
- name: "Cake"
+ name: "Donut"
arr:
...
- - 2
+ - obj: "ok"
+ secondkey: 123
...
+ - 4
image:
caption:
- width: 123
+ width: 321
- height: 321
+ height:
+ value: 642
+ units: "mm"
thumbnail:
+ extra:
+ price: 111
+ sizes:
+ - "L"
+ - "XL"
- width: 32
+ width: 64
CLI Usage
Simple:
python3 -m struct_diff a.json b.json
Detailed:
% python3 -m struct_diff -h
usage: struct_diff [-h] [-C] [--no-color] [-j] [-Y] [-f] [--max-elisions MAX_ELISIONS] [-o KEY [KEY ...]] [-n] [-s] [-c] [-k] [-K] [-p DECIMALS] [-w INDENT_WIDTH] old new
positional arguments:
old original file
new new file
optional arguments:
-h, --help show this help message and exit
-C force colorize the output
--no-color do not colorize the output
-j, --raw-json display raw JSON encoding of the diff
-Y, --yaml output diff as YAML
-f, --full include the equal sections of the document, not just the deltas
--max-elisions MAX_ELISIONS
max number of ...'s to show in a row in "deltas" mode (before collapsing them) #var(maxElisions)
-o KEY [KEY ...], --output-keys KEY [KEY ...]
always print this comma separated keys, with their value, if they are part of an object with any diff
-n, --output-new-only
output only the updated and new key/value pairs (without marking them as such). If you need only the diffs from the old file, just exchange the first and second json
-s, --sort sort primitive values in arrays before comparing
-c, --object-context if a scalar value of an object key is changed, also include other (unchanged) values of that object
-k, --keys-only compare only the keys, ignore the differences in values
-K, --keep-unchanged-values
instead of omitting values that are equal, output them as they are
-p DECIMALS, --precision DECIMALS
round all floating point numbers to this number of decimal places prior to comparison
-w INDENT_WIDTH, --indent-width INDENT_WIDTH
number of spaces for indendation
Library Usage
>>> from struct_diff import Comparator, YAMLFormatter
>>> d = diff({'a':'first'}, {'b': 'second'})
>>> f = YAMLFormatter(d, {'max_elisions': 1})
>>> print(f)
- a: first
+ b: second
Things to do
- add unit tests
Contributing
It is currently good enough for me so I don't intend to spend much more time on it.
You are welcome to implement stuff from Things to do or more and submit pull requests.
Change Log
- 0.9.0-4,5 PyPI release
- 0.9.0-3 Added object-context option to include unchanged values in an object with a changed scalar value
- 0.9.0-2 Multi-line unified diff for strings in YAML mode
- 0.9.0-1 Implements mixed sorting (numerical sort first, alphanumerical string sort next)
- 0.9.0 The first complete port of json-diff JS library with all the functionality
Credits
- json-diff - the original javascript implementation
Released 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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file struct-diff-0.9.0.post5.tar.gz.
File metadata
- Download URL: struct-diff-0.9.0.post5.tar.gz
- Upload date:
- Size: 12.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.0 CPython/3.9.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
17acaa59e9d83ee10485f3ed698b58810bcf34808d380b34bbad82af803fc826
|
|
| MD5 |
c9fcf0ad0bd20304b5f933bea63528bc
|
|
| BLAKE2b-256 |
7d5a31df656d30774a38a94cceeda748c20cbef25a813438a1cb6c2970a61f6e
|
File details
Details for the file struct_diff-0.9.0.post5-py3-none-any.whl.
File metadata
- Download URL: struct_diff-0.9.0.post5-py3-none-any.whl
- Upload date:
- Size: 13.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.0 CPython/3.9.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
df79e7c36034ceba0655a602fa73a1f54b16ef7b01f3807da0eb45a2b9e4b5dc
|
|
| MD5 |
8e1e805c91fc1be9c579c51321b35a27
|
|
| BLAKE2b-256 |
2f5ac5c5b4a910f99e18f71fd944c252b8eb2d38afa2634a54137097761d26af
|