예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
def evaluate_lazy_args(func, *args):
    args = [eval_lazy(arg) for arg in args]
    return func(*args)
예제 #4
0
def evaluate_lazy_args(func, *args):
    args = [eval_lazy(arg) for arg in args]
    return func(*args)