class JsonRefs::Dereferencer

Public Class Methods

new(doc, options = {}) click to toggle source
# File lib/json_refs.rb, line 14
def initialize(doc, options = {})
  @doc = doc
  @options = options
end

Public Instance Methods

call(doc = @doc, keys = []) click to toggle source
# File lib/json_refs.rb, line 19
def call(doc = @doc, keys = [])
  if doc.is_a?(Array)
    doc.each_with_index do |value, idx|
      call(value, keys + [idx])
    end
  elsif doc.is_a?(Hash)
    if doc.has_key?('$ref')
      dereference(keys, doc['$ref'])
    else
      doc.each do |key, value|
        call(value, keys + [key])
      end
    end
  end
  doc
end

Private Instance Methods

dereference(paths, referenced_path) click to toggle source
# File lib/json_refs.rb, line 38
def dereference(paths, referenced_path)
  key = paths.pop
  target = paths.inject(@doc) do |obj, key|
    obj[key]
  end
  value = follow_referenced_value(referenced_path)
  target[key] = value
end
dereference_file(referenced_path) click to toggle source
# File lib/json_refs.rb, line 80
def dereference_file(referenced_path)
  if @options[:resolve_file_ref] === false
    return { '$ref' => referenced_path }
  end

  klass = JsonRefs::DereferenceHandler::File

  # Checking for "://" in a URL like http://something.com so as to determine if it's a remote URL
  remote_uri = referenced_path =~ /:\/\//

  if remote_uri
    klass.new(path: referenced_path, doc: @doc).call
  else
    recursive_dereference(referenced_path, klass)
  end
end
dereference_local(referenced_path) click to toggle source
# File lib/json_refs.rb, line 71
def dereference_local(referenced_path)
  if @options[:resolve_local_ref] === false
    return { '$ref' => referenced_path }
  end

  klass = JsonRefs::DereferenceHandler::Local
  klass.new(path: referenced_path, doc: @doc).call
end
follow_referenced_value(referenced_path) click to toggle source
# File lib/json_refs.rb, line 47
def follow_referenced_value(referenced_path)
  value = referenced_value(referenced_path)
  return referenced_value(value['$ref']) if value.is_a?(Hash) && value.has_key?('$ref')
  value
end
recursive_dereference(referenced_path, klass) click to toggle source
# File lib/json_refs.rb, line 97
def recursive_dereference(referenced_path, klass)
  directory = File.dirname(referenced_path)
  filename = File.basename(referenced_path)

  dereferenced_doc = {}
  Dir.chdir(directory) do
    referenced_doc = klass.new(path: filename, doc: @doc).call
    dereferenced_doc = Dereferencer.new(referenced_doc, @options).call
  end
  dereferenced_doc
end
referenced_value(referenced_path) click to toggle source
# File lib/json_refs.rb, line 53
def referenced_value(referenced_path)
  if @options[:logging] == true
    puts "De-referencing #{referenced_path}"
  end

  filepath, pointer = referenced_path.split('#')
  pointer.prepend('#') if pointer
  return dereference_local(pointer) if filepath.empty?

  dereferenced_file = dereference_file(filepath)
  return dereferenced_file if pointer.nil?

  JsonRefs::DereferenceHandler::Local.new(
    doc: dereferenced_file,
    path: pointer
  ).call
end