Skip to main content

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,6,7 PyPI releases with bugfixes
  • 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.

Metadata

Release files for struct-diff 0.9.0.post7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for struct-diff 0.9.0.post7
File Size Uploaded
struct-diff-0.9.0.post7.tar.gz 12.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for struct-diff 0.9.0.post7
File Interpreter ABI Platform
struct_diff-0.9.0.post7-py3-none-any.whl Python 3 none any Details

Total release size: 26.3 kB

Release files / struct-diff-0.9.0.post7.tar.gz

Download URL struct-diff-0.9.0.post7.tar.gz
Size 12.6 kB
Tags Source
SHA-256 checksum
How to use checksums
52b56dc7a4e806dc44ffe7359df191cad4ed6f3be637c932d1cfe9df76690109
BLAKE2b-256 checksum
How to use checksums
55a5b86f9a38023145b6edb1970dd003d8085092b7c7a6753bde69317659af93
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.0 CPython/3.9.13

Release files / struct_diff-0.9.0.post7-py3-none-any.whl

Download URL struct_diff-0.9.0.post7-py3-none-any.whl
Size 13.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ae328db2608c9622eefc982e968d4112a30eb8b280e5140e17f27e87aeb8512e
BLAKE2b-256 checksum
How to use checksums
cbd7d9d285e8ab3016067505933e3e9d35c35df25531bfb69679b1f76e0fc3d3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.0 CPython/3.9.13

Release history Release notifications | RSS feed

This release

0.9.0.post7 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page