class Uptyped::InterfaceValidator

Attributes

class_method_arity_errors[R]
instance_method_arity_errors[R]
public_class_method_errors[R]
public_instance_method_errors[R]

Public Class Methods

new(klass) click to toggle source
# File lib/uptyped/interface_validator.rb, line 4
def initialize(klass)
  @validated_class = klass
  @public_instance_method_errors = []
  @public_class_method_errors = []
  @instance_method_arity_errors = []
  @class_method_arity_errors = []
  check_for_extra_subclass_instance_methods
  check_for_extra_subclass_class_methods
  check_instance_methods_for_arity_mismatches
  check_class_methods_for_arity_mismatches
end

Public Instance Methods

success?() click to toggle source
# File lib/uptyped/interface_validator.rb, line 16
def success?
  (public_instance_method_errors + public_class_method_errors + instance_method_arity_errors + class_method_arity_errors).empty?
end

Private Instance Methods

check_class_methods_for_arity_mismatches() click to toggle source
# File lib/uptyped/interface_validator.rb, line 56
def check_class_methods_for_arity_mismatches
  (validated_class.superclass.methods - validated_class.superclass.superclass.methods).each do |method|
    klass_arity = validated_class.method(method).arity
    superklass_arity = validated_class.superclass.method(method).arity

    unless klass_arity == superklass_arity
      error_message = "#{validated_class}.#{method.to_s} takes #{klass_arity} argument(s) while #{validated_class.superclass}.#{method.to_s} takes #{superklass_arity} argument(s)."
      @class_method_arity_errors << error_message
    end
  end
end
check_for_extra_subclass_class_methods() click to toggle source
# File lib/uptyped/interface_validator.rb, line 34
def check_for_extra_subclass_class_methods
  local_public_methods = validated_class.methods
  superclass_public_methods = validated_class.superclass.methods
  extra_public_methods = local_public_methods - superclass_public_methods
  unless extra_public_methods.empty?
    error_message = "expected #{validated_class} to have the same public class methods as #{validated_class.superclass}, got #{extra_public_methods}."
    @public_class_method_errors << error_message
  end
end
check_for_extra_subclass_instance_methods() click to toggle source
# File lib/uptyped/interface_validator.rb, line 26
def check_for_extra_subclass_instance_methods
  extra_instance_methods = validated_class.instance_methods - validated_class.superclass.instance_methods
  unless extra_instance_methods.empty?
    error_message = "expected #{validated_class} to have the same public instance methods as #{validated_class.superclass}, got #{extra_instance_methods}."
    @public_instance_method_errors << error_message
  end
end
check_instance_methods_for_arity_mismatches() click to toggle source
# File lib/uptyped/interface_validator.rb, line 44
def check_instance_methods_for_arity_mismatches
  (validated_class.superclass.instance_methods - validated_class.superclass.superclass.instance_methods).push(:initialize).each do |method|
    klass_arity = validated_class.instance_method(method).arity
    superklass_arity = validated_class.superclass.instance_method(method).arity

    unless klass_arity == superklass_arity
      error_message = "#{validated_class}##{method.to_s} takes #{klass_arity} argument(s) while #{validated_class.superclass}##{method.to_s} takes #{superklass_arity} argument(s)."
      instance_method_arity_errors << error_message
    end
  end
end
validated_class() click to toggle source
# File lib/uptyped/interface_validator.rb, line 22
def validated_class
  @validated_class
end