class Jekyll::JsonSchemaCompiler

Public Instance Methods

compile(obj, obj_name=nil) click to toggle source
# File lib/utils.rb, line 105
def compile(obj, obj_name=nil)
  if obj.is_a?(Array)
    obj.map!{|method| compile(method)}
  elsif obj.is_a?(Hash)
    if obj.include?('schema') and obj_name == 'application/json'
      schema_hash = JSON.parse(obj['schema']) 
      schema_hash = traverse_and_compile_schema(schema_hash)
      obj['schema'] = JSON.pretty_generate(schema_hash)
    end
    
    obj.each { |k, v| obj[k] = compile(v, k)}
  end

  obj
end

Private Instance Methods

traverse_and_compile_schema(schema_hash) click to toggle source
# File lib/utils.rb, line 122
def traverse_and_compile_schema(schema_hash)
  if schema_hash.is_a?(Array)
    schema_hash.map!{|method| traverse_and_compile_schema(method)}
  elsif schema_hash.is_a?(Hash)
    if schema_hash.include?('$ref')
      refed = JSON.parse(File.read(schema_hash['$ref']))
      schema_hash.delete('$ref')
      schema_hash.merge!(refed)
    end

    schema_hash.each { |k, v| schema_hash[k] = traverse_and_compile_schema(v)}

    # Merge allOfs into the parent object
    if schema_hash.include?('allOf')
      for item in schema_hash['allOf']
        merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
        schema_hash.merge!(item, &merger)
      end
      schema_hash.delete('allOf')
    end
  end
  schema_hash 
end