class Blufin::Validate
Public Class Methods
assert_valid_keys(expected, actual, description)
click to toggle source
Passing arguments as follows…
@expected: { 'required_key' => true, 'optional_key' => false } @actual: %w(required_key non_existent_key)
@description: Hint of where the error occurred. @return null - If errors, will raise exception.
# File lib/core/validate.rb, line 10 def self.assert_valid_keys(expected, actual, description) raise RuntimeError, "Expected Hash, instead got: #{expected.class}" unless expected.is_a?(Hash) errors = [] required_keys = [] optional_keys = [] expected.each do |k, v| raise RuntimeError, "Expected value for #{k} to be boolean, instead got: #{v.class}" unless !!v == v required_keys << k if v optional_keys << k unless v end actual.each do |n| errors << "Unexpected Key: #{n}" unless required_keys.include?(n) || optional_keys.include?(n) required_keys.delete(n) if required_keys.include?(n) optional_keys.delete(n) if optional_keys.include?(n) end errors << "Missing required keys: #{required_keys.inspect}" unless required_keys.length == 0 if errors.length == 0 expected_key_order = [] expected.each do |k, v| expected_key_order << k if v expected_key_order << k if !v && actual.include?(k) end unless expected_key_order.to_s == actual.to_s errors << "Expected key order doesn't match:" errors << '' errors << " Expected: #{expected_key_order.inspect}" errors << " Actual: #{actual.inspect}" end end return unless errors.length > 0 # Output useful errors (hopefully). puts puts Blufin::Terminal::format_invalid(description) puts expected.to_yaml puts errors.each { |error| puts "\x1B[38;5;196m #{error}\x1B[0m" } raise RuntimeError, 'Keys are invalid, missing and/or not in the expected order.' end