Skip to main content

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,6 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.

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

struct-diff-0.9.0.post6.tar.gz (12.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

struct_diff-0.9.0.post6-py3-none-any.whl (13.7 kB view details)

Uploaded Python 3

File details

Details for the file struct-diff-0.9.0.post6.tar.gz.

File metadata

  • Download URL: struct-diff-0.9.0.post6.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

Hashes for struct-diff-0.9.0.post6.tar.gz
Algorithm Hash digest
SHA256 96b9c361f0c106d8fae6f1eb656c5c19e5cc89ef98c24fa45ce010fc33af092a
MD5 9f1bf3e7b327837efdc22b52872e3d18
BLAKE2b-256 02b3cc57c5c41f56b36c47b96c741a67b3b5c54fb8e0433dc3839f55a2acab3b

See more details on using hashes here.

File details

Details for the file struct_diff-0.9.0.post6-py3-none-any.whl.

File metadata

File hashes

Hashes for struct_diff-0.9.0.post6-py3-none-any.whl
Algorithm Hash digest
SHA256 08efac22d09d669135564e0b70bd58106f1a2d6bb9bb35f6be29a2f012898657
MD5 c0241d253c4923baf21b75e11e6f0751
BLAKE2b-256 548f177bf1c9d914e7c1a07c3214e3d4de174c5d117e4f735672ed3c08267c32

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page