def _json_diff(obj1, obj2, path, track_list_indices=True): obj1 = eval_lazy(obj1) obj2 = eval_lazy(obj2) if isinstance(obj1, str): obj1 = six.text_type(obj1) if isinstance(obj2, str): obj2 = six.text_type(obj2) if obj1 == obj2: return elif MISSING in (obj1, obj2): yield FormJsonDiff('missing', path, obj1, obj2) elif isinstance(obj1, dict): if not isinstance(obj2, dict): # special case to deal with OrderedDicts yield FormJsonDiff('type', path, obj1, obj2) else: def value_or_missing(obj, key): return obj.get(key, MISSING) for key in chain(obj1, (key for key in obj2 if key not in obj1)): for result in _json_diff( value_or_missing(obj1, key), value_or_missing(obj2, key), path=path + (key, ), track_list_indices=track_list_indices): yield result elif type(obj1) != type(obj2): yield FormJsonDiff('type', path, obj1, obj2) elif isinstance(obj1, list): def value_or_missing(obj, i): try: return obj[i] except IndexError: return MISSING for i in range(max(len(obj1), len(obj2))): list_index = i if track_list_indices else '[*]' for result in _json_diff(value_or_missing(obj1, i), value_or_missing(obj2, i), path=path + (list_index, ), track_list_indices=track_list_indices): yield result else: yield FormJsonDiff('diff', path, obj1, obj2)
def _json_diff(obj1, obj2, path, track_list_indices=True): obj1 = eval_lazy(obj1) obj2 = eval_lazy(obj2) if isinstance(obj1, str): obj1 = six.text_type(obj1) if isinstance(obj2, str): obj2 = six.text_type(obj2) if obj1 == obj2: return elif MISSING in (obj1, obj2): yield FormJsonDiff('missing', path, obj1, obj2) elif isinstance(obj1, dict): if not isinstance(obj2, dict): # special case to deal with OrderedDicts yield FormJsonDiff('type', path, obj1, obj2) else: def value_or_missing(obj, key): return obj.get(key, MISSING) for key in chain(obj1, (key for key in obj2 if key not in obj1)): for result in _json_diff(value_or_missing(obj1, key), value_or_missing(obj2, key), path=path + (key,), track_list_indices=track_list_indices): yield result elif type(obj1) != type(obj2): yield FormJsonDiff('type', path, obj1, obj2) elif isinstance(obj1, list): def value_or_missing(obj, i): try: return obj[i] except IndexError: return MISSING for i in range(max(len(obj1), len(obj2))): list_index = i if track_list_indices else '[*]' for result in _json_diff(value_or_missing(obj1, i), value_or_missing(obj2, i), path=path + (list_index,), track_list_indices=track_list_indices): yield result else: yield FormJsonDiff('diff', path, obj1, obj2)
def evaluate_lazy_args(func, *args): args = [eval_lazy(arg) for arg in args] return func(*args)