class Xpect::Keys
Public Class Methods
new(required: {}, optional: {})
click to toggle source
# File lib/xpect/keys.rb, line 3 def initialize(required: {}, optional: {}) raise "required must be a Hash" unless required.is_a?(Hash) && optional.is_a?(Hash) @optional = optional @required = required end
Public Instance Methods
conform!(value:, path: [])
click to toggle source
# File lib/xpect/keys.rb, line 10 def conform!(value:, path: []) required = process_required(value, path) process_optional(required, value, path) end
Private Instance Methods
process_optional(init, value, path)
click to toggle source
# File lib/xpect/keys.rb, line 17 def process_optional(init, value, path) @optional.reduce(init) do |memo, (key, val)| if val.is_a?(Keys) memo[key] = val.conform!(value: value[key], path: path) else if value.has_key?(key) data_value = value.fetch(key) memo[key] = Xpect::Type.process(val, val, data_value, path) end end memo end end
process_required(value, path)
click to toggle source
# File lib/xpect/keys.rb, line 32 def process_required(value, path) @required.reduce({}) do |memo, (key, val)| if val.is_a?(Keys) memo[key] = val.conform!(value: value[key], path: path) else if value.has_key?(key) data_value = value.fetch(key) memo[key] = Xpect::Type.process(val, val, data_value, path) else if val.is_a?(Pred) && val.default memo[key] = val.default else raise FailedSpec, "does not include '#{ key }' at '#{ path }'" end end end memo end end