Sha256: ba90bae03395cae749deaf3b4193a34b18083ce5a1b77b57b0bc13949f3cbc96

Contents?: true

Size: 1.25 KB

Versions: 22

Compression:

Stored size: 1.25 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)
    end

    private

    def deeply_expand_refs(fragment)
      fragment = expand_refs(fragment)

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

    def expand_refs(fragment)
      if fragment.is_a?(Hash) && fragment.has_key?("$ref")
        ref = fragment["$ref"]

        if ref =~ /\Afile:/
          expand_file(ref)
        else
          expand_pointer(ref)
        end
      else
        fragment
      end
    end

    def expand_file(ref)
      relative_path = ref.split(":").last
      absolute_path = File.expand_path(File.join("..", relative_path), @path)

      Parser.resolve(absolute_path)
    end

    def expand_pointer(ref)
      pointer = OasParser::Pointer.new(ref)
      fragment = pointer.resolve(@content)

      expand_refs(fragment)
    end
  end
end

Version data entries

22 entries across 22 versions & 1 rubygems

Version Path
oas_parser-0.15.2 lib/oas_parser/parser.rb
oas_parser-0.15.1 lib/oas_parser/parser.rb
oas_parser-0.15.0 lib/oas_parser/parser.rb
oas_parser-0.14.0 lib/oas_parser/parser.rb
oas_parser-0.13.1 lib/oas_parser/parser.rb
oas_parser-0.12.0 lib/oas_parser/parser.rb
oas_parser-0.11.2 lib/oas_parser/parser.rb
oas_parser-0.11.1 lib/oas_parser/parser.rb
oas_parser-0.11.0 lib/oas_parser/parser.rb
oas_parser-0.10.0 lib/oas_parser/parser.rb
oas_parser-0.9.0 lib/oas_parser/parser.rb
oas_parser-0.8.1 lib/oas_parser/parser.rb
oas_parser-0.8.0 lib/oas_parser/parser.rb
oas_parser-0.7.0 lib/oas_parser/parser.rb
oas_parser-0.6.0 lib/oas_parser/parser.rb
oas_parser-0.5.0 lib/oas_parser/parser.rb
oas_parser-0.4.0 lib/oas_parser/parser.rb
oas_parser-0.3.0 lib/oas_parser/parser.rb
oas_parser-0.2.0 lib/oas_parser/parser.rb
oas_parser-0.1.2 lib/oas_parser/parser.rb