class Argo::SchemaFactory

Constants

NON_SUBSCHEMA_PROPERTIES

Public Class Methods

new(dereferencer) click to toggle source
# File lib/argo/schema_factory.rb, line 9
def initialize(dereferencer)
  @dereferencer = dereferencer
end

Public Instance Methods

build(subgraph, route = []) click to toggle source
# File lib/argo/schema_factory.rb, line 15
def build(subgraph, route = [])
  Schema.new(
    description: extract_one(subgraph, :description),
    title: extract_one(subgraph, :title),
    schemas: subschemas(subgraph, route),
    type: type(subgraph),
    properties: properties(subgraph),
    spec: extract_one(subgraph, :$schema),
    route: route
  )
end
element_kind(key) click to toggle source
# File lib/argo/schema_factory.rb, line 39
def element_kind(key)
  NON_SUBSCHEMA_PROPERTIES.include?(key) ? key.to_sym : :subschema
end
extract(subgraph, kind) click to toggle source
# File lib/argo/schema_factory.rb, line 43
def extract(subgraph, kind)
  subgraph.select { |k, _| element_kind(k) == kind }
end
extract_one(subgraph, kind, default: nil) click to toggle source
# File lib/argo/schema_factory.rb, line 47
def extract_one(subgraph, kind, default: nil)
  _, v = subgraph.find { |k, _| element_kind(k) == kind }
  v || default
end
properties(subgraph) click to toggle source
# File lib/argo/schema_factory.rb, line 61
def properties(subgraph)
  required_fields = extract_one(subgraph, :required, default: [])
  factory = PropertyFactory.new(@dereferencer, required_fields)
  extract_one(subgraph, :properties, default: {}).
    map { |k, v|
      [k, reference?(v) ? dereference(v) : factory.build(v, name: k)]
    }.
    to_h
end
subschemas(subgraph, route) click to toggle source
# File lib/argo/schema_factory.rb, line 52
def subschemas(subgraph, route)
  extract(subgraph, :subschema).
    inject({}) { |h, (k, v)| h.merge(k => build(v, route + [k])) }
end
type(subgraph) click to toggle source
# File lib/argo/schema_factory.rb, line 57
def type(subgraph)
  extract_one(subgraph, :type, default: :object).to_sym
end