Class: Blufin::Validate

Inherits:
Object
  • Object
show all
Defined in:
lib/core/validate.rb

Class Method Summary collapse

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.

Returns:

  • null - If errors, will raise exception.

Raises:

  • (RuntimeError)


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