class RSpec::Support::MethodSignature

Extracts info about the number of arguments and allowed/required keyword args of a given method.

@private

Constants

INFINITY

Attributes

max_non_kw_args[R]
min_non_kw_args[R]

Public Class Methods

new(method) click to toggle source
# File lib/rspec/support/method_signature_verifier.rb, line 13
def initialize(method)
  @method = method
  classify_parameters
end

Public Instance Methods

classify_parameters() click to toggle source
# File lib/rspec/support/method_signature_verifier.rb, line 67
def classify_parameters
  optional_non_kw_args = @min_non_kw_args = 0
  @optional_kw_args, @required_kw_args = [], []
  @allows_any_kw_args = false

  @method.parameters.each do |(type, name)|
    case type
      # def foo(a:)
      when :keyreq  then @required_kw_args << name
      # def foo(a: 1)
      when :key     then @optional_kw_args << name
      # def foo(**kw_args)
      when :keyrest then @allows_any_kw_args = true
      # def foo(a)
      when :req     then @min_non_kw_args += 1
      # def foo(a = 1)
      when :opt     then optional_non_kw_args += 1
      # def foo(*a)
      when :rest    then optional_non_kw_args = INFINITY
    end
  end

  @max_non_kw_args = @min_non_kw_args  + optional_non_kw_args
  @allowed_kw_args = @required_kw_args + @optional_kw_args
end
description() click to toggle source
# File lib/rspec/support/method_signature_verifier.rb, line 27
def description
  @description ||= begin
    parts = []

    unless non_kw_args_arity_description == "0"
      parts << "arity of #{non_kw_args_arity_description}"
    end

    if @optional_kw_args.any?
      parts << "optional keyword args (#{@optional_kw_args.map(&:inspect).join(", ")})"
    end

    if @required_kw_args.any?
      parts << "required keyword args (#{@required_kw_args.map(&:inspect).join(", ")})"
    end

    if @allows_any_kw_args
      parts << "any additional keyword args"
    end

    parts.join(" and ")
  end
end
has_kw_args_in?(args) click to toggle source
# File lib/rspec/support/method_signature_verifier.rb, line 60
def has_kw_args_in?(args)
  return false unless Hash === args.last
  return false if args.count <= min_non_kw_args

  @allows_any_kw_args || @allowed_kw_args.any?
end
invalid_kw_args_from(given_kw_args) click to toggle source
# File lib/rspec/support/method_signature_verifier.rb, line 55
def invalid_kw_args_from(given_kw_args)
  return [] if @allows_any_kw_args
  given_kw_args - @allowed_kw_args
end
missing_kw_args_from(given_kw_args) click to toggle source
# File lib/rspec/support/method_signature_verifier.rb, line 51
def missing_kw_args_from(given_kw_args)
  @required_kw_args - given_kw_args
end
non_kw_args_arity_description() click to toggle source
# File lib/rspec/support/method_signature_verifier.rb, line 18
def non_kw_args_arity_description
  case max_non_kw_args
    when min_non_kw_args then min_non_kw_args.to_s
    when INFINITY then "#{min_non_kw_args} or more"
    else "#{min_non_kw_args} to #{max_non_kw_args}"
  end
end