def descend(fragment, path, visited_refs): if is_ref(fragment): ref_dict = fragment ref = fragment['$ref'] attach_scope(ref_dict, resolver) # Don't recurse down already visited refs. A ref is not unique # by its name alone. Its scope (attached above) is part of the # equivalence comparison. if ref_dict in visited_refs: log.debug('Already visited %s' % ref) return visited_refs.append(ref_dict) with resolver.resolving(ref) as target: descend(target, path, visited_refs) return # fragment is guaranteed not to be a ref from this point onwards if is_dict_like(fragment): for key, value in iteritems(fragment): fire_callbacks(fragment, key, path + [key]) descend(fragment[key], path + [key], visited_refs) elif is_list_like(fragment): for index in range(len(fragment)): fire_callbacks(fragment, index, path + [str(index)]) descend(fragment[index], path + [str(index)], visited_refs)
def descend(fragment, path, visited_refs): if is_ref(fragment): ref_dict = fragment ref = fragment['$ref'] attach_scope(ref_dict, resolver) # Don't recurse down already visited refs. A ref is not unique # by its name alone. Its scope (attached above) is part of the # equivalence comparison. if ref_dict in visited_refs: log.debug('Already visited %s' % ref) return visited_refs.append(ref_dict) with resolver.resolving(ref) as target: descend(target, path, visited_refs) return # fragment is guaranteed not to be a ref from this point onwards if is_dict_like(fragment): if 'type' not in fragment: if 'properties' in fragment: fragment['type'] = 'object' elif 'items' in fragment: fragment['type'] = 'array' for key, value in iteritems(fragment): fire_callbacks(fragment, key, path + [key]) descend(fragment[key], path + [key], visited_refs) elif is_list_like(fragment): for index in range(len(fragment)): fire_callbacks(fragment, index, path + [str(index)]) descend(fragment[index], path + [str(index)], visited_refs)
def wrapper(fragment, *args, **kwargs): is_reference = is_ref(fragment) if is_reference: ref = fragment['$ref'] attach_scope(fragment, resolver) with resolver.resolving(ref) as target: if id(target) in cache: log.debug('Already visited %s', ref) return func(target, *args, **kwargs) return # fragment is guaranteed not to be a ref from this point onwards fragment_id = id(fragment) if fragment_id in cache: log.debug('Already visited id %d', fragment_id) return cache.add(id(fragment)) func(fragment, *args, **kwargs)
def wrapper(fragment, json_reference=None): if json_reference is None: json_reference = '{}#'.format(spec_resolver.resolution_scope) is_reference = is_ref(fragment) if is_reference: ref = fragment['$ref'] attach_scope(fragment, spec_resolver) with spec_resolver.resolving(ref) as target: if id(target) in cache: log.debug('Already visited %s', ref) return json_reference = spec_resolver.resolution_scope if '#' not in json_reference: # If $ref points to a file make sure that the fragment sign is present json_reference = '{}#'.format(json_reference) func( fragment=target, json_reference=json_reference, ) return # fragment is guaranteed not to be a ref from this point onwards fragment_id = id(fragment) if fragment_id in cache: log.debug('Already visited id %d', fragment_id) return cache.add(id(fragment)) func( fragment=fragment, json_reference=json_reference, )
def descend(fragment, path=None, visited_refs=None): """ :param fragment: node in spec_dict :param path: list of strings that form the current path to fragment :param visited_refs: list of visted ref_dict """ path = path or [] visited_refs = visited_refs or [] if is_ref(fragment): ref_dict = fragment ref = fragment['$ref'] attach_scope(ref_dict, resolver) # Don't recurse down already visited refs. A ref is not unique # by its name alone. Its scope (attached above) is part of the # equivalence comparison. if ref_dict in visited_refs: log.debug('Already visited %s' % ref) return visited_refs.append(ref_dict) with resolver.resolving(ref) as target: descend(target, path, visited_refs) return # fragment is guaranteed not to be a ref from this point onwards if is_dict_like(fragment): for key, value in iteritems(fragment): fire_callbacks(fragment, key, path + [key]) descend(fragment[key], path + [key], visited_refs) elif is_list_like(fragment): for index in range(len(fragment)): fire_callbacks(fragment, index, path + [str(index)]) descend(fragment[index], path + [str(index)], visited_refs)