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