class StableMatching::Validator

Public Class Methods

new(preference_table) click to toggle source
# File lib/stable-matching/validator.rb, line 12
def initialize(preference_table)
  @preference_table = preference_table
end
validate!(preference_table) click to toggle source
# File lib/stable-matching/validator.rb, line 8
def self.validate!(preference_table)
  new(preference_table).validate!
end

Private Instance Methods

empty?() click to toggle source
# File lib/stable-matching/validator.rb, line 33
def empty?
  return true if @preference_table.empty?

  @preference_table.each_value.any?(&:empty?)
end
even_sized?() click to toggle source
# File lib/stable-matching/validator.rb, line 58
def even_sized?
  @preference_table.keys.size.even?
end
handle_empty() click to toggle source
# File lib/stable-matching/validator.rb, line 39
def handle_empty
  @error = "Preferences table can not empty"
end
handle_not_even_sized() click to toggle source
# File lib/stable-matching/validator.rb, line 62
def handle_not_even_sized
  @error = "Preference table must have an even number of keys"
end
handle_not_hash_of_arrays() click to toggle source
# File lib/stable-matching/validator.rb, line 29
def handle_not_hash_of_arrays
  @error = "Expecting a preference table hash of arrays"
end
handle_not_strings_or_integers() click to toggle source
# File lib/stable-matching/validator.rb, line 54
def handle_not_strings_or_integers
  @error = "All keys must be String or Integer"
end
handle_not_symmetrical() click to toggle source
# File lib/stable-matching/validator.rb, line 82
def handle_not_symmetrical
  @error = "Entry #{@name} has invalid preferences. "\
    "The extra members are: #{@extra}. "\
    "The missing members are: #{@missing}"
end
hash_of_arrays?() click to toggle source

@abstract Subclass is expected to implement validate! @!method validate!

Validate the structure and content of the `preference_table`
# File lib/stable-matching/validator.rb, line 22
def hash_of_arrays?
  return false unless @preference_table.is_a?(Hash)
  @preference_table.values.each { |p| return false unless p.is_a?(Array) }

  true
end
strings_or_integers?() click to toggle source
# File lib/stable-matching/validator.rb, line 43
def strings_or_integers?
  @preference_table.each do |key, array|
    @member_klass ||= key.class

    return false unless valid_member?(key)
    array.each { |value| return false unless valid_member?(value) }
  end

  true
end
symmetrical?() click to toggle source
# File lib/stable-matching/validator.rb, line 66
def symmetrical?
  @preference_table.each do |name, preference_list|
    expected_members = @preference_table.keys - [name]
    actual_members = preference_list

    next if expected_members.sort == actual_members.sort

    @name = name
    @extra = actual_members - expected_members
    @missing = expected_members - actual_members
    return false
  end

  true
end
valid_member?(member) click to toggle source
# File lib/stable-matching/validator.rb, line 88
def valid_member?(member)
  (member.is_a?(String) || member.is_a?(Integer)) &&
    member.class == @member_klass
end