class DesignByContract::Signature

Attributes

method_args_specs[R]

Public Class Methods

new(raw_method_specs) click to toggle source
# File lib/design_by_contract/signature.rb, line 4
def initialize(raw_method_specs)
  @method_args_specs = raw_method_specs.map do |spec|
    DesignByContract::Signature::Spec.new(spec)
  end
end

Public Instance Methods

==(oth_signature) click to toggle source
# File lib/design_by_contract/signature.rb, line 21
def ==(oth_signature)
  return false unless method_args_specs.length == oth_signature.method_args_specs.length

  method_args_specs.each_with_index do |spec, index|
    return false unless spec == oth_signature.method_args_specs[index]
  end

  true
end
empty?() click to toggle source
# File lib/design_by_contract/signature.rb, line 31
def empty?
  method_args_specs.empty?
end
match?(parametered_object) click to toggle source
# File lib/design_by_contract/signature.rb, line 17
def match?(parametered_object)
  parameters_match?(parametered_object.parameters)
end
raw() click to toggle source
# File lib/design_by_contract/signature.rb, line 35
def raw
  @method_args_specs.map(&:raw)
end
valid?(*args) click to toggle source
# File lib/design_by_contract/signature.rb, line 10
def valid?(*args)
  method_args_specs.each_with_index do |spec, index|
    return false unless spec.interface.fulfilled_by?(args[index])
  end
  return true
end

Private Instance Methods

arg_counts_for(parameters, type) click to toggle source
# File lib/design_by_contract/signature.rb, line 95
def arg_counts_for(parameters, type)
  expected_req_count = method_args_specs.select { |s| s.type == type }.length
  actual_req_count = parameters.map(&:first).select { |v| v == type }.length
  [expected_req_count, actual_req_count]
end
key_match?(parameters) click to toggle source
# File lib/design_by_contract/signature.rb, line 60
def key_match?(parameters)
  optional_keywords = method_args_specs.select { |s| s.type == :key }.map(&:keyword)

  return true if optional_keywords.empty?
  actual_keys = parameters.select { |k, _| k == :key }.map { |arg_spec| arg_spec[1] }
  (optional_keywords - actual_keys).empty?
end
keyreq_match?(parameters) click to toggle source
# File lib/design_by_contract/signature.rb, line 68
def keyreq_match?(parameters)
  expected_keys = method_args_specs.select { |s| s.type == :keyreq }.map { |s| [s.type, s.keyword] }.sort

  return true if expected_keys.empty?
  actual_keys = parameters.select { |k, _| k == :keyreq }.sort
  expected_keys == actual_keys
end
keyrest_match?(parameters) click to toggle source
# File lib/design_by_contract/signature.rb, line 54
def keyrest_match?(parameters)
  return true unless @method_args_specs.any? { |s| s.type == :keyrest }

  parameters.any? { |k, _| k == :keyrest }
end
opt_match?(parameters) click to toggle source
# File lib/design_by_contract/signature.rb, line 83
def opt_match?(parameters)
  expected, actually = arg_counts_for(parameters, :opt)
  return true if expected.zero?
  expected <= actually
end
parameters_match?(parameters) click to toggle source
# File lib/design_by_contract/signature.rb, line 45
def parameters_match?(parameters)
  req_match?(parameters) &&
    opt_match?(parameters) &&
    rest_match?(parameters) &&
    keyreq_match?(parameters) &&
    key_match?(parameters) &&
    keyrest_match?(parameters)
end
req_match?(parameters) click to toggle source
# File lib/design_by_contract/signature.rb, line 76
def req_match?(parameters)
  expected_req, actually_req = arg_counts_for(parameters, :req)
  expected_opt, actually_opt = arg_counts_for(parameters, :opt)
  return true if expected_req.zero?
  expected_req <= actually_req + actually_opt && actually_req <= expected_req
end
rest_match?(parameters) click to toggle source
# File lib/design_by_contract/signature.rb, line 89
def rest_match?(parameters)
  return true unless method_args_specs.any? { |s| s.type == :rest }

  parameters.any? { |k, _| k == :rest }
end