Skip to content

Generated patches aren't always the same #151

Open
annetutil/annet
#173
@djlambert

Description

@djlambert

On Python 3.6+ (where dict is ordered) I'd expected the following to always return the same results:

import jsonpatch

a = {
    'key1': 'value1',
    'key2': 'value2',
    'key3': 'value3',
    'key4': 'value4',
    'key5': {
        'subkey1': 'subvalue1',
        'subkey2': 'subvalue2',
        'subkey3': 'subvalue3',
        'subkey4': 'subvalue4',
    },
}

b = {
    'key1': '1234',
    'key2': 'asdf',
    'key3': 'value3',
    'key4': 'value4',
    'key5': {
        'subkey1': 'subvalue1',
        'subkey2': 'subvalue2',
        'subkey3': 'subvalue3',
        'subkey5': 'subvalue5',
    },
    'key6': {
        'subkey1': 'subvalue1',
    },
}

print(jsonpatch.JsonPatch.from_diff(a, b).patch)

This isn't the case though:

% python3 misc/json_patch.py
[{'op': 'add', 'path': '/key6', 'value': {'subkey1': 'subvalue1'}}, {'op': 'replace', 'path': '/key1', 'value': '1234'}, {'op': 'remove', 'path': '/key5/subkey4'}, {'op': 'add', 'path': '/key5/subkey5', 'value': 'subvalue5'}, {'op': 'replace', 'path': '/key2', 'value': 'asdf'}]
% python3 misc/json_patch.py
[{'op': 'add', 'path': '/key6', 'value': {'subkey1': 'subvalue1'}}, {'op': 'replace', 'path': '/key1', 'value': '1234'}, {'op': 'remove', 'path': '/key5/subkey4'}, {'op': 'add', 'path': '/key5/subkey5', 'value': 'subvalue5'}, {'op': 'replace', 'path': '/key2', 'value': 'asdf'}]
% python3 misc/json_patch.py
[{'op': 'add', 'path': '/key6', 'value': {'subkey1': 'subvalue1'}}, {'op': 'remove', 'path': '/key5/subkey4'}, {'op': 'add', 'path': '/key5/subkey5', 'value': 'subvalue5'}, {'op': 'replace', 'path': '/key2', 'value': 'asdf'}, {'op': 'replace', 'path': '/key1', 'value': '1234'}]
% python3 misc/json_patch.py
[{'op': 'add', 'path': '/key6', 'value': {'subkey1': 'subvalue1'}}, {'op': 'replace', 'path': '/key2', 'value': 'asdf'}, {'op': 'remove', 'path': '/key5/subkey4'}, {'op': 'add', 'path': '/key5/subkey5', 'value': 'subvalue5'}, {'op': 'replace', 'path': '/key1', 'value': '1234'}]
% python3 misc/json_patch.py
[{'op': 'add', 'path': '/key6', 'value': {'subkey1': 'subvalue1'}}, {'op': 'replace', 'path': '/key2', 'value': 'asdf'}, {'op': 'remove', 'path': '/key5/subkey4'}, {'op': 'add', 'path': '/key5/subkey5', 'value': 'subvalue5'}, {'op': 'replace', 'path': '/key1', 'value': '1234'}]
% python3 misc/json_patch.py
[{'op': 'add', 'path': '/key6', 'value': {'subkey1': 'subvalue1'}}, {'op': 'replace', 'path': '/key2', 'value': 'asdf'}, {'op': 'replace', 'path': '/key1', 'value': '1234'}, {'op': 'remove', 'path': '/key5/subkey4'}, {'op': 'add', 'path': '/key5/subkey5', 'value': 'subvalue5'}]
% python3 misc/json_patch.py
[{'op': 'add', 'path': '/key6', 'value': {'subkey1': 'subvalue1'}}, {'op': 'remove', 'path': '/key5/subkey4'}, {'op': 'add', 'path': '/key5/subkey5', 'value': 'subvalue5'}, {'op': 'replace', 'path': '/key2', 'value': 'asdf'}, {'op': 'replace', 'path': '/key1', 'value': '1234'}]
% python3 misc/json_patch.py
[{'op': 'add', 'path': '/key6', 'value': {'subkey1': 'subvalue1'}}, {'op': 'replace', 'path': '/key2', 'value': 'asdf'}, {'op': 'remove', 'path': '/key5/subkey4'}, {'op': 'add', 'path': '/key5/subkey5', 'value': 'subvalue5'}, {'op': 'replace', 'path': '/key1', 'value': '1234'}]
% python3 misc/json_patch.py
[{'op': 'add', 'path': '/key6', 'value': {'subkey1': 'subvalue1'}}, {'op': 'replace', 'path': '/key1', 'value': '1234'}, {'op': 'replace', 'path': '/key2', 'value': 'asdf'}, {'op': 'remove', 'path': '/key5/subkey4'}, {'op': 'add', 'path': '/key5/subkey5', 'value': 'subvalue5'}]
% python3 misc/json_patch.py
[{'op': 'add', 'path': '/key6', 'value': {'subkey1': 'subvalue1'}}, {'op': 'replace', 'path': '/key2', 'value': 'asdf'}, {'op': 'remove', 'path': '/key5/subkey4'}, {'op': 'add', 'path': '/key5/subkey5', 'value': 'subvalue5'}, {'op': 'replace', 'path': '/key1', 'value': '1234'}]

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions