Sha256: 5bb21b0b63cb26ef50cfbaebb9b48e01bf156646ca6d61f816e955a636d74756

Contents?: true

Size: 1.45 KB

Versions: 3

Compression:

Stored size: 1.45 KB

Contents

module Swagger
  # Represents a Swagger Schema Object, a more deterministic subset of JSON Schema.
  # @see https://github.com/wordnik/swagger-spec/blob/master/versions/2.0.md#schema-object- Schema Object
  # @see http://json-schema.org/ JSON Schema
  class Schema < Hashie::Mash
    include Attachable
    include Hashie::Extensions::MergeInitializer
    include Hashie::Extensions::DeepFind
    attr_accessor :parent

    def initialize(hash, default = nil)
      super
      attach_to_children
    end

    def parse
      schema = clone
      if schema.key?('$ref')
        key = schema.delete('$ref')
        model = root.definitions[key]
        schema.merge!(model)
      end

      count = 0
      until schema.refs_resolved?
        fail 'Could not resolve non-remote $refs 5 cycles - circular references?' if count >= 5
        schema.resolve_refs
        count += 1
      end

      schema.to_hash
    end

    protected

    def refs
      deep_find_all('$ref')
    end

    def resolve_refs
      items_and_props = [deep_select('items'), deep_select('properties')].flatten.compact
      items_and_props.each do | item |
        key = item.delete('$ref')
        next if remote_ref? key
        model = root.definitions[key]
        item.merge!(model)
      end
    end

    def refs_resolved?
      return true if refs.nil?

      refs.all? do |ref|
        remote_ref?(ref)
      end
    end

    def remote_ref?(ref)
      ref.match(%r{\A\w+\://})
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
swagger-core-0.2.3 lib/swagger/schema.rb
swagger-core-0.2.2 lib/swagger/schema.rb
swagger-core-0.2.1 lib/swagger/schema.rb