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

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.post7.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.post7-py3-none-any.whl (13.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: struct-diff-0.9.0.post7.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.post7.tar.gz
Algorithm Hash digest
SHA256 52b56dc7a4e806dc44ffe7359df191cad4ed6f3be637c932d1cfe9df76690109
MD5 9de8c258e289cbe58c08276fd253224a
BLAKE2b-256 55a5b86f9a38023145b6edb1970dd003d8085092b7c7a6753bde69317659af93

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for struct_diff-0.9.0.post7-py3-none-any.whl
Algorithm Hash digest
SHA256 ae328db2608c9622eefc982e968d4112a30eb8b280e5140e17f27e87aeb8512e
MD5 e200795327f7c6e1463095a667735b3b
BLAKE2b-256 cbd7d9d285e8ab3016067505933e3e9d35c35df25531bfb69679b1f76e0fc3d3

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