stefankoegl / python-json-patch

Applying JSON Patches in Python
https://python-json-patch.readthedocs.org/
BSD 3-Clause "New" or "Revised" License
434 stars 94 forks source link

Bug - ValueError: invalid literal for int() with base 10: '6e3d1297_0c5a_88f9_576b_ad9216611c94' on make_patch() #120

Closed RyanSept closed 2 years ago

RyanSept commented 3 years ago

Version: 1.28 Python version: 2.7.17, 3.7.2

Description I run into an error ValueError: invalid literal for int() with base 10: '6e3d1297_0c5a_88f9_576b_ad9216611c94' when diffing these two objects. This happens on both Python 2 and 3.

td3 = {
 'id': '456',
 'metadata': [{'ext': {'821b7213_b9e6_2b73_2e9c_cf1526314553': ['Open Work'],
    '6e3d1297_0c5a_88f9_576b_ad9216611c94': ['Many Things'],
    '1987bcf0_dc97_59a1_4c62_ce33e51651c7': ['Product']},
   'schema_id': 'id777',
   'updated_at': '2020-10-07T02:19:06+00:00'},
  {'ext': {'2a7624e_0166_4d75_a92c_06b3f': []},
   'schema_id': 'id812',
   'updated_at': '2020-10-07T02:19:05+00:00'},
  {'ext': {'10': [],
    '11': ['bee',
     'ant',
     'wasp'],
    '13': ['phobos',
     'titan',
     'gaea'],
    '14': [],
    '15': 'run3',
    '16': 'service',
    '2': ['zero', 'enable']},
   'schema_id': 'id1289',
   'updated_at': '2020-10-07T02:19:06+00:00'}],
 'updated_at': '2021-01-04T01:23:27+00:00'}

td4 = {
 'id': '456',
 'metadata': [{'ext': {'1': [], '2': []},
   'schema_id': 'id91',
   'updated_at': '2021-01-04T01:24:02+00:00'},
  {'ext': {'821b7213_b9e6_2b73_2e9c_cf1526314553': ['Open Work'],
    '6e3d1297_0c5a_88f9_576b_ad9216611c94': ['Many Things'],
    '1987bcf0_dc97_59a1_4c62_ce33e51651c7': ['Product']},
   'schema_id': 'id777',
   'updated_at': '2020-10-07T02:19:06+00:00'},
  {'ext': {'2a7624e_0166_4d75_a92c_06b3f': []},
   'schema_id': 'id812',
   'updated_at': '2021-01-04T01:24:02+00:00'},
  {'ext': {'b238d74d_dcf4_448c_9794_c13a2f7b3c0a': [],
    'dcb0387c2_f7ae_b8e5bab_a2b1_94deb7c': []},
   'schema_id': 'id191',
   'updated_at': '2021-01-04T01:24:02+00:00'},
  {'ext': {'10': [],
    '11': ['bee',
     'ant',
     'fly'],
    '13': ['titan',
     'phobos',
     'gaea'],
    '14': [],
    '15': 'run3',
    '16': 'service',
    '2': ['zero', 'enable']},
   'schema_id': 'id1289',
   'updated_at': '2021-01-04T01:24:02+00:00'}],
 'updated_at': '2021-01-04T01:24:03+00:00',
 }

Steps to reproduce

import jsonpatch
jsonpatch.make_patch(td3, td4)

Stack trace

/lib/python2.7/site-packages/jsonpatch.pyc in make_patch(src, dst, pointer_cls)
    173     """
    174
--> 175     return JsonPatch.from_diff(src, dst, pointer_cls=pointer_cls)
    176
    177

/lib/python2.7/site-packages/jsonpatch.pyc in from_diff(cls, src, dst, optimization, dumps, pointer_cls)
    637         json_dumper = dumps or cls.json_dumper
    638         builder = DiffBuilder(json_dumper, pointer_cls=pointer_cls)
--> 639         builder._compare_values('', None, src, dst)
    640         ops = list(builder.execute())
    641         return cls(ops, pointer_cls=pointer_cls)

/lib/python2.7/site-packages/jsonpatch.pyc in _compare_values(self, path, key, src, dst)
    873         if isinstance(src, MutableMapping) and \
    874                 isinstance(dst, MutableMapping):
--> 875             self._compare_dicts(_path_join(path, key), src, dst)
    876
    877         elif isinstance(src, MutableSequence) and \

/lib/python2.7/site-packages/jsonpatch.pyc in _compare_dicts(self, path, src, dst)
    840
    841         for key in src_keys & dst_keys:
--> 842             self._compare_values(path, key, src[key], dst[key])
    843
    844     def _compare_lists(self, path, src, dst):

/lib/python2.7/site-packages/jsonpatch.pyc in _compare_values(self, path, key, src, dst)
    877         elif isinstance(src, MutableSequence) and \
    878                 isinstance(dst, MutableSequence):
--> 879             self._compare_lists(_path_join(path, key), src, dst)
    880
    881         # To ensure we catch changes to JSON, we can't rely on a simple

/lib/python2.7/site-packages/jsonpatch.pyc in _compare_lists(self, path, src, dst)
    854                 elif isinstance(old, MutableMapping) and \
    855                     isinstance(new, MutableMapping):
--> 856                     self._compare_dicts(_path_join(path, key), old, new)
    857
    858                 elif isinstance(old, MutableSequence) and \

/lib/python2.7/site-packages/jsonpatch.pyc in _compare_dicts(self, path, src, dst)
    840
    841         for key in src_keys & dst_keys:
--> 842             self._compare_values(path, key, src[key], dst[key])
    843
    844     def _compare_lists(self, path, src, dst):

/lib/python2.7/site-packages/jsonpatch.pyc in _compare_values(self, path, key, src, dst)
    873         if isinstance(src, MutableMapping) and \
    874                 isinstance(dst, MutableMapping):
--> 875             self._compare_dicts(_path_join(path, key), src, dst)
    876
    877         elif isinstance(src, MutableSequence) and \

/lib/python2.7/site-packages/jsonpatch.pyc in _compare_dicts(self, path, src, dst)
    834
    835         for key in removed_keys:
--> 836             self._item_removed(path, str(key), src[key])
    837
    838         for key in added_keys:

/lib/python2.7/site-packages/jsonpatch.pyc in _item_removed(self, path, key, item)
    803             if type(op.key) == int:
    804                 for v in self.iter_from(index):
--> 805                     op.key = v._on_undo_add(op.path, op.key)
    806
    807             self.remove(index)

/lib/python2.7/site-packages/jsonpatch.pyc in _on_undo_add(self, path, key)
    428     def _on_undo_add(self, path, key):
    429         if self.from_path == path:
--> 430             if self.from_key > key:
    431                 self.from_key -= 1
    432             else:

/lib/python2.7/site-packages/jsonpatch.pyc in from_key(self)
    403         from_ptr = self.pointer_cls(self.operation['from'])
    404         try:
--> 405             return int(from_ptr.parts[-1])
    406         except TypeError:
    407             return from_ptr.parts[-1]

ValueError: invalid literal for int() with base 10: '6e3d1297_0c5a_88f9_576b_ad9216611c94'