module Strain module SchemaTools class Defaults def initialize(schema_hash, data_hash) @schema = schema_hash @data = data_hash end def default_values raise "Invalid schema." unless @schema["type"] == "object" && @schema.has_key?("properties") property_defaults(@schema["properties"]) end def data_with_defaults merge_defaults(@data, default_values) end private def property_defaults(properties_hash) properties_hash.each_with_object({}) do | (prop_name, prop_schema), memo | if prop_schema["type"] === "object" && prop_schema.has_key?("default") memo[prop_name] = prop_schema["default"] end if prop_schema["type"] === "object" && prop_schema.has_key?("properties") extracted_defaults = property_defaults(prop_schema["properties"]) memo[prop_name] = extracted_defaults unless extracted_defaults.empty? elsif prop_schema.has_key?("default") memo[prop_name] = prop_schema["default"] end end end def merge_defaults(data, defaults) data.merge(defaults) do | key, data_value, default_value | if data_value.is_a? Hash merge_defaults(data_value, default_value) elsif [nil, "", []].include?(data_value) default_value else data_value end end end end end end