Sha256: 65e26316626e866479ae274bec523152801641736238b467f7d744cd1e72320a

Contents?: true

Size: 1.47 KB

Versions: 2

Compression:

Stored size: 1.47 KB

Contents

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

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
strain-0.0.2 lib/strain/schema_tools/defaults.rb
strain-0.0.1 lib/strain/schema_tools/defaults.rb