|
1 | 1 | # Nested-Diff.py HowTo
|
2 | 2 |
|
| 3 | +## How to get shortest possible patch |
| 4 | + |
| 5 | +```py |
| 6 | +>>> from nested_diff import diff |
| 7 | +>>> |
| 8 | +>>> a = {'one': 1, 'two': 2, 'three': 'threeeeeeeee'} |
| 9 | +>>> b = {'one': 1, 'two': 42} |
| 10 | +>>> |
| 11 | +>>> diff(a, b, O=False, U=False, trimR=True) |
| 12 | +{'D': {'three': {'R': None}, 'two': {'N': 42}}} |
| 13 | +>>> |
| 14 | +``` |
| 15 | + |
| 16 | +## How to get unchanged items only |
| 17 | + |
| 18 | +Diff calculates following changes by default: |
| 19 | + |
| 20 | +* A: added items. |
| 21 | +* N: new values for changed items. |
| 22 | +* O: old values for changed items. |
| 23 | +* R: removed items. |
| 24 | +* U: unchanged items. |
| 25 | + |
| 26 | +Thus disabling all except `U` diff will contain unchanged items only: |
| 27 | + |
| 28 | +```py |
| 29 | +>>> from nested_diff import Differ |
| 30 | +>>> |
| 31 | +>>> a = ['one', 'two', 'three'] |
| 32 | +>>> b = ['ONE', 'two'] |
| 33 | +>>> |
| 34 | +>>> differ = Differ(A=False, N=False, O=False, R=False, U=True) |
| 35 | +>>> |
| 36 | +>>> is_equal, diff = differ.diff(a, b) |
| 37 | +>>> is_equal |
| 38 | +False |
| 39 | +>>> diff |
| 40 | +{'D': [{'U': 'two', 'I': 1}]} |
| 41 | +>>> |
| 42 | +``` |
| 43 | + |
| 44 | +## How to enable unified diffs for text values |
| 45 | + |
| 46 | +```py |
| 47 | +>>> from nested_diff import diff, handlers |
| 48 | +>>> from nested_diff.formatters import TextFormatter |
| 49 | +>>> |
| 50 | +>>> a = 'one\ntwo\nthree' |
| 51 | +>>> b = 'one\nthree' |
| 52 | +>>> |
| 53 | +>>> d = diff(a, b, U=False, extra_handlers=[handlers.TextHandler(context=3)]) |
| 54 | +>>> d |
| 55 | +{'D': [{'I': [0, 3, 0, 2]}, {'U': 'one'}, {'R': 'two'}, {'U': 'three'}], 'E': 5} |
| 56 | +>>> |
| 57 | +>>> print(TextFormatter().format(d)) |
| 58 | +# <str> |
| 59 | + @@ -1,3 +1,2 @@ |
| 60 | + one |
| 61 | +- two |
| 62 | + three |
| 63 | +<BLANKLINE> |
| 64 | +>>> |
| 65 | +``` |
| 66 | + |
| 67 | +## How to render diff to HTML |
| 68 | + |
| 69 | +```py |
| 70 | +>>> from nested_diff import diff |
| 71 | +>>> from nested_diff.formatters import HtmlFormatter |
| 72 | +>>> |
| 73 | +>>> a = ['a', 'b', 'c'] |
| 74 | +>>> b = ['A', 'b'] |
| 75 | +>>> |
| 76 | +>>> formatter = HtmlFormatter() |
| 77 | +>>> diff_ = diff(a, b) |
| 78 | +>>> |
| 79 | +>>> html_header = formatter.get_page_header(lang='en', title='Nested diff') |
| 80 | +>>> html_body = formatter.format(diff_) |
| 81 | +>>> html_footer = formatter.get_page_footer() |
| 82 | +>>> |
| 83 | +``` |
| 84 | + |
3 | 85 | ## How to diff objects with types unsupported by nested\_diff
|
4 | 86 |
|
5 |
| -Custom type handlers may be set to support any desired types, have a look at |
6 |
| -`Differ.set_handler` method and [handlers.py](nested_diff/handlers.py). |
| 87 | +External handlers may be set to support any desired types. |
| 88 | +Have a look at `Differ.set_handler` method for details and builtin set of |
| 89 | +[nested\_diff.handlers](https://github.com/mr-mixas/Nested-Diff.py/tree/master/nested_diff/handlers.py) |
| 90 | +for examples. |
7 | 91 |
|
8 | 92 | ## How to ignore some differences during diff
|
9 | 93 |
|
@@ -38,6 +122,19 @@ assert differ.diff(a, b) == (False, {'D': [{'I': 2, 'N': 0.2, 'O': 0.1}]})
|
38 | 122 | >>>
|
39 | 123 | ```
|
40 | 124 |
|
| 125 | +## How to treat NaNs as equals |
| 126 | + |
| 127 | +```py |
| 128 | +>>> from nested_diff import Differ, handlers |
| 129 | +>>> |
| 130 | +>>> differ = Differ() |
| 131 | +>>> differ.set_handler(handlers.FloatHandler(nans_equal=True)) |
| 132 | +>>> |
| 133 | +>>> differ.diff(float('nan'), float('nan')) |
| 134 | +(True, {'U': nan}) |
| 135 | +>>> |
| 136 | +``` |
| 137 | + |
41 | 138 | ## How to use nested\_diff tool with git
|
42 | 139 |
|
43 | 140 | Ensure `nested_diff` command available, otherwise install it with `pip`:
|
|
0 commit comments