Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_path_limit_addition(self):
first = {}
second = {'author': {'last_name': 'Doe', 'first_name': 'John'}}
p = PathLimit([('author',)])
diffed = list(diff(first, second, path_limit=p))
res = [('add', '', [('author',
{'first_name': 'John', 'last_name': 'Doe'})])]
assert res == diffed
first = {}
second = {'author': {'last_name': 'Doe', 'first_name': 'John'}}
p = PathLimit([('author',)])
diffed = list(diff(first, second, path_limit=p, expand=True))
res = [('add', '', [('author',
{'first_name': 'John', 'last_name': 'Doe'})])]
assert res == diffed
first = {}
second = {'author': {'last_name': 'Doe', 'first_name': 'John'}}
p = PathLimit()
diffed = list(diff(first, second, path_limit=p, expand=True))
res = [('add', '', [('author', {})]),
('add', 'author', [('first_name', 'John')]),
('add', 'author', [('last_name', 'Doe')])]
assert len(diffed) == 3
def test_path_limit_change(self):
first = {'author': {'last_name': 'Do', 'first_name': 'John'}}
second = {'author': {'last_name': 'Doe', 'first_name': 'John'}}
p = PathLimit([('author',)])
diffed = list(diff(first, second, path_limit=p, expand=True))
res = [('change',
['author'],
({'first_name': 'John', 'last_name': 'Do'},
{'first_name': 'John', 'last_name': 'Doe'}))]
assert res == diffed
first = {'author': {'last_name': 'Do', 'first_name': 'John'}}
second = {'author': {'last_name': 'Doe', 'first_name': 'John'}}
p = PathLimit()
diffed = list(diff(first, second, path_limit=p, expand=True))
res = [('change', 'author.last_name', ('Do', 'Doe'))]
def test_pathlimit(self):
path_limit = PathLimit([('author', 'name')])
self.assertFalse(path_limit.path_is_limit(('author')))
self.assertTrue(path_limit.path_is_limit(('author', 'name')))
self.assertFalse(path_limit.path_is_limit(('author', 'name', 'foo')))
path_limit = PathLimit([('authors', '*')])
self.assertFalse(path_limit.path_is_limit(('authors')))
self.assertTrue(path_limit.path_is_limit(('authors', 'name')))
self.assertTrue(path_limit.path_is_limit(('authors', 1)))
self.assertTrue(path_limit.path_is_limit(('authors', 2)))
self.assertFalse(path_limit.path_is_limit(('authors', 'name', 'foo')))
def test_path_limit_deletion(self):
first = {'author': {'last_name': 'Doe', 'first_name': 'John'}}
second = {}
p = PathLimit([('author',)])
diffed = list(diff(first, second, path_limit=p, expand=True))
res = [('remove', '', [('author',
{'first_name': 'John', 'last_name': 'Doe'})])]
assert res == diffed
.. versionchanged:: 0.4
Arguments ``first`` and ``second`` can now contain a ``set``.
.. versionchanged:: 0.5
Added *path_limit* parameter.
Added *expand* paramter.
Added *tolerance* parameter.
.. versionchanged:: 0.7
Diff items are deep copies from its corresponding objects.
Argument *ignore* is always converted to a ``set``.
.. versionchanged:: 0.8
Added *dot_notation* parameter.
"""
if path_limit is not None and not isinstance(path_limit, PathLimit):
path_limit = PathLimit(path_limit)
if isinstance(ignore, Iterable):
def _process_ignore_value(value):
if isinstance(value, int):
return value,
elif isinstance(value, list):
return tuple(value)
elif not dot_notation and isinstance(value, string_types):
return value,
return value
ignore = type(ignore)(_process_ignore_value(value) for value in ignore)
def dotted(node, default_type=list):
"""Return dotted notation."""
Arguments ``first`` and ``second`` can now contain a ``set``.
.. versionchanged:: 0.5
Added *path_limit* parameter.
Added *expand* paramter.
Added *tolerance* parameter.
.. versionchanged:: 0.7
Diff items are deep copies from its corresponding objects.
Argument *ignore* is always converted to a ``set``.
.. versionchanged:: 0.8
Added *dot_notation* parameter.
"""
if path_limit is not None and not isinstance(path_limit, PathLimit):
path_limit = PathLimit(path_limit)
if isinstance(ignore, Iterable):
def _process_ignore_value(value):
if isinstance(value, int):
return value,
elif isinstance(value, list):
return tuple(value)
elif not dot_notation and isinstance(value, string_types):
return value,
return value
ignore = type(ignore)(_process_ignore_value(value) for value in ignore)
def dotted(node, default_type=list):
"""Return dotted notation."""
if dot_notation and \
lca, first, second, actions,
path_limits=[], additional_info=None):
"""Initialize the Merger object.
:param lca: latest common ancestor of the two diverging data structures
:param first: first data structure
:param second: second data structure
:param path_limits: list of paths, utilized to instantiate a
dictdiffer.utils.PathLimit object
:param additional_info: Any object containing additional information
used by the resolution functions
"""
self.lca = lca
self.first = first
self.second = second
self.path_limit = PathLimit(path_limits)
self.actions = actions
self.additional_info = additional_info
self.conflict_finder = ConflictFinder()
self.resolver = Resolver(self.actions,
self.additional_info)
self.unifier = Unifier()
self.conflicts = []
self.unresolved_conflicts = []