Extracts info about the number of arguments and allowed/required keyword args of a given method.
@private
# File lib/rspec/support/method_signature_verifier.rb, line 13 def initialize(method) @method = method classify_parameters end
# 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
# 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
# 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
# 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
# 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
# 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