class JsonTestData::JsonSchema

Attributes

handler[RW]
schema[RW]

Public Class Methods

new(schema, handler = nil) click to toggle source
# File lib/json_test_data/json_schema.rb, line 8
def initialize(schema, handler = nil)
  @schema = JSON.parse(schema, symbolize_names: true)
  @handler = handler
end

Public Instance Methods

generate_example() click to toggle source
# File lib/json_test_data/json_schema.rb, line 13
def generate_example
  generate(schema).to_json
end

Private Instance Methods

generate(obj, key = nil) click to toggle source
# File lib/json_test_data/json_schema.rb, line 33
def generate(obj, key = nil)
  if is_object?(obj)
    generate_object(obj)
  elsif is_array?(obj)
    generate_array(obj)
  else
    generate_data(obj, key)
  end
end
generate_array(object) click to toggle source
# File lib/json_test_data/json_schema.rb, line 90
def generate_array(object)
  object.fetch(:minItems, nil) || object[:minItems] = 1

  if object.fetch(:items, nil) && object.fetch(:items).has_key?(:type)
    Array.new(object.fetch(:minItems)).map { generate(object.fetch(:items)) }
  else
    Array.new(object.fetch(:minItems))
  end
end
generate_data(obj, key) click to toggle source
# File lib/json_test_data/json_schema.rb, line 18
def generate_data(obj, key)
  return handler.get_data(key, obj) if handler && handler.manages_key?(key)

  case obj.fetch(:type)
  when "number"
    JsonTestData::Number.create(obj)
  when "integer"
    JsonTestData::Number.create(obj)
  when "boolean"
    true
  when "string"
    JsonTestData::String.create(obj)
  end
end
generate_object(object) click to toggle source
# File lib/json_test_data/json_schema.rb, line 61
def generate_object(object)
  obj = {}

  if object.has_key?(:oneOf)
    schema_to_be_used = object.fetch(:oneOf).sample
    object = set_object(object, schema_to_be_used)
  end

  if object.has_key?(:properties)
    object.fetch(:properties).each do |k, v|
      unless v.has_key?(:type)
        obj[k]  = nil
        next
      end

      obj[k]  = generate(v, k)
    end
  end

  if object.has_key?(:minProperties) && obj.length < object.fetch(:minProperties, 0)
    (object.fetch(:minProperties) - obj.length).times do
      key = JsonTestData::String.create({type: "string"})
      obj[key] = nil
    end
  end

  obj.size == 0 ? {} : obj
end
is_array?(property) click to toggle source
# File lib/json_test_data/json_schema.rb, line 47
def is_array?(property)
  property.fetch(:type, nil) == "array"
end
is_object?(property) click to toggle source
# File lib/json_test_data/json_schema.rb, line 43
def is_object?(property)
  property.fetch(:type, nil) == "object"
end
resolve_ref(object, ref) click to toggle source
# File lib/json_test_data/json_schema.rb, line 51
def resolve_ref(object, ref)
  ref = ref.split("/").map(&:to_sym)[1..-1]
  ref.each {|key| object = object.fetch(key) }
  object
end
set_object(obj, schema) click to toggle source
# File lib/json_test_data/json_schema.rb, line 57
def set_object(obj, schema)
  schema.has_key?(:"$ref") ? resolve_ref(obj, schema.fetch(:"$ref")) : schema
end