Skip to main content

Computes deep differences between objects

Project description

pydeepdiff
========

# Description

This package allows to compute deep differences between two python dictionnaries

Differences are stored in the following format :

lhs stands for Left Hand Side
rhs stands for Right Hand Side

- Creation : {'path':path_to_object,'kind':'N','rhs':value}
- Deletion : {'path':path_to_object,'kind':'D','lhs':value}
- Edition : {'path':path_to_object,'kind':'E','lhs':value,'rhs':value}
- Lists
- Creation : {'path':path_to_object,'kind':'N','rhs_idx':index,'rhs':value}
- Deletion : {'path':path_to_object,'kind':'D','lhs_idx':index,'lhs':value}
- Move : {'path':path_to_object,'kind':'M','lhs_idx':index,'rhs_idx':index}

# Requirements
This lib requires python 3.2+

# Install

```
pip install pydeepdiff
```

# Example of use

```python

from pydeepdiff.diff import get_diff

dict_a = {'field_1': 'id1', 'field_2': 'vala1'}
dict_b = {'field_1': 'id3', 'field_2': 'valb1'}

differences = get_diff(dict_a, dict_b)

# Differences contains one difference :
[
{
'path': [
'field_1'
],
'kind': 'E',
'lhs': 'id1',
'rhs': 'id3'
},
{
'path': [
'field_2'
],
'kind': 'E',
'lhs': 'vala1',
'rhs': 'valb1'
}
]


dict_a = {'id': '1', 'bloc': {'act': '1'}}
dict_b = {'id': '1', 'bloc': {'act': '2'}}

differences = get_diff(dict_a, dict_b))

# Differences contains one difference :
[
{
'path': [
'bloc',
'act'
],
'kind': 'E',
'lhs': '1',
'rhs': '2'
}
]
```

# Ignored fields

It is possible to ignore some fields when comparing objects.
For this, pass a list of these fields to the comparison function.

Example : don't compare the field 'act' of the nested 'bloc' object :

```python

dict_a = {'id': '1', 'bloc': {'act': '1'}}
dict_b = {'id': '1', 'bloc': {'act': '2'}}

diff = get_diff(dict_a, dict_b, 'root', {}, ['root.bloc.act'])
```

In this example the result is an empty list of differences.

# Specific mapping

When comparing two list of dict, we have to "associate" each item of the left side list to an item of the right side list.
For this, we have to know "HOW" making this association : often a dict will have a field that represents its id, and we want to use it.
In pydeepdiff, this case is resolved with a mapping file.

In the following example, we explicitly use the 'field_1' to identify an object of the list.

```python

list_a = [{'field_1': 'id1', 'field_2': 'vala1'}, {'field_1': 'id2', 'field_2': 'vala2'}]
list_b = [{'field_1': 'id3', 'field_2': 'valb1'}, {'field_1': 'id1', 'field_2': 'valb2'}]

mapping = [{'path': '', 'id': 'field_1'}]

diff = _get_list_dict_diff(list_a, list_b, 'root', mapping, p_complex_details=True)
```

The mapping is represented by a list of object. Each object has a :
* a "path" field that contains the json path to the object
* an "id" field that contains the name of the field representing the id of the object (pointed by "path")

Note that a path to the root object is the empty string

The result is the following list of differences :

```
[
{'path_to_object': '', 'filter': '', 'rhs_idx': 1, 'lhs_idx': 0, 'kind': 'M'},
{'rhs': 'valb2', 'lhs': 'vala1', 'kind': 'E', 'path_to_object': '[0].field_2', 'filter': 'field_2'},
{'lhs_idx': 1, 'kind': 'D', 'lhs': {'field_2': 'vala2', 'field_1': 'id2'}, 'path_to_object': '', 'filter': ''},
{'rhs_idx': 0, 'kind': 'N', 'rhs': {'field_2': 'valb1', 'field_1': 'id3'}, 'path_to_object': '', 'filter': ''}
]
```

# Tests

To launch unit tests, just run this command from the project home directory (you will need py.test installed)

```
py.test test

```

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

pydeepdiff-1.0.2.tar.gz (11.5 kB view details)

Uploaded Source

File details

Details for the file pydeepdiff-1.0.2.tar.gz.

File metadata

  • Download URL: pydeepdiff-1.0.2.tar.gz
  • Upload date:
  • Size: 11.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for pydeepdiff-1.0.2.tar.gz
Algorithm Hash digest
SHA256 148f4c1376eb7b653016ed57c668ca201a1f6d5996100629c375000eb5e54bd0
MD5 57a5dc119a47b8d9fd0ea1ec4385c6b1
BLAKE2b-256 aa55fc5a90d06faeba3562c73ad0fdfa1730a3ee8e32409028ba4ea511aa44dd

See more details on using hashes here.

Supported by

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