Class: Blufin::Validate
- Inherits:
-
Object
- Object
- Blufin::Validate
- Defined in:
- lib/core/validate.rb
Class Method Summary collapse
-
.assert_valid_keys(expected, actual, description) ⇒ Object
Passing arguments as follows…
Class Method Details
.assert_valid_keys(expected, actual, description) ⇒ Object
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.
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# 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 |