class JSON::SchemaGenerator
Constants
- VERSION
Public Class Methods
generate(name, data, opts = {})
click to toggle source
# File lib/json/schema_generator.rb, line 8 def generate name, data, opts = {} JSON::SchemaGenerator.new(name, opts).generate data end
new(name, opts = {})
click to toggle source
# File lib/json/schema_generator.rb, line 13 def initialize name, opts = {} @defaults = opts[:defaults] @allow_null = opts[:allow_null] @buffer = StringIO.new @name = name end
Public Instance Methods
generate(raw_data)
click to toggle source
# File lib/json/schema_generator.rb, line 21 def generate raw_data data = JSON.load(raw_data) @brute_search = BruteForceRequiredSearch.new data statement_group = StatementGroup.new statement_group.add "\"$schema\": \"http://json-schema.org/draft4/schema#\"" statement_group.add "\"description\": \"Generated from json_schema_generator #rusteze\"" case data when Array $stop = true create_array(statement_group, data, detect_required(data)) else create_hash(statement_group, data, detect_required(data)) end @buffer.puts statement_group result end
Protected Instance Methods
create_array(statement_group, data, required_keys)
click to toggle source
# File lib/json/schema_generator.rb, line 107 def create_array(statement_group, data, required_keys) statement_group.add '"type": "array"' # FIXME - Code assumes that all items in the array have the same structure # Assume lowest common denominator - allow 0 items and unique not required statement_group.add '"minItems": 0' # TODO - consider a eq? method for StatementGroup class to evaluate LCD schema from all items in array statement_group.add create_values("items", data.first, required_keys, true) statement_group end
create_hash(statement_group, data, required_keys)
click to toggle source
# File lib/json/schema_generator.rb, line 88 def create_hash(statement_group, data, required_keys) statement_group.add '"type": "object"' required_keys ||= [] required_string = required_keys.map(&:inspect).join ', ' statement_group.add "\"required\": [#{required_string}]" unless required_keys.empty? statement_group.add create_hash_properties data, required_keys statement_group end
create_hash_properties(data, required_keys)
click to toggle source
# File lib/json/schema_generator.rb, line 97 def create_hash_properties(data, required_keys) statement_group = StatementGroup.new "properties" data.collect do |k,v| @brute_search.push k,v statement_group.add create_values k, v, required_keys @brute_search.pop end statement_group end
create_primitive(statement_group, key, value, required_keys)
click to toggle source
# File lib/json/schema_generator.rb, line 41 def create_primitive(statement_group, key, value, required_keys) if required_keys.nil? required = true else required = required_keys.include? key end type = case value when TrueClass, FalseClass "boolean" when String "string" when Integer, Float "number" else raise "Unknown Primitive Type for #{key}! #{value.class}" end if @allow_null statement_group.add "\"type\": #{[type, "null"]}" else statement_group.add "\"type\": \"#{type}\"" end # statement_group.add "\"oneOf\": [{\"type\": \"#{type}\"}, {\"type\": \"null\"}]" statement_group.add "\"default\": #{value.inspect}" if @defaults end
create_values(key, value, required_keys = nil, in_array = false)
click to toggle source
# File lib/json/schema_generator.rb, line 68 def create_values(key, value, required_keys = nil, in_array = false) statement_group = StatementGroup.new key case value when NilClass when TrueClass, FalseClass, String, Integer, Float create_primitive(statement_group, key, value, required_keys) when Array create_array(statement_group, value, detect_required(value)) when Hash if in_array create_hash(statement_group, value, required_keys) else create_hash(statement_group, value, detect_required(value)) end else raise "Unknown Type for #{key}! #{value.class}" end statement_group end
detect_required(collection)
click to toggle source
# File lib/json/schema_generator.rb, line 120 def detect_required(collection) @brute_search.find_required rescue NoMethodError collection.keys if collection.respond_to?(:keys) end
result()
click to toggle source
# File lib/json/schema_generator.rb, line 126 def result @buffer.string end