Sha256: 176bba16c4125158aa498083cc2bac9d7d62981e2c8a0649baf92c39aa9b00a0

Contents?: true

Size: 1.86 KB

Versions: 15

Compression:

Stored size: 1.86 KB

Contents

module OasParser
  class Parser
    def self.resolve(path)
      content = YAML.load_file(path)
      Parser.new(path, content).resolve
    end

    def initialize(path, content)
      @path = path
      @content = content
    end

    def resolve
      deeply_expand_refs(@content, nil)
    end

    private

    def deeply_expand_refs(fragment, path)
      fragment, current_path = expand_refs(fragment, path)

      if fragment.is_a?(Hash)
        fragment.reduce({}) do |hash, (k, v)|
          hash.merge(k => deeply_expand_refs(v, "#{current_path}/#{k}"))
        end
      elsif fragment.is_a?(Array)
        fragment.map { |e| deeply_expand_refs(e, current_path) }
      else
        fragment
      end
    end

    def expand_refs(fragment, current_path)
      unless fragment.is_a?(Hash) && fragment.key?("$ref")
        return [fragment, current_path]
      end

      ref = fragment["$ref"]

      if ref =~ /^#/
        expand_pointer(ref, current_path)
      elsif ref =~ /^(http(s)?|\/\/)/
        expand_url(ref)
      else
        expand_file(ref)
      end
    end

    def expand_file(ref)
      absolute_path = File.expand_path(File.join("..", ref), @path)
      absolute_path, local_reference = absolute_path.split('#')
      resolved_remote_reference = Parser.resolve(absolute_path)

      if local_reference
        pointer = OasParser::Pointer.new(local_reference)
        return pointer.resolve(resolved_remote_reference)
      end

      resolved_remote_reference
    end

    def expand_pointer(ref, current_path)
      pointer = OasParser::Pointer.new(ref)

      if pointer.circular_reference?(current_path)
        { "$ref" => ref }
      else
        fragment = pointer.resolve(@content)
        expand_refs(fragment, current_path + pointer.escaped_pointer)
      end
    end

    def expand_url(ref)
      raise 'Expanding URL References is not supported'
    end
  end
end

Version data entries

15 entries across 15 versions & 2 rubygems

Version Path
oas_parser_reborn-0.25.5 lib/oas_parser_reborn/parser.rb
oas_parser-0.25.4 lib/oas_parser/parser.rb
oas_parser-0.25.3 lib/oas_parser/parser.rb
oas_parser-0.25.1 lib/oas_parser/parser.rb
oas_parser-0.25.0 lib/oas_parser/parser.rb
oas_parser-0.24.0 lib/oas_parser/parser.rb
oas_parser-0.23.0 lib/oas_parser/parser.rb
oas_parser-0.22.4 lib/oas_parser/parser.rb
oas_parser-0.22.2 lib/oas_parser/parser.rb
oas_parser-0.22.1 lib/oas_parser/parser.rb
oas_parser-0.22.0 lib/oas_parser/parser.rb
oas_parser-0.21.1 lib/oas_parser/parser.rb
oas_parser-0.21.0 lib/oas_parser/parser.rb
oas_parser-0.20.0 lib/oas_parser/parser.rb
oas_parser-0.19.0 lib/oas_parser/parser.rb